Download raw body.
[update] comms/amtterm
Here's an update to the latest amtterm-1.7 release from 2022. It
drops most of the SSL/auth etc diffs backported from
https://github.com/Openwsman/wsmancli/
There's also a new tool called amtider (for floppy or CDROM
redirection) that might come in handy, it needed a few patches but I
haven't tested it. I've put this in the -term subpackage because it
doesn't have any dep, but I can move it back to -main.
I doubt this will change anything to the disconnections I get when
booting my T14 Gen 3 - will test that later.
Test reports & oks welcome.
Index: Makefile
===================================================================
RCS file: /home/cvs/ports/comms/amtterm/Makefile,v
diff -u -p -r1.18 Makefile
--- Makefile 31 Aug 2025 12:01:04 -0000 1.18
+++ Makefile 31 Aug 2025 20:40:01 -0000
@@ -1,8 +1,7 @@
COMMENT-term= cli client for Intel AMT serial-over-lan
COMMENT-main= client and tools for Intel AMT serial-over-lan
-V= 1.6
-REVISION= 3
+V= 1.7
DISTNAME= amtterm-$V
PKGNAME-term= amtterm-cli-$V
MULTI_PACKAGES= -main -term
@@ -19,7 +18,7 @@ WANTLIB += atk-1.0 c cairo cairo-gobject
WANTLIB += gio-2.0 glib-2.0 gobject-2.0 gtk-3 harfbuzz intl pango-1.0
WANTLIB += pangocairo-1.0 ssl vte-2.91
-# https://git.kraxel.org/cgit/amtterm/
+# https://github.com/kraxel/amtterm/
SITES= https://www.kraxel.org/releases/amtterm/
LIB_DEPENDS-term=
Index: distinfo
===================================================================
RCS file: /home/cvs/ports/comms/amtterm/distinfo,v
diff -u -p -r1.4 distinfo
--- distinfo 2 Nov 2020 16:10:23 -0000 1.4
+++ distinfo 31 Aug 2025 18:54:47 -0000
@@ -1,2 +1,2 @@
-SHA256 (amtterm-1.6.tar.gz) = EkLOpGeCeqHi6RtBhGIpygpbPz4JJgsN+deNyHUHVZA=
-SIZE (amtterm-1.6.tar.gz) = 40804
+SHA256 (amtterm-1.7.tar.gz) = jFi3azI3UE11G/NYj+8lEXJIoFaVI/DYber2ltFClNQ=
+SIZE (amtterm-1.7.tar.gz) = 54769
Index: patches/patch-GNUmakefile
===================================================================
RCS file: patches/patch-GNUmakefile
diff -N patches/patch-GNUmakefile
--- patches/patch-GNUmakefile 11 Mar 2022 18:26:24 -0000 1.2
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,42 +0,0 @@
-Add SSL/auth code
-https://github.com/Openwsman/wsmancli/issues/10#issuecomment-751253133
-
-Index: GNUmakefile
---- GNUmakefile.orig
-+++ GNUmakefile
-@@ -1,11 +1,24 @@
- # config
-+#USE_OPENSSL=1
-+#USE_GNUTLS=1
- srcdir = .
- VPATH = $(srcdir)
- -include Make.config
- include $(srcdir)/mk/Variables.mk
-
-+ifdef USE_OPENSSL
-+SSL_DEFS=-DUSE_OPENSSL
-+pkglst+=openssl
-+endif
-+
-+ifdef USE_GNUTLS
-+SSL_DEFS=-DUSE_GNUTLS
-+pkglst+=gnutls
-+endif
-+
- CFLAGS += -Wall -Wno-pointer-sign
- CFLAGS += -DVERSION='"$(VERSION)"'
-+CFLAGS += $(SSL_DEFS)
-
- TARGETS := amtterm
- DESKTOP := $(wildcard *.desktop)
-@@ -60,8 +73,8 @@ distclean: clean
-
- #################################################################
-
--amtterm: amtterm.o redir.o tcp.o
--gamt: gamt.o redir.o tcp.o parseconfig.o
-+amtterm: amtterm.o redir.o tcp.o auth.o ssl.o
-+gamt: gamt.o redir.o tcp.o parseconfig.o auth.o ssl.o
-
- #################################################################
-
Index: patches/patch-amtider_c
===================================================================
RCS file: patches/patch-amtider_c
diff -N patches/patch-amtider_c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-amtider_c 31 Aug 2025 19:24:45 -0000
@@ -0,0 +1,93 @@
+Replace Linux-only signalfd code with portable sigaction(2).
+
+Index: amtider.c
+--- amtider.c.orig
++++ amtider.c
+@@ -29,7 +29,6 @@
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <sys/ioctl.h>
+-#include <sys/signalfd.h>
+ #include <sys/mman.h>
+
+ #include "redir.h"
+@@ -63,29 +62,33 @@ static void state_ider(void *cb_data, enum redir_state
+ }
+ }
+
++static volatile sig_atomic_t got_signal;
++
++static void sighandler(int sig)
++{
++ got_signal = 1;
++}
++
+ static int redir_loop(struct redir *r)
+ {
+ struct timeval tv;
+ fd_set set;
+- sigset_t mask;
+- int max_fd = r->sock, sfd;
++ struct sigaction sa;
++ int max_fd = r->sock;
+ int interval = HEARTBEAT_INTERVAL * 4 / 1000;
+
+- sigemptyset(&mask);
+- sigaddset(&mask, SIGINT);
+- sigaddset(&mask, SIGQUIT);
+-
+- if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1) {
+- perror("sigprocmask");
++ memset(&sa, 0, sizeof sa);
++ sigemptyset(&sa.sa_mask);
++ sa.sa_handler = sighandler;
++ if (sigaction(SIGINT, &sa, NULL) == -1) {
++ perror("sigaction(SIGINT)");
+ exit(1);
+ }
+- sfd = signalfd(-1, &mask, 0);
+- if (sfd < 0) {
+- perror("signalfd");
++ if (sigaction(SIGQUIT, &sa, NULL) == -1) {
++ perror("sigaction(SIGQUIT)");
+ exit(1);
+ }
+
+-
+ for(;;) {
+ if (r->state == REDIR_CLOSED ||
+ r->state == REDIR_ERROR)
+@@ -93,16 +96,16 @@ static int redir_loop(struct redir *r)
+
+ FD_ZERO(&set);
+ FD_SET(r->sock, &set);
+- if (sfd > 0) {
+- FD_SET(sfd, &set);
+- max_fd = sfd > r->sock? sfd : r->sock;
+- }
++ max_fd = r->sock;
+ tv.tv_sec = interval;
+ tv.tv_usec = 0;
+ switch (select(max_fd+1,&set,NULL,NULL,&tv)) {
+ case -1:
+- perror("select");
+- return -1;
++ if (got_signal) {
++ perror("select");
++ return -1;
++ }
++ break;
+ case 0:
+ fprintf(stderr,"select: timeout\n");
+ return -1;
+@@ -112,9 +115,7 @@ static int redir_loop(struct redir *r)
+ if (-1 == redir_data(r))
+ return -1;
+ }
+- if (FD_ISSET(sfd, &set)) {
+- close(sfd);
+- sfd = -1;
++ if (got_signal) {
+ if (-1 == redir_ider_stop(r))
+ return -1;
+ interval = 2;
Index: patches/patch-amtterm_c
===================================================================
RCS file: patches/patch-amtterm_c
diff -N patches/patch-amtterm_c
--- patches/patch-amtterm_c 11 Mar 2022 18:26:24 -0000 1.2
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,49 +0,0 @@
-Add SSL/auth code
-https://github.com/Openwsman/wsmancli/issues/10#issuecomment-751253133
-
-Index: amtterm.c
---- amtterm.c.orig
-+++ amtterm.c
-@@ -179,10 +179,18 @@ static void usage(FILE *fp)
- " -h print this text\n"
- " -v verbose (default)\n"
- " -q quiet\n"
-+ " -L use legacy authentication\n"
-+#if defined(USE_OPENSSL) || defined(USE_GNUTLS)
-+ " -C cacert enable SSL and use PEM cacert file\n"
-+#endif
- " -u user username (default: admin)\n"
- " -p pass password (default: $AMT_PASSWORD)\n"
- "\n"
-+#if defined(USE_OPENSSL) || defined(USE_GNUTLS)
-+ "By default port 16994 (SSL: 16995) is used.\n"
-+#else
- "By default port 16994 is used.\n"
-+#endif
- "If no password is given " APPNAME " will ask for one.\n"
- "\n"
- "-- \n"
-@@ -209,7 +217,7 @@ int main(int argc, char *argv[])
- snprintf(r.pass, sizeof(r.pass), "%s", h);
-
- for (;;) {
-- if (-1 == (c = getopt(argc, argv, "hvqu:p:")))
-+ if (-1 == (c = getopt(argc, argv, "hvqu:p:LC:")))
- break;
- switch (c) {
- case 'v':
-@@ -225,6 +233,14 @@ int main(int argc, char *argv[])
- snprintf(r.pass, sizeof(r.pass), "%s", optarg);
- memset(optarg,'*',strlen(optarg)); /* rm passwd from ps list */
- break;
-+ case 'L':
-+ r.legacy = 1;
-+ break;
-+#if defined(USE_OPENSSL) || defined(USE_GNUTLS)
-+ case 'C':
-+ r.cacert = optarg;
-+ break;
-+#endif
-
- case 'h':
- usage(stdout);
Index: patches/patch-amtterm_man
===================================================================
RCS file: patches/patch-amtterm_man
diff -N patches/patch-amtterm_man
--- patches/patch-amtterm_man 11 Mar 2022 18:26:24 -0000 1.2
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,23 +0,0 @@
-From 8617629bbd9e084dc70d7d418bc6928293d1b44f Mon Sep 17 00:00:00 2001
-From: Gerd Hoffmann <kraxel@redhat.com>
-Date: Tue, 28 Apr 2020 13:30:11 +0200
-Subject: add note for newer machines to amtterm manpage
-
-(openbsd doesn't have wsman in packages, but might be a useful hint for
-someone..)
-
-Index: amtterm.man
---- amtterm.man.orig
-+++ amtterm.man
-@@ -37,6 +37,11 @@ will prompt on the terminal if unspecified.
- .TP
- .B AMT_PASSWORD
- Default value for the password.
-+.SH NOTE
-+Newer AMT machines have the SoL port disabled by default, it can be
-+enabled remotely using:
-+"wsman put http://intel.com/wbem/wscim/1/amt-schema/1/AMT_RedirectionService
-+-h ${AMT_HOST} -P 16992 -u admin -p ${AMT_PASSWORD} -k ListenerEnabled=true"
- .SH SEE ALSO
- gamt(1), amttool(1), amt-howto(7)
- .SH AUTHOR
Index: patches/patch-auth_c
===================================================================
RCS file: patches/patch-auth_c
diff -N patches/patch-auth_c
--- patches/patch-auth_c 11 Mar 2022 18:26:24 -0000 1.2
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,833 +0,0 @@
-Add SSL/auth code
-https://github.com/Openwsman/wsmancli/issues/10#issuecomment-751253133
-
-Index: auth.c
---- auth.c.orig
-+++ auth.c
-@@ -0,0 +1,826 @@
-+/*
-+ * Authentication helper functions.
-+ *
-+ * Copyright (C) 2014 Andreas Steinmetz <ast@domdv.de>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along
-+ * with this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-+ */
-+
-+#include <string.h>
-+#include <stdint.h>
-+#include "auth.h"
-+
-+#define MD5_SIZE 16
-+#define MD5_HEX (MD5_SIZE<<1)
-+#define MD5(a) uint8_t a[MD5_SIZE]
-+
-+#define AUTH_SESS 0x13
-+#define AUTH_SESS_REPLY 0x14
-+
-+#define AUTH_SUCCESS 0x00
-+#define AUTH_FAIL 0x01
-+
-+#define TYPE_METHODS 0x00
-+#define TYPE_PLAIN 0x01
-+#define TYPE_RFC2069 0x03
-+#define TYPE_RFC2617 0x04
-+
-+#define MAX_USER 32
-+#define MAX_PASS 32
-+#define MAX_REALM 64
-+#define MAX_NONCE MD5_HEX
-+#define MAX_CNONCE MD5_HEX
-+#define MAX_RESPONSE MD5_HEX
-+#define MAX_QOP 8
-+
-+#define URI "/RedirectionService"
-+#define NC "00000002"
-+#define QOP "auth"
-+#define METHOD "POST"
-+
-+#define put_header(data,length,type) \
-+do { \
-+ *data++=AUTH_SESS; \
-+ *data++=AUTH_SUCCESS; \
-+ *data++=0; \
-+ *data++=0; \
-+ *data++=type; \
-+ *data++=(unsigned char)(length); \
-+ *data++=(unsigned char)(length>>8); \
-+ *data++=(unsigned char)(length>>16); \
-+ *data++=(unsigned char)(length>>24); \
-+} while(0)
-+
-+#define put_element(data,element) \
-+do { \
-+ int length=strlen(element); \
-+ *data++=(unsigned char)length; \
-+ memcpy(data,element,length); \
-+ data+=length; \
-+} while(0)
-+
-+#define get_header(data,len,method,status) \
-+do { \
-+ if(data[0]!=AUTH_SESS_REPLY)goto out; \
-+ status=data[1]; \
-+ if(data[4]!=method)goto out; \
-+ len=data[8]; \
-+ len<<=8; \
-+ len|=data[7]; \
-+ len<<=8; \
-+ len|=data[6]; \
-+ len<<=8; \
-+ len|=data[5]; \
-+} while(0)
-+
-+#define get_element(data,len,element,max) \
-+do { \
-+ int blen=*data++; \
-+ if(blen>--len||blen>max)goto out; \
-+ memcpy(element,data,blen); \
-+ element[blen]=0; \
-+ data+=blen; \
-+ len-=blen; \
-+} while(0)
-+
-+typedef struct
-+{
-+ uint32_t md5[4];
-+ uint32_t total;
-+ uint8_t bfr[64];
-+ uint8_t size;
-+} md5_ctx;
-+
-+static void md5block(uint32_t *md5,uint8_t *block)
-+{
-+ register uint32_t a;
-+ register uint32_t b;
-+ register uint32_t c;
-+ register uint32_t d;
-+ uint32_t bfr[16];
-+
-+ a=block[3];
-+ a<<=8;
-+ a+=block[2];
-+ a<<=8;
-+ a+=block[1];
-+ a<<=8;
-+ bfr[0]=a+block[0];
-+
-+ a=block[7];
-+ a<<=8;
-+ a+=block[6];
-+ a<<=8;
-+ a+=block[5];
-+ a<<=8;
-+ bfr[1]=a+block[4];
-+
-+ a=block[11];
-+ a<<=8;
-+ a+=block[10];
-+ a<<=8;
-+ a+=block[9];
-+ a<<=8;
-+ bfr[2]=a+block[8];
-+
-+ a=block[15];
-+ a<<=8;
-+ a+=block[14];
-+ a<<=8;
-+ a+=block[13];
-+ a<<=8;
-+ bfr[3]=a+block[12];
-+
-+ a=block[19];
-+ a<<=8;
-+ a+=block[18];
-+ a<<=8;
-+ a+=block[17];
-+ a<<=8;
-+ bfr[4]=a+block[16];
-+
-+ a=block[23];
-+ a<<=8;
-+ a+=block[22];
-+ a<<=8;
-+ a+=block[21];
-+ a<<=8;
-+ bfr[5]=a+block[20];
-+
-+ a=block[27];
-+ a<<=8;
-+ a+=block[26];
-+ a<<=8;
-+ a+=block[25];
-+ a<<=8;
-+ bfr[6]=a+block[24];
-+
-+ a=block[31];
-+ a<<=8;
-+ a+=block[30];
-+ a<<=8;
-+ a+=block[29];
-+ a<<=8;
-+ bfr[7]=a+block[28];
-+
-+ a=block[35];
-+ a<<=8;
-+ a+=block[34];
-+ a<<=8;
-+ a+=block[33];
-+ a<<=8;
-+ bfr[8]=a+block[32];
-+
-+ a=block[39];
-+ a<<=8;
-+ a+=block[38];
-+ a<<=8;
-+ a+=block[37];
-+ a<<=8;
-+ bfr[9]=a+block[36];
-+
-+ a=block[43];
-+ a<<=8;
-+ a+=block[42];
-+ a<<=8;
-+ a+=block[41];
-+ a<<=8;
-+ bfr[10]=a+block[40];
-+
-+ a=block[47];
-+ a<<=8;
-+ a+=block[46];
-+ a<<=8;
-+ a+=block[45];
-+ a<<=8;
-+ bfr[11]=a+block[44];
-+
-+ a=block[51];
-+ a<<=8;
-+ a+=block[50];
-+ a<<=8;
-+ a+=block[49];
-+ a<<=8;
-+ bfr[12]=a+block[48];
-+
-+ a=block[55];
-+ a<<=8;
-+ a+=block[54];
-+ a<<=8;
-+ a+=block[53];
-+ a<<=8;
-+ bfr[13]=a+block[52];
-+
-+ a=block[59];
-+ a<<=8;
-+ a+=block[58];
-+ a<<=8;
-+ a+=block[57];
-+ a<<=8;
-+ bfr[14]=a+block[56];
-+
-+ a=block[63];
-+ a<<=8;
-+ a+=block[62];
-+ a<<=8;
-+ a+=block[61];
-+ a<<=8;
-+ bfr[15]=a+block[60];
-+
-+ a=md5[0];
-+ b=md5[1];
-+ c=md5[2];
-+ d=md5[3];
-+
-+ a+=bfr[0];
-+ a+=0xd76aa478;
-+ a+=d^(b&(c^d));
-+ a=(a<<7)|(a>>25);
-+ a+=b;
-+ d+=bfr[1];
-+ d+=0xe8c7b756;
-+ d+=c^(a&(b^c));
-+ d=(d<<12)|(d>>20);
-+ d+=a;
-+ c+=bfr[2];
-+ c+=0x242070db;
-+ c+=b^(d&(a^b));
-+ c=(c<<17)|(c>>15);
-+ c+=d;
-+ b+=bfr[3];
-+ b+=0xc1bdceee;
-+ b+=a^(c&(d^a));
-+ b=(b<<22)|(b>>10);
-+ b+=c;
-+ a+=bfr[4];
-+ a+=0xf57c0faf;
-+ a+=d^(b&(c^d));
-+ a=(a<<7)|(a>>25);
-+ a+=b;
-+ d+=bfr[5];
-+ d+=0x4787c62a;
-+ d+=c^(a&(b^c));
-+ d=(d<<12)|(d>>20);
-+ d+=a;
-+ c+=bfr[6];
-+ c+=0xa8304613;
-+ c+=b^(d&(a^b));
-+ c=(c<<17)|(c>>15);
-+ c+=d;
-+ b+=bfr[7];
-+ b+=0xfd469501;
-+ b+=a^(c&(d^a));
-+ b=(b<<22)|(b>>10);
-+ b+=c;
-+ a+=bfr[8];
-+ a+=0x698098d8;
-+ a+=d^(b&(c^d));
-+ a=(a<<7)|(a>>25);
-+ a+=b;
-+ d+=bfr[9];
-+ d+=0x8b44f7af;
-+ d+=c^(a&(b^c));
-+ d=(d<<12)|(d>>20);
-+ d+=a;
-+ c+=bfr[10];
-+ c+=0xffff5bb1;
-+ c+=b^(d&(a^b));
-+ c=(c<<17)|(c>>15);
-+ c+=d;
-+ b+=bfr[11];
-+ b+=0x895cd7be;
-+ b+=a^(c&(d^a));
-+ b=(b<<22)|(b>>10);
-+ b+=c;
-+ a+=bfr[12];
-+ a+=0x6b901122;
-+ a+=d^(b&(c^d));
-+ a=(a<<7)|(a>>25);
-+ a+=b;
-+ d+=bfr[13];
-+ d+=0xfd987193;
-+ d+=c^(a&(b^c));
-+ d=(d<<12)|(d>>20);
-+ d+=a;
-+ c+=bfr[14];
-+ c+=0xa679438e;
-+ c+=b^(d&(a^b));
-+ c=(c<<17)|(c>>15);
-+ c+=d;
-+ b+=bfr[15];
-+ b+=0x49b40821;
-+ b+=a^(c&(d^a));
-+ b=(b<<22)|(b>>10);
-+ b+=c;
-+
-+ a+=bfr[1];
-+ a+=0xf61e2562;
-+ a+=c^(d&(b^c));
-+ a=(a<<5)|(a>>27);
-+ a+=b;
-+ d+=bfr[6];
-+ d+=0xc040b340;
-+ d+=b^(c&(a^b));
-+ d=(d<<9)|(d>>23);
-+ d+=a;
-+ c+=bfr[11];
-+ c+=0x265e5a51;
-+ c+=a^(b&(d^a));
-+ c=(c<<14)|(c>>18);
-+ c+=d;
-+ b+=bfr[0];
-+ b+=0xe9b6c7aa;
-+ b+=d^(a&(c^d));
-+ b=(b<<20)|(b>>12);
-+ b+=c;
-+ a+=bfr[5];
-+ a+=0xd62f105d;
-+ a+=c^(d&(b^c));
-+ a=(a<<5)|(a>>27);
-+ a+=b;
-+ d+=bfr[10];
-+ d+=0x02441453;
-+ d+=b^(c&(a^b));
-+ d=(d<<9)|(d>>23);
-+ d+=a;
-+ c+=bfr[15];
-+ c+=0xd8a1e681;
-+ c+=a^(b&(d^a));
-+ c=(c<<14)|(c>>18);
-+ c+=d;
-+ b+=bfr[4];
-+ b+=0xe7d3fbc8;
-+ b+=d^(a&(c^d));
-+ b=(b<<20)|(b>>12);
-+ b+=c;
-+ a+=bfr[9];
-+ a+=0x21e1cde6;
-+ a+=c^(d&(b^c));
-+ a=(a<<5)|(a>>27);
-+ a+=b;
-+ d+=bfr[14];
-+ d+=0xc33707d6;
-+ d+=b^(c&(a^b));
-+ d=(d<<9)|(d>>23);
-+ d+=a;
-+ c+=bfr[3];
-+ c+=0xf4d50d87;
-+ c+=a^(b&(d^a));
-+ c=(c<<14)|(c>>18);
-+ c+=d;
-+ b+=bfr[8];
-+ b+=0x455a14ed;
-+ b+=d^(a&(c^d));
-+ b=(b<<20)|(b>>12);
-+ b+=c;
-+ a+=bfr[13];
-+ a+=0xa9e3e905;
-+ a+=c^(d&(b^c));
-+ a=(a<<5)|(a>>27);
-+ a+=b;
-+ d+=bfr[2];
-+ d+=0xfcefa3f8;
-+ d+=b^(c&(a^b));
-+ d=(d<<9)|(d>>23);
-+ d+=a;
-+ c+=bfr[7];
-+ c+=0x676f02d9;
-+ c+=a^(b&(d^a));
-+ c=(c<<14)|(c>>18);
-+ c+=d;
-+ b+=bfr[12];
-+ b+=0x8d2a4c8a;
-+ b+=d^(a&(c^d));
-+ b=(b<<20)|(b>>12);
-+ b+=c;
-+
-+ a+=bfr[5];
-+ a+=0xfffa3942;
-+ a+=b^c^d;
-+ a=(a<<4)|(a>>28);
-+ a+=b;
-+ d+=bfr[8];
-+ d+=0x8771f681;
-+ d+=a^b^c;
-+ d=(d<<11)|(d>>21);
-+ d+=a;
-+ c+=bfr[11];
-+ c+=0x6d9d6122;
-+ c+=d^a^b;
-+ c=(c<<16)|(c>>16);
-+ c+=d;
-+ b+=bfr[14];
-+ b+=0xfde5380c;
-+ b+=c^d^a;
-+ b=(b<<23)|(b>>9);
-+ b+=c;
-+ a+=bfr[1];
-+ a+=0xa4beea44;
-+ a+=b^c^d;
-+ a=(a<<4)|(a>>28);
-+ a+=b;
-+ d+=bfr[4];
-+ d+=0x4bdecfa9;
-+ d+=a^b^c;
-+ d=(d<<11)|(d>>21);
-+ d+=a;
-+ c+=bfr[7];
-+ c+=0xf6bb4b60;
-+ c+=d^a^b;
-+ c=(c<<16)|(c>>16);
-+ c+=d;
-+ b+=bfr[10];
-+ b+=0xbebfbc70;
-+ b+=c^d^a;
-+ b=(b<<23)|(b>>9);
-+ b+=c;
-+ a+=bfr[13];
-+ a+=0x289b7ec6;
-+ a+=b^c^d;
-+ a=(a<<4)|(a>>28);
-+ a+=b;
-+ d+=bfr[0];
-+ d+=0xeaa127fa;
-+ d+=a^b^c;
-+ d=(d<<11)|(d>>21);
-+ d+=a;
-+ c+=bfr[3];
-+ c+=0xd4ef3085;
-+ c+=d^a^b;
-+ c=(c<<16)|(c>>16);
-+ c+=d;
-+ b+=bfr[6];
-+ b+=0x04881d05;
-+ b+=c^d^a;
-+ b=(b<<23)|(b>>9);
-+ b+=c;
-+ a+=bfr[9];
-+ a+=0xd9d4d039;
-+ a+=b^c^d;
-+ a=(a<<4)|(a>>28);
-+ a+=b;
-+ d+=bfr[12];
-+ d+=0xe6db99e5;
-+ d+=a^b^c;
-+ d=(d<<11)|(d>>21);
-+ d+=a;
-+ c+=bfr[15];
-+ c+=0x1fa27cf8;
-+ c+=d^a^b;
-+ c=(c<<16)|(c>>16);
-+ c+=d;
-+ b+=bfr[2];
-+ b+=0xc4ac5665;
-+ b+=c^d^a;
-+ b=(b<<23)|(b>>9);
-+ b+=c;
-+
-+ a+=bfr[0];
-+ a+=0xf4292244;
-+ a+=c^(b|~d);
-+ a=(a<<6)|(a>>26);
-+ a+=b;
-+ d+=bfr[7];
-+ d+=0x432aff97;
-+ d+=b^(a|~c);
-+ d=(d<<10)|(d>>22);
-+ d+=a;
-+ c+=bfr[14];
-+ c+=0xab9423a7;
-+ c+=a^(d|~b);
-+ c=(c<<15)|(c>>17);
-+ c+=d;
-+ b+=bfr[5];
-+ b+=0xfc93a039;
-+ b+=d^(c|~a);
-+ b=(b<<21)|(b>>11);
-+ b+=c;
-+ a+=bfr[12];
-+ a+=0x655b59c3;
-+ a+=c^(b|~d);
-+ a=(a<<6)|(a>>26);
-+ a+=b;
-+ d+=bfr[3];
-+ d+=0x8f0ccc92;
-+ d+=b^(a|~c);
-+ d=(d<<10)|(d>>22);
-+ d+=a;
-+ c+=bfr[10];
-+ c+=0xffeff47d;
-+ c+=a^(d|~b);
-+ c=(c<<15)|(c>>17);
-+ c+=d;
-+ b+=bfr[1];
-+ b+=0x85845dd1;
-+ b+=d^(c|~a);
-+ b=(b<<21)|(b>>11);
-+ b+=c;
-+ a+=bfr[8];
-+ a+=0x6fa87e4f;
-+ a+=c^(b|~d);
-+ a=(a<<6)|(a>>26);
-+ a+=b;
-+ d+=bfr[15];
-+ d+=0xfe2ce6e0;
-+ d+=b^(a|~c);
-+ d=(d<<10)|(d>>22);
-+ d+=a;
-+ c+=bfr[6];
-+ c+=0xa3014314;
-+ c+=a^(d|~b);
-+ c=(c<<15)|(c>>17);
-+ c+=d;
-+ b+=bfr[13];
-+ b+=0x4e0811a1;
-+ b+=d^(c|~a);
-+ b=(b<<21)|(b>>11);
-+ b+=c;
-+ a+=bfr[4];
-+ a+=0xf7537e82;
-+ a+=c^(b|~d);
-+ a=(a<<6)|(a>>26);
-+ a+=b;
-+ d+=bfr[11];
-+ d+=0xbd3af235;
-+ d+=b^(a|~c);
-+ d=(d<<10)|(d>>22);
-+ d+=a;
-+ c+=bfr[2];
-+ c+=0x2ad7d2bb;
-+ c+=a^(d|~b);
-+ c=(c<<15)|(c>>17);
-+ c+=d;
-+ b+=bfr[9];
-+ b+=0xeb86d391;
-+ b+=d^(c|~a);
-+ b=(b<<21)|(b>>11);
-+ b+=c;
-+
-+ md5[0]+=a;
-+ md5[1]+=b;
-+ md5[2]+=c;
-+ md5[3]+=d;
-+}
-+
-+static void md5init(register md5_ctx *ptr)
-+{
-+ ptr->total=ptr->size=0;
-+ ptr->md5[0]=0x67452301;
-+ ptr->md5[1]=0xefcdab89;
-+ ptr->md5[2]=0x98badcfe;
-+ ptr->md5[3]=0x10325476;
-+}
-+
-+static void md5next(register uint8_t *data,register uint32_t length,
-+ register md5_ctx *ptr)
-+{
-+ register uint32_t i;
-+
-+ ptr->total+=length;
-+
-+ for(i=ptr->size;(i&63)&&length;length--)ptr->bfr[i++]=*data++;
-+
-+ if(i==64)
-+ {
-+ i=0;
-+ md5block(ptr->md5,ptr->bfr);
-+ }
-+
-+ for(;length>63;data+=64,length-=64)
-+ md5block(ptr->md5,data);
-+
-+ for(;length;length--)ptr->bfr[i++]=*data++;
-+
-+ ptr->size=(uint8_t)(i);
-+}
-+
-+static void md5end(register uint8_t *result,register md5_ctx *ptr)
-+{
-+ register uint32_t i=ptr->size;
-+
-+ ptr->bfr[i++]=0x80;
-+ if(i>56)
-+ {
-+ for(;i<64;i++)ptr->bfr[i]=0;
-+ i=0;
-+ md5block(ptr->md5,ptr->bfr);
-+ }
-+ for(;i<56;i++)ptr->bfr[i]=0;
-+
-+ ptr->bfr[56]=(uint8_t)((ptr->total)<<3);
-+ ptr->bfr[57]=(uint8_t)((ptr->total)>>5);
-+ ptr->bfr[58]=(uint8_t)((ptr->total)>>13);
-+ ptr->bfr[59]=(uint8_t)((ptr->total)>>21);
-+ ptr->bfr[60]=(uint8_t)((ptr->total)>>29);
-+ ptr->bfr[61]=0;
-+ ptr->bfr[62]=0;
-+ ptr->bfr[63]=0;
-+
-+ md5block(ptr->md5,ptr->bfr);
-+
-+ result[ 0]=(uint8_t) (ptr->md5[0]);
-+ result[ 1]=(uint8_t)((ptr->md5[0])>>8);
-+ result[ 2]=(uint8_t)((ptr->md5[0])>>16);
-+ result[ 3]=(uint8_t)((ptr->md5[0])>>24);
-+ result[ 4]=(uint8_t) (ptr->md5[1]);
-+ result[ 5]=(uint8_t)((ptr->md5[1])>>8);
-+ result[ 6]=(uint8_t)((ptr->md5[1])>>16);
-+ result[ 7]=(uint8_t)((ptr->md5[1])>>24);
-+ result[ 8]=(uint8_t) (ptr->md5[2]);
-+ result[ 9]=(uint8_t)((ptr->md5[2])>>8);
-+ result[10]=(uint8_t)((ptr->md5[2])>>16);
-+ result[11]=(uint8_t)((ptr->md5[2])>>24);
-+ result[12]=(uint8_t) (ptr->md5[3]);
-+ result[13]=(uint8_t)((ptr->md5[3])>>8);
-+ result[14]=(uint8_t)((ptr->md5[3])>>16);
-+ result[15]=(uint8_t)((ptr->md5[3])>>24);
-+}
-+
-+static void bin2hex(unsigned char *bin,int len,char *hex)
-+{
-+ while(len--)
-+ {
-+ *hex=*bin>>4;
-+ if(*hex>9)*hex+++='a'-10;
-+ else *hex+++='0';
-+ *hex=*bin++&0xf;
-+ if(*hex>9)*hex+++='a'-10;
-+ else *hex+++='0';
-+ }
-+ *hex=0;
-+}
-+
-+int authenticate(int mode,char *user,char *pass,
-+ int (*io)(void *parm,unsigned char *data,int len,int mode),void *parm)
-+{
-+ int r=-1;
-+ int len;
-+ int status;
-+ int method;
-+ unsigned char *ptr;
-+ unsigned char bfr[512];
-+ char realm[MAX_REALM+1];
-+ char nonce[MAX_NONCE+1];
-+ char cnonce[MAX_CNONCE+1];
-+ char response[MAX_RESPONSE+1];
-+ char qop[MAX_QOP+1];
-+ char tmp[MD5_HEX+1];
-+ MD5(md5);
-+ md5_ctx ctx;
-+
-+ if(strlen(user)>MAX_USER||strlen(pass)>MAX_PASS)return -1;
-+
-+ ptr=bfr;
-+ put_header(ptr,0,TYPE_METHODS);
-+ if(io(parm,bfr,9,WRITE))goto out;
-+
-+ if(io(parm,bfr,9,READ))goto out;
-+ get_header(bfr,len,TYPE_METHODS,status);
-+ if(status!=AUTH_SUCCESS)goto out;
-+ if(len>sizeof(bfr))goto out;
-+ if(io(parm,bfr,len,READ))goto out;
-+
-+ for(method=0,ptr=bfr;len;len--)
-+ {
-+ if(!*ptr||*ptr>=sizeof(method)*8)return -1;
-+ method|=1<<*ptr++;
-+ }
-+
-+ if(method&(1<<TYPE_RFC2617))method=TYPE_RFC2617;
-+ else if(method&(1<<TYPE_RFC2069))method=TYPE_RFC2069;
-+ else if(method&(1<<TYPE_PLAIN))method=TYPE_PLAIN;
-+ else goto out;
-+
-+ switch(method)
-+ {
-+ case TYPE_PLAIN:
-+ len=strlen(user)+strlen(pass)+2;
-+ ptr=bfr;
-+ put_header(ptr,len,method);
-+ put_element(ptr,user);
-+ put_element(ptr,pass);
-+ break;
-+
-+ case TYPE_RFC2069:
-+ case TYPE_RFC2617:
-+ len=strlen(user)+strlen(URI)+(method==TYPE_RFC2617?8:7);
-+ ptr=bfr;
-+ put_header(ptr,len,method);
-+ put_element(ptr,user);
-+ *ptr++=0;
-+ *ptr++=0;
-+ put_element(ptr,URI);
-+ *ptr++=0;
-+ *ptr++=0;
-+ *ptr++=0;
-+ *ptr=0;
-+ if(io(parm,bfr,len+9,WRITE))goto out;
-+
-+ if(io(parm,bfr,9,READ))goto out;
-+ get_header(bfr,len,method,status);
-+ if(status!=AUTH_FAIL)goto out;
-+ if(len>sizeof(bfr))goto out;
-+ if(io(parm,bfr,len,READ))goto out;
-+ ptr=bfr;
-+ if(!len)goto out;
-+ get_element(ptr,len,realm,MAX_REALM);
-+ if(!len)goto out;
-+ get_element(ptr,len,nonce,MAX_NONCE);
-+ if(!len)*qop=0;
-+ else get_element(ptr,len,qop,MAX_QOP);
-+
-+ if(method==TYPE_RFC2617)
-+ {
-+ if(strcmp(qop,QOP))goto out;
-+ }
-+ else if(*qop)goto out;
-+
-+ if(io(parm,bfr,16,RANDOM))goto out;
-+ md5init(&ctx);
-+ md5next(bfr,16,&ctx);
-+ md5end(md5,&ctx);
-+ bin2hex(md5,MD5_SIZE,cnonce);
-+
-+ md5init(&ctx);
-+ md5next((uint8_t *)user,strlen(user),&ctx);
-+ md5next((uint8_t *)":",1,&ctx);
-+ md5next((uint8_t *)realm,strlen(realm),&ctx);
-+ md5next((uint8_t *)":",1,&ctx);
-+ md5next((uint8_t *)pass,strlen(pass),&ctx);
-+ md5end(md5,&ctx);
-+ bin2hex(md5,MD5_SIZE,tmp);
-+
-+ md5init(&ctx);
-+ md5next((uint8_t *)METHOD,strlen(METHOD),&ctx);
-+ md5next((uint8_t *)":",1,&ctx);
-+ md5next((uint8_t *)URI,strlen(URI),&ctx);
-+ md5end(md5,&ctx);
-+ bin2hex(md5,MD5_SIZE,response);
-+
-+ md5init(&ctx);
-+ md5next((uint8_t *)tmp,strlen(tmp),&ctx);
-+ md5next((uint8_t *)":",1,&ctx);
-+ md5next((uint8_t *)nonce,strlen(nonce),&ctx);
-+ md5next((uint8_t *)":",1,&ctx);
-+ if(method==TYPE_RFC2617)
-+ {
-+ md5next((uint8_t *)NC,strlen(NC),&ctx);
-+ md5next((uint8_t *)":",1,&ctx);
-+ md5next((uint8_t *)cnonce,strlen(cnonce),&ctx);
-+ md5next((uint8_t *)":",1,&ctx);
-+ md5next((uint8_t *)qop,strlen(qop),&ctx);
-+ md5next((uint8_t *)":",1,&ctx);
-+ }
-+ md5next((uint8_t *)response,strlen(response),&ctx);
-+ md5end(md5,&ctx);
-+ bin2hex(md5,MD5_SIZE,response);
-+
-+ len=strlen(user)+strlen(realm)+strlen(nonce)
-+ +strlen(URI)+strlen(cnonce)+strlen(NC)
-+ +strlen(response)+strlen(qop)+
-+ (method==TYPE_RFC2617?8:7);
-+ ptr=bfr;
-+ put_header(ptr,len,method);
-+ put_element(ptr,user);
-+ put_element(ptr,realm);
-+ put_element(ptr,nonce);
-+ put_element(ptr,URI);
-+ put_element(ptr,cnonce);
-+ put_element(ptr,NC);
-+ put_element(ptr,response);
-+ put_element(ptr,qop);
-+ break;
-+
-+ default:goto out;
-+ }
-+
-+ if(io(parm,bfr,len+9,WRITE))goto out;
-+
-+ if(mode)
-+ {
-+ if(io(parm,bfr,9,READ))goto out;
-+ get_header(bfr,len,method,status);
-+ if(len>sizeof(bfr))goto out;
-+ if(io(parm,bfr,len,READ))goto out;
-+
-+ if(status==AUTH_SUCCESS)r=0;
-+ else r=-2;
-+ }
-+ else r=0;
-+
-+out: memset(bfr,0,sizeof(bfr));
-+
-+ return r;
-+}
Index: patches/patch-auth_h
===================================================================
RCS file: patches/patch-auth_h
diff -N patches/patch-auth_h
--- patches/patch-auth_h 11 Mar 2022 18:26:24 -0000 1.2
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,13 +0,0 @@
-Add SSL/auth code
-https://github.com/Openwsman/wsmancli/issues/10#issuecomment-751253133
-
-Index: auth.h
---- auth.h.orig
-+++ auth.h
-@@ -0,0 +1,6 @@
-+#define READ 0
-+#define WRITE 1
-+#define RANDOM 2
-+
-+extern int authenticate(int mode,char *user,char *pass,
-+ int (*io)(void *parm,unsigned char *data,int len,int mode),void *parm);
Index: patches/patch-gamt_c
===================================================================
RCS file: patches/patch-gamt_c
diff -N patches/patch-gamt_c
--- patches/patch-gamt_c 11 Mar 2022 18:26:24 -0000 1.2
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,65 +0,0 @@
-Add SSL/auth code
-https://github.com/Openwsman/wsmancli/issues/10#issuecomment-751253133
-
-Index: gamt.c
---- gamt.c.orig
-+++ gamt.c
-@@ -84,6 +84,8 @@ static char amt_user[32] = "admin";
- static char amt_pass[32];
- static int amt_trace;
- static int amt_debug;
-+static int amt_legacy;
-+static char *amt_cacert;
-
- static int gamt_getstring(GtkWidget *window, char *title, char *message,
- char *dest, int dlen, int hide);
-@@ -768,6 +770,8 @@ static int gamt_connect(struct gamt_window *gamt)
- gamt->redir.cb_data = gamt;
- gamt->redir.cb_recv = recv_gtk;
- gamt->redir.cb_state = state_gtk;
-+ gamt->redir.legacy = amt_legacy;
-+ gamt->redir.cacert = amt_cacert;
-
- if (-1 == redir_connect(&gamt->redir))
- return -1;
-@@ -905,8 +909,16 @@ static void usage(FILE *fp)
- " -c color text color\n"
- " -b color background color\n"
- " -l file logfile\n"
-+ " -L use legacy authentication\n"
-+#if defined(USE_OPENSSL) || defined(USE_GNUTLS)
-+ " -C cacert enable SSL and use PEM cacert file\n"
-+#endif
- "\n"
-+#if defined(USE_OPENSSL) || defined(USE_GNUTLS)
-+ "By default port 16994 (SSL: 16995) is used.\n"
-+#else
- "By default port 16994 is used.\n"
-+#endif
- "If no password is given " APPNAME " will ask for one.\n"
- "\n"
- "-- \n"
-@@ -941,7 +953,7 @@ main(int argc, char *argv[])
- fcntl(ConnectionNumber(dpy),F_SETFD,FD_CLOEXEC);
-
- for (;;) {
-- if (-1 == (c = getopt(argc, argv, "hdtu:p:f:c:b:l:")))
-+ if (-1 == (c = getopt(argc, argv, "hdtu:p:f:c:b:l:LC:")))
- break;
- switch (c) {
- case 'd':
-@@ -960,6 +972,14 @@ main(int argc, char *argv[])
- case 'l':
- log = optarg;
- break;
-+ case 'L':
-+ amt_legacy = 1;
-+ break;
-+#if defined(USE_OPENSSL) || defined(USE_GNUTLS)
-+ case 'C':
-+ amt_cacert = optarg;
-+ break;
-+#endif
-
- case 'f':
- cfg_set_str(CFG_FONT, optarg);
Index: patches/patch-ider_c
===================================================================
RCS file: patches/patch-ider_c
diff -N patches/patch-ider_c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-ider_c 31 Aug 2025 19:59:44 -0000
@@ -0,0 +1,25 @@
+Adapt to our SCSI stack.
+
+Index: ider.c
+--- ider.c.orig
++++ ider.c
+@@ -23,8 +23,18 @@
+ #include <string.h>
+ #include <stdbool.h>
+ #include <sys/types.h>
+-#include <scsi/scsi.h>
++#include <scsi/scsi_all.h>
++#include <scsi/cd.h>
++#include <scsi/scsi_disk.h>
+ #include "redir.h"
++
++/* SCSI compat defines */
++#ifndef ALLOW_MEDIUM_REMOVAL
++#define ALLOW_MEDIUM_REMOVAL PREVENT_ALLOW
++#endif
++#ifndef MODE_SENSE_10
++#define MODE_SENSE_10 MODE_SENSE_BIG
++#endif
+
+ static int ider_data_to_host(struct redir *r, unsigned char device,
+ unsigned char *data, unsigned int data_len,
Index: patches/patch-parseconfig_c
===================================================================
RCS file: patches/patch-parseconfig_c
diff -N patches/patch-parseconfig_c
--- patches/patch-parseconfig_c 11 Mar 2022 18:26:24 -0000 1.3
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,36 +0,0 @@
-From ea1717899294af93f7342069b15fc197b525ad29 Mon Sep 17 00:00:00 2001
-From: Gerd Hoffmann <kraxel@redhat.com>
-Date: Tue, 20 Feb 2018 09:42:43 +0100
-Subject: fix memory leak
-
-Index: parseconfig.c
---- parseconfig.c.orig
-+++ parseconfig.c
-@@ -558,17 +558,24 @@ cfg_write_file(char *dname, char *filename)
-
- if (-1 == unlink(bfile) && ENOENT != errno) {
- fprintf(stderr,"unlink(%s): %s\n",bfile,strerror(errno));
-- return -1;
-+ goto err;
- }
- if (-1 == rename(filename,bfile) && ENOENT != errno) {
- fprintf(stderr,"rename(%s,%s): %s\n",filename,bfile,strerror(errno));
-- return -1;
-+ goto err;
- }
- if (-1 == rename(tfile,filename)) {
- fprintf(stderr,"rename(%s,%s): %s\n",tfile,filename,strerror(errno));
-- return -1;
-+ goto err;
- }
-+ free(bfile);
-+ free(tfile);
- return 0;
-+
-+err:
-+ free(bfile);
-+ free(tfile);
-+ return -1;
- }
-
- /* ------------------------------------------------------------------------ */
Index: patches/patch-redir_c
===================================================================
RCS file: patches/patch-redir_c
diff -N patches/patch-redir_c
--- patches/patch-redir_c 11 Mar 2022 18:26:24 -0000 1.2
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,196 +0,0 @@
-Add SSL/auth code
-https://github.com/Openwsman/wsmancli/issues/10#issuecomment-751253133
-
-Index: redir.c
---- redir.c.orig
-+++ redir.c
-@@ -29,9 +29,12 @@
- #include <ctype.h>
- #include <errno.h>
- #include <fcntl.h>
-+#include <sys/time.h>
-
- #include "tcp.h"
-+#include "ssl.h"
- #include "redir.h"
-+#include "auth.h"
-
- static const char *state_name[] = {
- [ REDIR_NONE ] = "NONE",
-@@ -100,7 +103,7 @@ static ssize_t redir_write(struct redir *r, const char
-
- if (r->trace)
- hexdump("out", buf, count);
-- rc = write(r->sock, buf, count);
-+ rc = sslwrite(r->ctx, buf, count);
- if (-1 == rc)
- snprintf(r->err, sizeof(r->err), "write(socket): %s", strerror(errno));
- return rc;
-@@ -142,8 +145,11 @@ const char *redir_state_desc(enum redir_state state)
- int redir_connect(struct redir *r)
- {
- static unsigned char *defport = "16994";
-+ static unsigned char *sslport = "16995";
- struct addrinfo ai;
-
-+ if (r->cacert)
-+ defport = sslport;
- memset(&ai, 0, sizeof(ai));
- ai.ai_socktype = SOCK_STREAM;
- ai.ai_family = PF_UNSPEC;
-@@ -151,6 +157,11 @@ int redir_connect(struct redir *r)
- redir_state(r, REDIR_CONNECT);
- r->sock = tcp_connect(&ai, NULL, NULL, r->host,
- strlen(r->port) ? r->port : defport);
-+ r->ctx = sslinit(r->sock, r->cacert);
-+ if(r->ctx == NULL) {
-+ close(r->sock);
-+ r->sock = -1;
-+ }
- if (-1 == r->sock) {
- redir_state(r, REDIR_ERROR);
- /* FIXME: better error message */
-@@ -179,11 +190,13 @@ int redir_stop(struct redir *r)
-
- redir_state(r, REDIR_CLOSED);
- redir_write(r, request, sizeof(request));
-+ sslexit(r->ctx);
-+ r->ctx = NULL;
- close(r->sock);
- return 0;
- }
-
--int redir_auth(struct redir *r)
-+static int redir_auth_old(struct redir *r)
- {
- int ulen = strlen(r->user);
- int plen = strlen(r->pass);
-@@ -205,6 +218,79 @@ int redir_auth(struct redir *r)
- return rc;
- }
-
-+static int io(void *parm, unsigned char *data, int len, int mode)
-+{
-+ int rc;
-+ struct redir *r;
-+ struct timeval tv;
-+ fd_set set;
-+
-+ switch(mode)
-+ {
-+ case READ:
-+ r = (struct redir *)parm;
-+ while (len) {
-+ FD_ZERO(&set);
-+ FD_SET(r->sock,&set);
-+ if (!sslready(r->ctx)) {
-+ tv.tv_sec = HEARTBEAT_INTERVAL * 4 / 1000;
-+ tv.tv_usec = 0;
-+ switch (select(r->sock+1,&set,NULL,NULL,&tv)) {
-+ case -1:
-+ perror("select");
-+ return -1;
-+ case 0:
-+ fprintf(stderr,"select: timeout\n");
-+ return -1;
-+ }
-+ }
-+ rc = sslread(r->ctx, data, len);
-+ switch (rc) {
-+ case -1:
-+ fprintf(stderr, "read(socket): %s", strerror(errno));
-+ return -1;
-+ case 0:
-+ fprintf(stderr, "EOF from socket");
-+ return -1;
-+ default:
-+ if (r->trace)
-+ hexdump("in ", data, rc);
-+ data += rc;
-+ len -= rc;
-+ }
-+ }
-+ return 0;
-+
-+ case WRITE:
-+ r = (struct redir *)parm;
-+ if (redir_write(r, data, len) != len)
-+ return -1;
-+ return 0;
-+
-+ case RANDOM:
-+ gettimeofday(&tv, NULL);
-+ if (sizeof(tv) <= len)
-+ memcpy(data, &tv, sizeof(tv));
-+ else
-+ memcpy(data, &tv, len);
-+ return 0;
-+ }
-+
-+ return -1;
-+}
-+
-+int redir_auth(struct redir *r)
-+{
-+ int rc;
-+
-+ if (r->legacy)
-+ return redir_auth_old(r);
-+
-+ redir_state(r, REDIR_AUTH);
-+ rc = authenticate(0, r->user, r->pass, io, r);
-+ return rc;
-+}
-+
- int redir_sol_start(struct redir *r)
- {
- unsigned char request[START_SOL_REDIRECTION_LENGTH] = {
-@@ -280,7 +366,7 @@ int redir_sol_recv(struct redir *r)
- ready yet, but should be here Real Soon Now. */
- flags = fcntl(r->sock,F_GETFL);
- fcntl(r->sock,F_SETFL, flags & (~O_NONBLOCK));
-- count = read(r->sock, msg, count);
-+ count = sslread(r->ctx, msg, count);
- fcntl(r->sock,F_SETFL, flags);
-
- switch (count) {
-@@ -309,12 +395,13 @@ int redir_data(struct redir *r)
- {
- int rc, bshift;
-
-+repeat:
- if (r->trace) {
- fprintf(stderr, "in --\n");
- if (r->blen)
- fprintf(stderr, "in : already have %d\n", r->blen);
- }
-- rc = read(r->sock, r->buf + r->blen, sizeof(r->buf) - r->blen);
-+ rc = sslread(r->ctx, r->buf + r->blen, sizeof(r->buf) - r->blen);
- switch (rc) {
- case -1:
- snprintf(r->err, sizeof(r->err), "read(socket): %s", strerror(errno));
-@@ -456,18 +543,24 @@ int redir_data(struct redir *r)
- memmove(r->buf, r->buf + bshift, r->blen - bshift);
- r->blen -= bshift;
- }
-+ if (r->ctx && sslready(r->ctx))
-+ goto repeat;
- return 0;
-
- again:
- /* need more data, jump back into poll/select loop */
- if (r->trace)
- fprintf(stderr, "in : need more data\n");
-+ if (sslready(r->ctx))
-+ goto repeat;
- return 0;
-
- err:
- if (r->trace)
- fprintf(stderr, "in : ERROR (%s)\n", r->err);
- redir_state(r, REDIR_ERROR);
-+ sslexit(r->ctx);
-+ r->ctx = NULL;
- close(r->sock);
- return -1;
- }
Index: patches/patch-redir_h
===================================================================
RCS file: patches/patch-redir_h
diff -N patches/patch-redir_h
--- patches/patch-redir_h 11 Mar 2022 18:26:24 -0000 1.2
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,23 +0,0 @@
-Add SSL/auth code
-https://github.com/Openwsman/wsmancli/issues/10#issuecomment-751253133
-
-Index: redir.h
---- redir.h.orig
-+++ redir.h
-@@ -26,12 +26,16 @@ struct redir {
- unsigned char type[4];
- int verbose;
- int trace;
-+ int legacy;
- enum redir_state state;
- unsigned char err[128]; // state == REDIR_ERROR
-
- int sock;
- unsigned char buf[64];
- unsigned int blen;
-+
-+ void *cacert;
-+ void *ctx;
-
- /* callbacks */
- void *cb_data;
Index: patches/patch-ssl_c
===================================================================
RCS file: patches/patch-ssl_c
diff -N patches/patch-ssl_c
--- patches/patch-ssl_c 11 Mar 2022 18:26:24 -0000 1.2
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,459 +0,0 @@
-Add SSL/auth code
-https://github.com/Openwsman/wsmancli/issues/10#issuecomment-751253133
-
-Index: ssl.c
---- ssl.c.orig
-+++ ssl.c
-@@ -0,0 +1,452 @@
-+/*
-+ * SSL helper functions.
-+ *
-+ * Copyright (C) 2014 Andreas Steinmetz <ast@domdv.de>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along
-+ * with this program; if not, write to the Free Software Foundation, Inc.,
-+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-+ */
-+
-+#include <unistd.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include <stdio.h>
-+
-+#if defined(USE_OPENSSL)
-+#include <openssl/ssl.h>
-+#include <openssl/err.h>
-+#elif defined(USE_GNUTLS)
-+#include <gnutls/gnutls.h>
-+#endif
-+
-+#include "ssl.h"
-+
-+struct ctx
-+{
-+ int fd;
-+#if defined(USE_OPENSSL)
-+ SSL *ssl;
-+ SSL_CTX *ctx;
-+#elif defined(USE_GNUTLS)
-+ gnutls_session_t ssl;
-+ gnutls_certificate_credentials_t cred;
-+#endif
-+};
-+
-+static struct ctx *newctx(int fd)
-+{
-+ struct ctx *ctx;
-+
-+ if(!(ctx=malloc(sizeof(struct ctx))))
-+ {
-+ perror("malloc");
-+ return NULL;
-+ }
-+
-+ memset(ctx,0,sizeof(struct ctx));
-+
-+ ctx->fd=fd;
-+
-+ return ctx;
-+}
-+
-+#if defined(USE_OPENSSL)
-+
-+struct ctx *sslinit(int fd,char *cacert)
-+{
-+ int r;
-+ int c=0;
-+ struct ctx *ctx;
-+
-+ if(!(ctx=newctx(fd)))return NULL;
-+
-+ if(!cacert)return ctx;
-+
-+ SSL_load_error_strings();
-+ SSL_library_init();
-+
-+ if(!(ctx->ctx=SSL_CTX_new(SSLv23_client_method())))
-+ {
-+ ERR_print_errors_fp(stderr);
-+ goto err1;
-+ }
-+
-+#if OPENSSL_VERSION_NUMBER >= 0x1000100FL
-+ SSL_CTX_set_options(ctx->ctx,
-+ SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1_2);
-+#endif
-+
-+ if(!SSL_CTX_load_verify_locations(ctx->ctx,cacert,NULL))
-+ {
-+ ERR_print_errors_fp(stderr);
-+ goto err2;
-+ }
-+
-+ SSL_CTX_set_verify_depth(ctx->ctx,5);
-+ SSL_CTX_set_verify(ctx->ctx,SSL_VERIFY_PEER,NULL);
-+
-+ if(!(ctx->ssl=SSL_new(ctx->ctx)))
-+ {
-+ ERR_print_errors_fp(stderr);
-+ goto err2;
-+ }
-+
-+ if(!SSL_set_fd(ctx->ssl,ctx->fd))
-+ {
-+ ERR_print_errors_fp(stderr);
-+ goto err3;
-+ }
-+
-+repeat: if((r=SSL_connect(ctx->ssl))!=1)
-+ {
-+ switch(SSL_get_error(ctx->ssl,r))
-+ {
-+ case SSL_ERROR_WANT_READ:
-+ case SSL_ERROR_WANT_WRITE:
-+ if(++c<100)
-+ {
-+ usleep(10000);
-+ goto repeat;
-+ }
-+ }
-+ ERR_print_errors_fp(stderr);
-+ goto err3;
-+ }
-+
-+ return ctx;
-+
-+err3: SSL_free(ctx->ssl);
-+err2: SSL_CTX_free(ctx->ctx);
-+err1: free(ctx);
-+ return NULL;
-+}
-+
-+void sslexit(struct ctx *ctx)
-+{
-+ if(ctx->ssl)
-+ {
-+ SSL_shutdown(ctx->ssl);
-+ SSL_free(ctx->ssl);
-+ SSL_CTX_free(ctx->ctx);
-+ }
-+ free(ctx);
-+}
-+
-+int sslready(struct ctx *ctx)
-+{
-+ if(ctx->ssl)return SSL_pending(ctx->ssl);
-+ else return 0;
-+}
-+
-+ssize_t sslread(struct ctx *ctx,void *buf,size_t count)
-+{
-+ int l;
-+ int c=0;
-+
-+ if(!ctx->ssl)return read(ctx->fd,buf,count);
-+ if(!count)return 0;
-+
-+repeat: if((l=SSL_read(ctx->ssl,buf,count))>0)return l;
-+
-+ switch(SSL_get_error(ctx->ssl,l))
-+ {
-+ case SSL_ERROR_WANT_READ:
-+ case SSL_ERROR_WANT_WRITE:
-+ if(++c<100)
-+ {
-+ usleep(10000);
-+ goto repeat;
-+ }
-+ break;
-+ case SSL_ERROR_WANT_X509_LOOKUP:
-+ return -1;
-+ case SSL_ERROR_ZERO_RETURN:
-+ return 0;
-+ case SSL_ERROR_SSL:
-+ ERR_print_errors_fp(stderr);
-+ }
-+
-+ return -1;
-+}
-+
-+ssize_t sslwrite(struct ctx *ctx,const void *buf,size_t count)
-+{
-+ int l;
-+ int c=0;
-+
-+ if(!ctx->ssl)return write(ctx->fd,buf,count);
-+ if(!count)return 0;
-+
-+repeat: if((l=SSL_write(ctx->ssl,buf,count))>0)return l;
-+
-+ switch(SSL_get_error(ctx->ssl,l))
-+ {
-+ case SSL_ERROR_WANT_READ:
-+ case SSL_ERROR_WANT_WRITE:
-+ if(++c<100)
-+ {
-+ usleep(10000);
-+ goto repeat;
-+ }
-+ break;
-+ case SSL_ERROR_WANT_X509_LOOKUP:
-+ return -1;
-+ case SSL_ERROR_ZERO_RETURN:
-+ return 0;
-+ case SSL_ERROR_SSL:
-+ ERR_print_errors_fp(stderr);
-+ }
-+
-+ return -1;
-+}
-+
-+#elif defined(USE_GNUTLS)
-+
-+static int vrycb(gnutls_session_t ssl)
-+{
-+ int r;
-+ int type;
-+ unsigned int status;
-+ gnutls_datum_t msg;
-+
-+ if((r=gnutls_certificate_verify_peers3(ssl,NULL,&status))<0)
-+ {
-+ fprintf(stderr,"gnutls_certificate_verify_peers3: %s\n",
-+ gnutls_strerror(r));
-+ return GNUTLS_E_CERTIFICATE_ERROR;
-+ }
-+
-+ if(status)
-+ {
-+ type=gnutls_certificate_type_get(ssl);
-+ if((r=gnutls_certificate_verification_status_print(status,type,
-+ &msg,0))<0)
-+ {
-+ fprintf(stderr,"gnutls_certificate_verification_"
-+ "status_print %s\n",gnutls_strerror(r));
-+ }
-+ else
-+ {
-+ fprintf(stderr,"certificate status: %s\n",msg.data);
-+ gnutls_free(msg.data);
-+ }
-+ return GNUTLS_E_CERTIFICATE_ERROR;
-+ }
-+
-+ return 0;
-+}
-+
-+struct ctx *sslinit(int fd,char *cacert)
-+{
-+ int r;
-+ const char *e;
-+ struct ctx *ctx;
-+
-+ if(!(ctx=newctx(fd)))return NULL;
-+
-+ if(!cacert)return ctx;
-+
-+ if((r=gnutls_global_init()))
-+ {
-+ fprintf(stderr,"gnutls_global_init: %s\n",gnutls_strerror(r));
-+ goto err1;
-+ }
-+
-+ if((r=gnutls_certificate_allocate_credentials(&ctx->cred)))
-+ {
-+ fprintf(stderr,"gnutls_certificate_allocate_credentials: "
-+ "%s\n",gnutls_strerror(r));
-+ goto err2;
-+ }
-+
-+ if((r=gnutls_certificate_set_x509_trust_file(ctx->cred,cacert,
-+ GNUTLS_X509_FMT_PEM))<0)
-+ {
-+ fprintf(stderr,"gnutls_certificate_set_x509_trust_file: "
-+ "%s\n",gnutls_strerror(r));
-+ goto err3;
-+ }
-+
-+ gnutls_certificate_set_verify_function(ctx->cred,vrycb);
-+
-+ if((r=gnutls_init(&ctx->ssl,GNUTLS_CLIENT)))
-+ {
-+ fprintf(stderr,"gnutls_init: %s\n",gnutls_strerror(r));
-+ goto err3;
-+ }
-+
-+ /* oh well, isn't _that_ easy ?!? :-( ... compare to openssl ... */
-+ if((r=gnutls_priority_set_direct(ctx->ssl,"NONE:+AES-256-CBC:"
-+ "+AES-128-CBC:+3DES-CBC:+COMP-NULL:+CTYPE-X509:+VERS-SSL3.0:"
-+ "+SHA256:+SHA1:+RSA:%UNSAFE_RENEGOTIATION",&e)))
-+ {
-+ fprintf(stderr,"gnutls_priority_set_direct: %s\n",
-+ gnutls_strerror(r));
-+ if(r==GNUTLS_E_INVALID_REQUEST)
-+ fprintf(stderr,"additional info: %s\n",e);
-+ goto err4;
-+ }
-+
-+ if((r=gnutls_credentials_set(ctx->ssl,GNUTLS_CRD_CERTIFICATE,
-+ ctx->cred)))
-+ {
-+ fprintf(stderr,"gnutls_credentials_set: %s\n",
-+ gnutls_strerror(r));
-+ goto err4;
-+ }
-+
-+ gnutls_transport_set_int(ctx->ssl,ctx->fd);
-+
-+ gnutls_handshake_set_timeout(ctx->ssl,GNUTLS_DEFAULT_HANDSHAKE_TIMEOUT);
-+
-+ do
-+ {
-+ r=gnutls_handshake(ctx->ssl);
-+ } while(r<0&&!gnutls_error_is_fatal(r));
-+ if(r<0)
-+ {
-+ fprintf(stderr,"gnutls_handshake: %s\n",gnutls_strerror(r));
-+ goto err4;
-+ }
-+
-+ return ctx;
-+
-+err4: gnutls_deinit(ctx->ssl);
-+err3: gnutls_certificate_free_credentials(ctx->cred);
-+err2: gnutls_global_deinit();
-+err1: free(ctx);
-+ return NULL;
-+}
-+
-+void sslexit(struct ctx *ctx)
-+{
-+ if(ctx->ssl)
-+ {
-+ gnutls_deinit(ctx->ssl);
-+ gnutls_certificate_free_credentials(ctx->cred);
-+ gnutls_global_deinit();
-+ }
-+ free(ctx);
-+}
-+
-+int sslready(struct ctx *ctx)
-+{
-+ if(ctx->ssl)return gnutls_record_check_pending(ctx->ssl);
-+ else return 0;
-+}
-+
-+ssize_t sslread(struct ctx *ctx,void *buf,size_t count)
-+{
-+ ssize_t l;
-+ int c=0;
-+ int r;
-+
-+ if(!ctx->ssl)return read(ctx->fd,buf,count);
-+ if(!count)return 0;
-+
-+repeat: if((l=gnutls_record_recv(ctx->ssl,buf,count))>0)return l;
-+
-+ switch(l)
-+ {
-+ case GNUTLS_E_REHANDSHAKE:
-+ do
-+ {
-+ r=gnutls_handshake(ctx->ssl);
-+ } while(r<0&&!gnutls_error_is_fatal(r));
-+ if(r<0)
-+ {
-+ fprintf(stderr,"gnutls_handshake: %s\n",
-+ gnutls_strerror(r));
-+ return -1;
-+ }
-+ case GNUTLS_E_INTERRUPTED:
-+ case GNUTLS_E_AGAIN:
-+ if(++c<100)
-+ {
-+ usleep(10000);
-+ goto repeat;
-+ }
-+ default:fprintf(stderr,"gnutls_record_recv: %s\n",gnutls_strerror(l));
-+ case GNUTLS_E_PUSH_ERROR:
-+ case GNUTLS_E_PULL_ERROR:
-+ return -1;
-+ }
-+}
-+
-+ssize_t sslwrite(struct ctx *ctx,const void *buf,size_t count)
-+{
-+ ssize_t l;
-+ int c=0;
-+ int r;
-+
-+ if(!ctx->ssl)return write(ctx->fd,buf,count);
-+ if(!count)return 0;
-+
-+repeat: if((l=gnutls_record_send(ctx->ssl,buf,count))>0)return l;
-+
-+ switch(l)
-+ {
-+ case GNUTLS_E_REHANDSHAKE:
-+ do
-+ {
-+ r=gnutls_handshake(ctx->ssl);
-+ } while(r<0&&!gnutls_error_is_fatal(r));
-+ if(r<0)
-+ {
-+ fprintf(stderr,"gnutls_handshake: %s\n",
-+ gnutls_strerror(r));
-+ return -1;
-+ }
-+ case GNUTLS_E_INTERRUPTED:
-+ case GNUTLS_E_AGAIN:
-+ if(++c<100)
-+ {
-+ usleep(10000);
-+ goto repeat;
-+ }
-+ default:fprintf(stderr,"gnutls_record_send: %s\n",gnutls_strerror(l));
-+ case GNUTLS_E_PUSH_ERROR:
-+ case GNUTLS_E_PULL_ERROR:
-+ return -1;
-+ }
-+}
-+
-+#else
-+
-+struct ctx *sslinit(int fd,char *cacert)
-+{
-+ return newctx(fd);
-+}
-+
-+void sslexit(struct ctx *ctx)
-+{
-+ free(ctx);
-+}
-+
-+int sslready(struct ctx *ctx)
-+{
-+ return 0;
-+}
-+
-+ssize_t sslread(struct ctx *ctx,void *buf,size_t count)
-+{
-+ return read(ctx->fd,buf,count);
-+}
-+
-+ssize_t sslwrite(struct ctx *ctx,const void *buf,size_t count)
-+{
-+ return write(ctx->fd,buf,count);
-+}
-+
-+#endif
Index: patches/patch-ssl_h
===================================================================
RCS file: patches/patch-ssl_h
diff -N patches/patch-ssl_h
--- patches/patch-ssl_h 11 Mar 2022 18:26:24 -0000 1.2
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,14 +0,0 @@
-Add SSL/auth code
-https://github.com/Openwsman/wsmancli/issues/10#issuecomment-751253133
-
-Index: ssl.h
---- ssl.h.orig
-+++ ssl.h
-@@ -0,0 +1,7 @@
-+struct ctx;
-+
-+extern struct ctx *sslinit(int fd,char *cacert);
-+extern void sslexit(struct ctx *ctx);
-+extern int sslready(struct ctx *ctx);
-+extern ssize_t sslread(struct ctx *ctx,void *buf,size_t count);
-+extern ssize_t sslwrite(struct ctx *ctx,const void *buf,size_t count);
Index: patches/patch-tcp_h
===================================================================
RCS file: patches/patch-tcp_h
diff -N patches/patch-tcp_h
--- patches/patch-tcp_h 11 Mar 2022 18:26:24 -0000 1.2
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,7 +0,0 @@
---- tcp.h.orig Sat Jun 2 09:16:45 2012
-+++ tcp.h Sat Jun 2 09:16:55 2012
-@@ -1,3 +1,4 @@
-+#include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <netdb.h>
Index: pkg/PLIST-term
===================================================================
RCS file: /home/cvs/ports/comms/amtterm/pkg/PLIST-term,v
diff -u -p -r1.2 PLIST-term
--- pkg/PLIST-term 11 Mar 2022 18:26:24 -0000 1.2
+++ pkg/PLIST-term 31 Aug 2025 20:03:28 -0000
@@ -1,2 +1,4 @@
+@bin bin/amtider
@bin bin/amtterm
+@man man/man1/amtider.1
@man man/man1/amtterm.1
--
jca
[update] comms/amtterm