From 00764f44edfd9dff559231c7073692874e043325 Mon Sep 17 00:00:00 2001 From: Pim Zandbergen Date: Sun, 5 Nov 2023 15:49:51 +0100 Subject: [PATCH 1/7] [trunk] Sync with 11721 --- .trunk-svn | 2 +- reader-videoguard2.c | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/.trunk-svn b/.trunk-svn index 5e95e106..282f47fe 100644 --- a/.trunk-svn +++ b/.trunk-svn @@ -1 +1 @@ -11720 +11721 diff --git a/reader-videoguard2.c b/reader-videoguard2.c index db48e28d..d4a4681f 100644 --- a/reader-videoguard2.c +++ b/reader-videoguard2.c @@ -1099,6 +1099,18 @@ static int32_t videoguard2_card_init(struct s_reader *reader, ATR *newatr) } } + if(reader->rom[0] == 0x54 && reader->rom[1] == 0x33 && reader->rom[2] == 0x56 && reader->rom[3] == 0x56) + { + static const uint8_t ins42T3VV[5] = { 0xD1, 0x42, 0x00, 0x00, 0x25 }; + static const uint8_t payload42T3VV[0x25] = { 0x90, 0x23, 0x40, 0x01, 0xA4, 0xE7, 0x6F, 0xE3, 0xA3, 0x18, 0x4C, 0xE0, 0x1C, 0x76, 0x47, 0x69, 0xC1, 0x43, 0x87, 0x39, 0xA3, 0x93, 0xCC, 0x24, 0xAA, 0x3F, 0x78, 0x1A, 0x97, 0xB0, 0x80, 0xE7, 0xC5, 0xA6, 0x76, 0xE7, 0x16 }; + l = do_cmd(reader, ins42T3VV, payload42T3VV, NULL, cta_res); + if(l < 0 || !status_ok(cta_res)) + { + rdr_log(reader, "classD1 ins42T3VV: failed"); + return ERROR; + } + } + // get PIN settings static const uint8_t ins7411[5] = { 0xD1, 0x74, 0x11, 0x00, 0x00 }; uint8_t payload2e4[4]; From f5d729601a77d4d6a44a86581c0e883f1d722be0 Mon Sep 17 00:00:00 2001 From: Pim Zandbergen Date: Sun, 5 Nov 2023 15:52:39 +0100 Subject: [PATCH 2/7] [trunk] Sync with 11722 --- .trunk-svn | 2 +- reader-videoguard-common.c | 45 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/.trunk-svn b/.trunk-svn index 282f47fe..105b54c1 100644 --- a/.trunk-svn +++ b/.trunk-svn @@ -1 +1 @@ -11721 +11722 diff --git a/reader-videoguard-common.c b/reader-videoguard-common.c index cf603863..4ca806cd 100644 --- a/reader-videoguard-common.c +++ b/reader-videoguard-common.c @@ -261,6 +261,51 @@ void set_known_card_info(struct s_reader *reader, const uint8_t *atr, const uint { { 0x3F, 0xFF, 0x14, 0x25, 0x03, 0x10, 0x80, 0x41, 0xB0, 0x07, 0x69, 0xFF, 0x4A, 0x50, 0x70, 0x80, 0x00, 0x58, 0x45, 0x01, 0x00, 0x14 }, 22, 2004, 0, NDS2, "VideoGuard OTE TV Sat (09BE)" }, + { { 0x3F, 0xFD, 0x11, 0x25, 0x02, 0x50, 0x80, 0x0F, 0x41, 0xB0, 0x0B, 0x69, 0xFF, 0x4A, 0x50, 0xD0, 0x80, 0x00, 0x33, 0x54, 0x83 }, + 21, 2008, 0, NDS2, "VideoGuard TrueVisions T3VV (0927)" }, + + { { 0x3F, 0xFD, 0x12, 0x25, 0x02, 0x50, 0x80, 0x0F, 0x41, 0xB0, 0x0B, 0x69, 0xFF, 0x4A, 0x50, 0xD0, 0x80, 0x00, 0x33, 0x54, 0x83 }, + 21, 2008, 0, NDS2, "VideoGuard TrueVisions T3VV (0927) FastMode" }, + + { { 0x3F, 0xFD, 0x13, 0x25, 0x02, 0x50, 0x80, 0x0F, 0x41, 0xB0, 0x0B, 0x69, 0xFF, 0x4A, 0x50, 0xD0, 0x80, 0x00, 0x33, 0x54, 0x83 }, + 21, 2008, 0, NDS2, "VideoGuard TrueVisions T3VV (0927) FastMode" }, + + { { 0x3F, 0xFD, 0x14, 0x25, 0x02, 0x50, 0x80, 0x0F, 0x41, 0xB0, 0x0B, 0x69, 0xFF, 0x4A, 0x50, 0xD0, 0x80, 0x00, 0x33, 0x54, 0x83 }, + 21, 2008, 0, NDS2, "VideoGuard TrueVisions T3VV (0927) FastMode" }, + + { { 0x3F, 0xFD, 0x15, 0x25, 0x02, 0x50, 0x80, 0x0F, 0x41, 0xB0, 0x0B, 0x69, 0xFF, 0x4A, 0x50, 0xD0, 0x80, 0x00, 0x33, 0x54, 0x83 }, + 21, 2008, 0, NDS2, "VideoGuard TrueVisions T3VV (0927) FastMode" }, + + { { 0x3F, 0xFD, 0x11, 0x25, 0x02, 0x50, 0x80, 0x0F, 0x41, 0xB0, 0x0B, 0x69, 0xFF, 0x4A, 0x50, 0xD0, 0x80, 0x00, 0x54, 0x33, 0x03 }, + 21, 2008, 0, NDS2, "VideoGuard TrueVisions T3TV (0927)" }, + + { { 0x3F, 0xFD, 0x12, 0x25, 0x02, 0x50, 0x80, 0x0F, 0x41, 0xB0, 0x0B, 0x69, 0xFF, 0x4A, 0x50, 0xD0, 0x80, 0x00, 0x54, 0x33, 0x03 }, + 21, 2008, 0, NDS2, "VideoGuard TrueVisions T3TV (0927) FastMode" }, + + { { 0x3F, 0xFD, 0x13, 0x25, 0x02, 0x50, 0x80, 0x0F, 0x41, 0xB0, 0x0B, 0x69, 0xFF, 0x4A, 0x50, 0xD0, 0x80, 0x00, 0x54, 0x33, 0x03 }, + 21, 2008, 0, NDS2, "VideoGuard TrueVisions T3TV (0927) FastMode" }, + + { { 0x3F, 0xFD, 0x14, 0x25, 0x02, 0x50, 0x80, 0x0F, 0x41, 0xB0, 0x0B, 0x69, 0xFF, 0x4A, 0x50, 0xD0, 0x80, 0x00, 0x54, 0x33, 0x03 }, + 21, 2008, 0, NDS2, "VideoGuard TrueVisions T3TV (0927) FastMode" }, + + { { 0x3F, 0xFD, 0x15, 0x25, 0x02, 0x50, 0x80, 0x0F, 0x41, 0xB0, 0x0B, 0x69, 0xFF, 0x4A, 0x50, 0xD0, 0x80, 0x00, 0x54, 0x33, 0x03 }, + 21, 2008, 0, NDS2, "VideoGuard TrueVisions T3TV (0927) FastMode" }, + + { { 0x3F, 0xFD, 0x11, 0x25, 0x02, 0x50, 0x80, 0x0F, 0x55, 0xB0, 0x02, 0x69, 0xFF, 0x4A, 0x50, 0xF0, 0x80, 0x00, 0x33, 0x54, 0x83 }, + 21, 2008, 0, NDS2, "VideoGuard TrueVisions T3VV (09BF)" }, + + { { 0x3F, 0xFD, 0x12, 0x25, 0x02, 0x50, 0x80, 0x0F, 0x55, 0xB0, 0x02, 0x69, 0xFF, 0x4A, 0x50, 0xF0, 0x80, 0x00, 0x33, 0x54, 0x83 }, + 21, 2008, 0, NDS2, "VideoGuard TrueVisions T3VV (09BF) FastMode" }, + + { { 0x3F, 0xFD, 0x13, 0x25, 0x02, 0x50, 0x80, 0x0F, 0x55, 0xB0, 0x02, 0x69, 0xFF, 0x4A, 0x50, 0xF0, 0x80, 0x00, 0x33, 0x54, 0x83 }, + 21, 2008, 0, NDS2, "VideoGuard TrueVisions T3VV (09BF) FastMode" }, + + { { 0x3F, 0xFD, 0x14, 0x25, 0x02, 0x50, 0x80, 0x0F, 0x55, 0xB0, 0x02, 0x69, 0xFF, 0x4A, 0x50, 0xF0, 0x80, 0x00, 0x33, 0x54, 0x83 }, + 21, 2008, 0, NDS2, "VideoGuard TrueVisions T3VV (09BF) FastMode" }, + + { { 0x3F, 0xFD, 0x15, 0x25, 0x02, 0x50, 0x80, 0x0F, 0x55, 0xB0, 0x02, 0x69, 0xFF, 0x4A, 0x50, 0xF0, 0x80, 0x00, 0x33, 0x54, 0x83 }, + 21, 2008, 0, NDS2, "VideoGuard TrueVisions T3VV (09BF) FastMode" }, + // NDS Version Unknown as Yet { { 0x3F, 0x7F, 0x13, 0x25, 0x02, 0x40, 0xB0, 0x12, 0x69, 0xFF, 0x4A, 0x50, 0x90, 0x41, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00 }, 20, 1997, 0, NDSUNKNOWN, "VideoGuard OnoCable Espana (0915)" }, From ff11d9d5947d32b9358a79a72e8cf4a664a007c7 Mon Sep 17 00:00:00 2001 From: Pim Zandbergen Date: Sun, 5 Nov 2023 15:55:28 +0100 Subject: [PATCH 3/7] [trunk] Sync with 11723 --- .trunk-svn | 2 +- globals.h | 1 + module-webif.c | 5 +++ oscam-config-reader.c | 31 ++++++++++++++++++- reader-videoguard-common.c | 2 +- reader-videoguard2.c | 9 +++--- .../readerconfig_hwreader_videoguard.html | 1 + 7 files changed, 43 insertions(+), 8 deletions(-) diff --git a/.trunk-svn b/.trunk-svn index 105b54c1..5b042d77 100644 --- a/.trunk-svn +++ b/.trunk-svn @@ -1 +1 @@ -11722 +11723 diff --git a/globals.h b/globals.h index 81f64d9f..b2b2ceac 100644 --- a/globals.h +++ b/globals.h @@ -1895,6 +1895,7 @@ struct s_reader // contains device info, reader info and card info int8_t readtiers; // method to get videoguard tiers uint8_t ins7E[0x1A + 1]; uint8_t ins7E11[0x01 + 1]; + uint8_t ins42[0x25 + 1]; uint8_t ins2e06[0x04 + 1]; int8_t ins7e11_fast_reset; uint8_t k1_generic[0x10 + 1]; // k1 for generic pairing mode diff --git a/module-webif.c b/module-webif.c index a8f88e97..52a90152 100644 --- a/module-webif.c +++ b/module-webif.c @@ -2900,6 +2900,11 @@ static char *send_oscam_reader_config(struct templatevars *vars, struct uriparam { for(i = 0; i < 26 ; i++) { tpl_printf(vars, TPLAPPEND, "INS7E", "%02X", rdr->ins7E[i]); } } + // ins42 + if(rdr->ins42[0x25]) + { + for(i = 0; i < 37 ; i++) { tpl_printf(vars, TPLAPPEND, "INS42", "%02X", rdr->ins42[i]); } + } // ins7E11 if(rdr->ins7E11[0x01]) diff --git a/oscam-config-reader.c b/oscam-config-reader.c index 1f8763da..ead187b8 100644 --- a/oscam-config-reader.c +++ b/oscam-config-reader.c @@ -1264,6 +1264,34 @@ static void ins7E_fn(const char *token, char *value, void *setting, long var_siz { fprintf_conf(f, token, "\n"); } } +static void ins42_fn(const char *token, char *value, void *setting, long var_size, FILE *f) +{ + uint8_t *var = setting; + var_size -= 1; // var_size contains sizeof(var) which is [X + 1] + if(value) + { + int32_t len = cs_strlen(value); + if(len != var_size * 2 || key_atob_l(value, var, len)) + { + if(len > 0) + { fprintf(stderr, "reader %s parse error, %s=%s\n", token, token, value); } + memset(var, 0, var_size + 1); + } + else + { + var[var_size] = 1; // found and correct + } + return; + } + if(var[var_size]) + { + char tmp[var_size * 2 + 1]; + fprintf_conf(f, token, "%s\n", cs_hexdump(0, var, var_size, tmp, sizeof(tmp))); + } + else if(cfg.http_full_cfg) + { fprintf_conf(f, token, "\n"); } +} + static void des_and_3des_key_fn(const char *token, char *value, void *setting, FILE *f) { uint8_t *var = setting; @@ -1844,6 +1872,7 @@ static const struct config_list reader_opts[] = DEF_OPT_INT8("cak7_mode" , OFS(cak7_mode), 0), DEF_OPT_FUNC_X("ins7e" , OFS(ins7E), ins7E_fn, SIZEOF(ins7E)), + DEF_OPT_FUNC_X("ins42" , OFS(ins42), ins42_fn, SIZEOF(ins42)), DEF_OPT_FUNC_X("ins7e11" , OFS(ins7E11), ins7E_fn, SIZEOF(ins7E11)), DEF_OPT_FUNC_X("ins2e06" , OFS(ins2e06), ins7E_fn, SIZEOF(ins2e06)), DEF_OPT_FUNC("k1_generic" , OFS(k1_generic), des_and_3des_key_fn), @@ -1953,7 +1982,7 @@ static bool reader_check_setting(const struct config_list *UNUSED(clist), void * static const char *hw_only_settings[] = { "readnano", "resetcycle", "smargopatch", "autospeed", "sc8in1_dtrrts_patch", "boxid","fix07", - "fix9993", "rsakey", "deskey", "ins7e", "ins7e11", "ins2e06", "k1_generic", "k1_unique", "force_irdeto", "needsemmfirst", "boxkey", + "fix9993", "rsakey", "deskey", "ins7e", "ins42", "ins7e11", "ins2e06", "k1_generic", "k1_unique", "force_irdeto", "needsemmfirst", "boxkey", "atr", "detect", "nagra_read", "mhz", "cardmhz", "readtiers", "read_old_classes", "use_gpio", "needsglobalfirst", #ifdef READER_NAGRA_MERLIN "mod1", "idird", "cmd0eprov", "mod2", "key3588", "key3460", "key3310", "data50", "mod50", "nuid", "forcepair", "otpcsc", "otacsc", "cwpkcaid", "cwekey0", "cwekey1", "cwekey2", "cwekey3", "cwekey4", "cwekey5", "cwekey6", "cwekey7", diff --git a/reader-videoguard-common.c b/reader-videoguard-common.c index 4ca806cd..3e1510b6 100644 --- a/reader-videoguard-common.c +++ b/reader-videoguard-common.c @@ -302,7 +302,7 @@ void set_known_card_info(struct s_reader *reader, const uint8_t *atr, const uint { { 0x3F, 0xFD, 0x14, 0x25, 0x02, 0x50, 0x80, 0x0F, 0x55, 0xB0, 0x02, 0x69, 0xFF, 0x4A, 0x50, 0xF0, 0x80, 0x00, 0x33, 0x54, 0x83 }, 21, 2008, 0, NDS2, "VideoGuard TrueVisions T3VV (09BF) FastMode" }, - + { { 0x3F, 0xFD, 0x15, 0x25, 0x02, 0x50, 0x80, 0x0F, 0x55, 0xB0, 0x02, 0x69, 0xFF, 0x4A, 0x50, 0xF0, 0x80, 0x00, 0x33, 0x54, 0x83 }, 21, 2008, 0, NDS2, "VideoGuard TrueVisions T3VV (09BF) FastMode" }, diff --git a/reader-videoguard2.c b/reader-videoguard2.c index d4a4681f..073b3516 100644 --- a/reader-videoguard2.c +++ b/reader-videoguard2.c @@ -1099,14 +1099,13 @@ static int32_t videoguard2_card_init(struct s_reader *reader, ATR *newatr) } } - if(reader->rom[0] == 0x54 && reader->rom[1] == 0x33 && reader->rom[2] == 0x56 && reader->rom[3] == 0x56) + if(reader->ins42[0x25]) { - static const uint8_t ins42T3VV[5] = { 0xD1, 0x42, 0x00, 0x00, 0x25 }; - static const uint8_t payload42T3VV[0x25] = { 0x90, 0x23, 0x40, 0x01, 0xA4, 0xE7, 0x6F, 0xE3, 0xA3, 0x18, 0x4C, 0xE0, 0x1C, 0x76, 0x47, 0x69, 0xC1, 0x43, 0x87, 0x39, 0xA3, 0x93, 0xCC, 0x24, 0xAA, 0x3F, 0x78, 0x1A, 0x97, 0xB0, 0x80, 0xE7, 0xC5, 0xA6, 0x76, 0xE7, 0x16 }; - l = do_cmd(reader, ins42T3VV, payload42T3VV, NULL, cta_res); + static const uint8_t ins42[5] = { 0xD1, 0x42, 0x00, 0x00, 0x25 }; + l = do_cmd(reader, ins42, reader->ins42, NULL, cta_res); if(l < 0 || !status_ok(cta_res)) { - rdr_log(reader, "classD1 ins42T3VV: failed"); + rdr_log(reader, "classD1 ins42: failed"); return ERROR; } } diff --git a/webif/readerconfig/readerconfig_hwreader_videoguard.html b/webif/readerconfig/readerconfig_hwreader_videoguard.html index c96f08a3..dfe7d3ec 100644 --- a/webif/readerconfig/readerconfig_hwreader_videoguard.html +++ b/webif/readerconfig/readerconfig_hwreader_videoguard.html @@ -24,5 +24,6 @@ ins7E11 TA1 Byte (1 byte): ins2E06 payload (4 bytes): ins7E payload (26 bytes): + ins42 payload (37 bytes): k1 for generic pairing mode (8 or 16 bytes): k1 for unique pairing mode (8 or 16 bytes): From 701046c08a7efc9eee6161a4041473ff04c1b0de Mon Sep 17 00:00:00 2001 From: Pim Zandbergen Date: Sun, 5 Nov 2023 15:56:58 +0100 Subject: [PATCH 4/7] [trunk] Sync with 11724 --- .trunk-svn | 2 +- globals.h | 2 +- module-webif.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.trunk-svn b/.trunk-svn index 5b042d77..a65dc9b1 100644 --- a/.trunk-svn +++ b/.trunk-svn @@ -1 +1 @@ -11723 +11724 diff --git a/globals.h b/globals.h index b2b2ceac..7a5eb84b 100644 --- a/globals.h +++ b/globals.h @@ -1895,7 +1895,7 @@ struct s_reader // contains device info, reader info and card info int8_t readtiers; // method to get videoguard tiers uint8_t ins7E[0x1A + 1]; uint8_t ins7E11[0x01 + 1]; - uint8_t ins42[0x25 + 1]; + uint8_t ins42[0x25 + 1]; uint8_t ins2e06[0x04 + 1]; int8_t ins7e11_fast_reset; uint8_t k1_generic[0x10 + 1]; // k1 for generic pairing mode diff --git a/module-webif.c b/module-webif.c index 52a90152..cc6d634f 100644 --- a/module-webif.c +++ b/module-webif.c @@ -2900,8 +2900,8 @@ static char *send_oscam_reader_config(struct templatevars *vars, struct uriparam { for(i = 0; i < 26 ; i++) { tpl_printf(vars, TPLAPPEND, "INS7E", "%02X", rdr->ins7E[i]); } } - // ins42 - if(rdr->ins42[0x25]) + // ins42 + if(rdr->ins42[0x25]) { for(i = 0; i < 37 ; i++) { tpl_printf(vars, TPLAPPEND, "INS42", "%02X", rdr->ins42[i]); } } From a1a28cde6306ee882bde3236f24dfddf8668e3b5 Mon Sep 17 00:00:00 2001 From: Pim Zandbergen Date: Sun, 5 Nov 2023 15:58:45 +0100 Subject: [PATCH 5/7] [trunk] Sync with 11725 --- .trunk-svn | 2 +- Makefile | 13 ++++++++---- csctapi/ifd_pcsc.c | 13 ++++++++++-- csctapi/io_serial.c | 51 +++++++++++++++++++++++++++++++++++++++------ globals.h | 3 +++ 5 files changed, 69 insertions(+), 13 deletions(-) diff --git a/.trunk-svn b/.trunk-svn index a65dc9b1..ff7e043f 100644 --- a/.trunk-svn +++ b/.trunk-svn @@ -1 +1 @@ -11724 +11725 diff --git a/Makefile b/Makefile index b65b55eb..103c8e64 100644 --- a/Makefile +++ b/Makefile @@ -123,10 +123,15 @@ ifeq ($(uname_S),FreeBSD) DEFAULT_LIBUSB_LIB = -lusb endif ifeq ($(uname_S),Darwin) - DEFAULT_LIBUSB_FLAGS = -I/opt/local/include - DEFAULT_LIBUSB_LIB = -L/opt/local/lib -lusb-1.0 - DEFAULT_PCSC_FLAGS = -isysroot $(OSX_SDK) - DEFAULT_PCSC_LIB = -isysroot $(OSX_SDK) -framework IOKit -framework CoreFoundation -framework PCSC + FIX_OPENSSL_FLAGS_DIR := $(shell ln -sf /usr/local/opt/openssl@1.1/include/openssl /usr/local/include) + FIX_OPENSSL_LIB_DIR := $(shell ln -sf /usr/local/opt/openssl@1.1/lib/libssl.1.1.dylib /usr/local/lib) + FIX_OPENSSL_LIBCRYPTO_DIR := $(shell ln -sf /usr/local/opt/openssl@1.1/lib/libcrypto.1.1.dylib /usr/local/lib) + DEFAULT_LIBCRYPTO_LIB = -L/usr/local/opt/openssl@1.1/lib -lcrypto + DEFAULT_SSL_LIB = -L/usr/local/opt/openssl@1.1/lib -lssl + DEFAULT_LIBUSB_FLAGS = -I/usr/local/opt/libusb/include + DEFAULT_LIBUSB_LIB = -L/usr/local/opt/libusb/lib -lusb-1.0 -framework IOKit -framework CoreFoundation -framework Security + DEFAULT_PCSC_FLAGS = -I/usr/local/opt/pcsc-lite/include/PCSC + DEFAULT_PCSC_LIB = -L/usr/local/opt/pcsc-lite/lib -framework IOKit -framework CoreFoundation -framework PCSC else # Get the compiler's last include PATHs. Basicaly it is /usr/include # but in case of cross compilation it might be something else. diff --git a/csctapi/ifd_pcsc.c b/csctapi/ifd_pcsc.c index 2a2b58fd..b8f77ffe 100644 --- a/csctapi/ifd_pcsc.c +++ b/csctapi/ifd_pcsc.c @@ -10,15 +10,24 @@ #define __nullnullterminated #include #include -#else +#endif + +#if !defined(__CYGWIN__) +#if !defined(__APPLE__) #include #include #include -#if !defined(__APPLE__) #include #endif #endif +#if defined(__APPLE__) +#include "pcsclite.h" +#include "winscard.h" +#include "wintypes.h" +#include "reader.h" +#endif + #ifndef ERR_INVALID #define ERR_INVALID -1 #endif diff --git a/csctapi/io_serial.c b/csctapi/io_serial.c index ab1fa5a3..5647af6e 100644 --- a/csctapi/io_serial.c +++ b/csctapi/io_serial.c @@ -43,6 +43,10 @@ #include "icc_async.h" #include "io_serial.h" +#if defined(__APPLE__) +#include +#endif + #define OK 0 #define ERROR 1 @@ -134,17 +138,14 @@ bool IO_Serial_DTR_RTS(struct s_reader *reader, int32_t *dtr, int32_t *rts) bool IO_Serial_SetBitrate(struct s_reader *reader, uint32_t bitrate, struct termios *tio) { /* Set the bitrate */ -#if defined(__linux__) - //FIXME workaround for Smargo until native mode works - if((reader->mhz == reader->cardmhz) && (reader->smargopatch != 1) && IO_Serial_Bitrate(bitrate) != B0) -#else +#if !defined(__linux__) +#if !defined(__APPLE__) if(IO_Serial_Bitrate(bitrate) == B0) { rdr_log(reader, "Baudrate %u not supported", bitrate); return ERROR; } else -#endif { //no overclocking cfsetospeed(tio, IO_Serial_Bitrate(bitrate)); @@ -152,7 +153,20 @@ bool IO_Serial_SetBitrate(struct s_reader *reader, uint32_t bitrate, struct term rdr_log_dbg(reader, D_DEVICE, "standard baudrate: cardmhz=%d mhz=%d -> effective baudrate %u", reader->cardmhz, reader->mhz, bitrate); } +#endif +#endif + + /* Set the bitrate */ #if defined(__linux__) + //FIXME workaround for Smargo until native mode works + if((reader->mhz == reader->cardmhz) && (reader->smargopatch != 1) && IO_Serial_Bitrate(bitrate) != B0) + { + //no overclocking + cfsetospeed(tio, IO_Serial_Bitrate(bitrate)); + cfsetispeed(tio, IO_Serial_Bitrate(bitrate)); + rdr_log_dbg(reader, D_DEVICE, "standard baudrate: cardmhz=%d mhz=%d -> effective baudrate %u", + reader->cardmhz, reader->mhz, bitrate); + } else { //over or underclocking @@ -186,6 +200,31 @@ bool IO_Serial_SetBitrate(struct s_reader *reader, uint32_t bitrate, struct term cfsetispeed(tio, IO_Serial_Bitrate(38400)); } #endif + + /* Set the bitrate */ +#if defined(__APPLE__) + if(IO_Serial_Bitrate(bitrate) == B0) + { + if(ioctl(reader->handle, IOSSIOSPEED, &bitrate) < 0) + { + rdr_log(reader, "Baudrate %u not supported", bitrate); + return ERROR; + } + else + { + rdr_log_dbg(reader, D_DEVICE, "custom baudrate: cardmhz=%d mhz=%d -> effective baudrate %u", + reader->cardmhz, reader->mhz, bitrate); + } + } + else + { + //no overclocking + cfsetospeed(tio, IO_Serial_Bitrate(bitrate)); + cfsetispeed(tio, IO_Serial_Bitrate(bitrate)); + rdr_log_dbg(reader, D_DEVICE, "standard baudrate: cardmhz=%d mhz=%d -> effective baudrate %u", + reader->cardmhz, reader->mhz, bitrate); + } +#endif return OK; } @@ -620,7 +659,7 @@ static int32_t IO_Serial_Bitrate(int32_t bitrate) { 115200, B115200 }, #endif #ifdef B76800 - { 76800, B76800 }, + { 76800, B76800 }, #endif #ifdef B57600 { 57600, B57600 }, diff --git a/globals.h b/globals.h index 7a5eb84b..6b4badea 100644 --- a/globals.h +++ b/globals.h @@ -36,7 +36,10 @@ #include #include #include + +#if !defined(__APPLE__) #include +#endif /* * The following hack is taken from Linux: include/linux/kconfig.h From f2d0e1d4c2d2c5c6751d1437c3c97bb8c988b10f Mon Sep 17 00:00:00 2001 From: Pim Zandbergen Date: Wed, 15 Nov 2023 19:00:52 +0100 Subject: [PATCH 6/7] [trunk] Sync with 11726 --- globals.h | 16 +++++++++ module-webif.c | 71 ++++++++++++++++++++++++++++++++++++++ oscam-work.c | 23 +++++++++++- oscam-work.h | 1 + reader-common.c | 11 ++++++ reader-common.h | 1 + reader-videoguard-common.c | 35 +++++++++++++------ reader-videoguard-common.h | 1 + reader-videoguard1.c | 6 ++++ reader-videoguard12.c | 6 ++++ reader-videoguard2.c | 6 ++++ 11 files changed, 165 insertions(+), 12 deletions(-) diff --git a/globals.h b/globals.h index 6b4badea..1cfed61b 100644 --- a/globals.h +++ b/globals.h @@ -63,6 +63,11 @@ # define WITH_LIBCRYPTO 1 #endif +/* For deprecated but still needed cryptography functions: + * 10002 corresponds to OpenSSL version 1.0.2*/ + +#define OPENSSL_API_COMPAT 10002 + #if defined(__CYGWIN__) || defined(__arm__) || defined(__SH4__) || defined(__MIPS__) || defined(__MIPSEL__) || defined(__powerpc__) # define CS_LOGFILE "/dev/tty" #endif @@ -412,6 +417,8 @@ #define MAX_EMM_SIZE 512 #endif +#define MAX_CMD_SIZE 0xff + 5 // maximum value from length byte + command header + #ifdef WITH_EMU #define CS_EMMCACHESIZE 1024 // nr of EMMs that EMU reader will cache #else @@ -904,6 +911,7 @@ typedef struct s_entitlement // contains entitlement Info struct s_client; struct ecm_request_t; struct emm_packet_t; +struct cmd_packet_t; struct s_ecm_answer; struct demux_s; @@ -1010,6 +1018,7 @@ struct s_cardsystem int32_t (*do_ecm)(struct s_reader *, const struct ecm_request_t *, struct s_ecm_answer *); int32_t (*do_emm_reassembly)(struct s_reader *, struct s_client *, struct emm_packet_t *); // Returns 1/true if the EMM is ready to be written in the card int32_t (*do_emm)(struct s_reader *, struct emm_packet_t *); + int32_t (*do_rawcmd)(struct s_reader *, struct cmd_packet_t *); void (*post_process)(struct s_reader *); int32_t (*get_emm_type)(struct emm_packet_t *, struct s_reader *); int32_t (*get_emm_filter)(struct s_reader *, struct s_csystem_emm_filter **, uint32_t *); @@ -1538,6 +1547,13 @@ typedef struct emm_packet_t struct s_client *client; } EMM_PACKET; +typedef struct cmd_packet_t +{ + uint8_t cmd[MAX_CMD_SIZE]; + int16_t cmdlen; + struct s_client *client; +} CMD_PACKET; + struct s_reader // contains device info, reader info and card info { uint8_t keepalive; diff --git a/module-webif.c b/module-webif.c index cc6d634f..e62b87be 100644 --- a/module-webif.c +++ b/module-webif.c @@ -8591,6 +8591,77 @@ static char *send_oscam_api(struct templatevars * vars, FILE * f, struct uripara return tpl_getTpl(vars, "APIERROR"); } } + else if(strcmp(getParam(params, "part"), "sendcmd") == 0) + { + if(strcmp(getParam(params, "label"), "")) + { + struct s_reader *rdr = get_reader_by_label(getParam(params, "label")); + if(rdr) + { + char api_msg[150]; + CMD_PACKET *cmd_pack = NULL; + if(!cs_malloc(&cmd_pack, sizeof(CMD_PACKET))) + { + tpl_addVar(vars, TPLADD, "APIERRORMESSAGE", "cs_malloc failed!"); + return tpl_getTpl(vars, "APIERROR"); + } + struct s_client *webif_client = cur_client(); + webif_client->grp = 0xFF; // access all readers + + memset(cmd_pack, '0', sizeof(CMD_PACKET)); + cmd_pack->client = webif_client; + cmd_pack->cmdlen = strlen(getParam(params, "cmd")) / 2; + + if(cmd_pack->cmdlen > 0 && abs(cmd_pack->cmdlen) <= sizeof(cmd_pack->cmd)) + { + if(key_atob_l(getParam(params, "cmd"), cmd_pack->cmd, cmd_pack->cmdlen*2)) + { + tpl_addVar(vars, TPLADD, "APIERRORMESSAGE", "'cmd' has not been sent due to wrong value!"); + return tpl_getTpl(vars, "APIERROR"); + } + } + else + { + if(cmd_pack->cmdlen) + { + snprintf(api_msg, sizeof(api_msg), "Command would exceed %lu bytes!", (long unsigned int)sizeof(cmd_pack->cmd)); + tpl_addVar(vars, TPLADD, "APIERRORMESSAGE", api_msg); + } + else + { + tpl_addVar(vars, TPLADD, "APIERRORMESSAGE", "Missing parameter 'cmd'!"); + } + return tpl_getTpl(vars, "APIERROR"); + } + + struct s_client *cl = rdr->client; + if(rdr->enable == 1 && cl && cl->typ == 'r') + { + add_job(cl, ACTION_READER_SENDCMD, cmd_pack, sizeof(CMD_PACKET)); + tpl_addVar(vars, TPLADD, "APICONFIRMMESSAGE", "command sent"); + return tpl_getTpl(vars, "APICONFIRMATION"); + } + else + { + snprintf(api_msg, sizeof(api_msg), "Reader '%s' is not suitable!", xml_encode(vars, rdr->label)); + tpl_addVar(vars, TPLADD, "APIERRORMESSAGE", api_msg); + return tpl_getTpl(vars, "APIERROR"); + } + } + else + { + //Send Errormessage + tpl_addVar(vars, TPLADD, "APIERRORMESSAGE", "no such reader"); + return tpl_getTpl(vars, "APIERROR"); + } + } + else + { + //Send Errormessage + tpl_addVar(vars, TPLADD, "APIERRORMESSAGE", "no reader selected"); + return tpl_getTpl(vars, "APIERROR"); + } + } else if(strcmp(getParam(params, "part"), "shutdown") == 0) { if((strcmp(strtolower(getParam(params, "action")), "restart") == 0) || diff --git a/oscam-work.c b/oscam-work.c index c6140abe..019a0527 100644 --- a/oscam-work.c +++ b/oscam-work.c @@ -126,7 +126,7 @@ void *work_thread(void *ptr) { return NULL; } cl->work_mbuf = mbuf; // Track locally allocated data, because some callback may call cs_exit/cs_disconect_client/pthread_exit and then mbuf would be leaked - int32_t n = 0, rc = 0, i, idx, s; + int32_t n = 0, rc = 0, i, idx, s, dblvl; uint8_t dcw[16]; int8_t restart_reader = 0; @@ -301,6 +301,27 @@ void *work_thread(void *ptr) reader_do_emm(reader, data->ptr); break; + case ACTION_READER_SENDCMD: + dblvl = cs_dblevel; + cs_dblevel = dblvl | D_READER; + rc = cardreader_do_rawcmd(reader, data->ptr); + cs_log_dbg(D_TRACE, "sendcmd rc: %i, csystem: %s", rc, reader->csystem->desc); + if(rc == -9) + { + CMD_PACKET *cp = data->ptr; + uint8_t response[MAX_CMD_SIZE]; + memset(response, 0, sizeof(response)); + uint16_t response_length[1] = { 0 }; + rc = reader_cmd2icc(reader, cp->cmd, cp->cmdlen, response, response_length); + cs_log_dbg(D_TRACE, "sendcmd rc: %i, len: %i", rc, *response_length); + if (*response_length) + { + cs_log_dump_dbg(D_TRACE, response, *response_length, "sendcmd response:"); + } + } + cs_dblevel = dblvl; + break; + case ACTION_READER_CARDINFO: reader_do_card_info(reader); break; diff --git a/oscam-work.h b/oscam-work.h index 3e2b3d16..f78d24f9 100644 --- a/oscam-work.h +++ b/oscam-work.h @@ -19,6 +19,7 @@ enum actions // Client actions ACTION_CLIENT_UDP = 22, // wc22 ACTION_CLIENT_TCP = 23, // wc23 + ACTION_READER_SENDCMD = 15, // wr15 ACTION_CLIENT_KILL = 24, // wc24 ACTION_CLIENT_INIT = 25, // wc25 ACTION_CLIENT_IDLE = 26, // wc26 diff --git a/reader-common.c b/reader-common.c index 68ba42da..cb6753f7 100644 --- a/reader-common.c +++ b/reader-common.c @@ -515,6 +515,17 @@ int32_t cardreader_do_emm(struct s_reader *reader, EMM_PACKET *ep) return (rc); } +int32_t cardreader_do_rawcmd(struct s_reader *reader, CMD_PACKET *cp) +{ + int32_t rc; + rc = -9; // means no dedicated support by csystem + if(reader->csystem_active && reader->csystem && reader->csystem->do_rawcmd) + { + rc = reader->csystem->do_rawcmd(reader, cp); + } + return (rc); +} + void cardreader_process_ecm(struct s_reader *reader, struct s_client *cl, ECM_REQUEST *er) { struct timeb tps, tpe; diff --git a/reader-common.h b/reader-common.h index 07605a21..69ea22b2 100644 --- a/reader-common.h +++ b/reader-common.h @@ -49,6 +49,7 @@ void cardreader_reset(struct s_client *cl); int32_t cardreader_do_checkhealth(struct s_reader *reader); void cardreader_checkhealth(struct s_client *cl, struct s_reader *rdr); int32_t cardreader_do_emm(struct s_reader *reader, EMM_PACKET *ep); +int32_t cardreader_do_rawcmd(struct s_reader *reader, CMD_PACKET *cp); void cardreader_process_ecm(struct s_reader *reader, struct s_client *cl, ECM_REQUEST *er); void cardreader_get_card_info(struct s_reader *reader); void cardreader_poll_status(struct s_reader *reader); diff --git a/reader-videoguard-common.c b/reader-videoguard-common.c index 3e1510b6..9875bf83 100644 --- a/reader-videoguard-common.c +++ b/reader-videoguard-common.c @@ -208,7 +208,7 @@ void set_known_card_info(struct s_reader *reader, const uint8_t *atr, const uint 22, 2004, 0, NDS2, "VideoGuard DSMART Turkey" }, { { 0x3F, 0xFF, 0x14, 0x25, 0x03, 0x10, 0x80, 0x54, 0xB0, 0x01, 0x69, 0xFF, 0x4A, 0x50, 0x70, 0x00, 0x00, 0x4B, 0x57, 0x01, 0x00, 0x00 }, - 22, 2004, 0, NDS2, "VideoGuard Vodafone Germany (098E)" }, + 22, 2020, 0, NDS2, "VideoGuard Vodafone Germany (098E)" }, { { 0x3F, 0xFF, 0x14, 0x25, 0x03, 0x10, 0x80, 0x33, 0xB0, 0x10, 0x69, 0xFF, 0x4A, 0x50, 0x70, 0x00, 0x00, 0x5A, 0x43, 0x01, 0x00, 0x00 }, 22, 2004, 0, NDS2, "VideoGuard totalTV Serbia (091F)" }, @@ -223,34 +223,34 @@ void set_known_card_info(struct s_reader *reader, const uint8_t *atr, const uint 22, 2004, 0, NDS2, "VideoGuard Teleclub (09B6)" }, { { 0x3F, 0xFD, 0x11, 0x25, 0x02, 0x50, 0x00, 0x03, 0x33, 0xB0, 0x15, 0x69, 0xFF, 0x4A, 0x50, 0xF0, 0x80, 0x03, 0x4B, 0x4C, 0x03 }, - 21, 2004, 0, NDS2, "VideoGuard Vodafone Germany G02/G09 (09C7)" }, + 21, 2020, 0, NDS2, "VideoGuard Vodafone Germany G02/G09 (09C7)" }, { { 0x3F, 0xFD, 0x12, 0x25, 0x02, 0x50, 0x00, 0x03, 0x33, 0xB0, 0x15, 0x69, 0xFF, 0x4A, 0x50, 0xF0, 0x80, 0x03, 0x4B, 0x4C, 0x03 }, - 21, 2004, 0, NDS2, "VideoGuard Vodafone Germany G02/G09 (09C7) FastMode" }, + 21, 2020, 0, NDS2, "VideoGuard Vodafone Germany G02/G09 (09C7) FastMode" }, { { 0x3F, 0xFD, 0x13, 0x25, 0x02, 0x50, 0x00, 0x03, 0x33, 0xB0, 0x15, 0x69, 0xFF, 0x4A, 0x50, 0xF0, 0x80, 0x03, 0x4B, 0x4C, 0x03 }, - 21, 2004, 0, NDS2, "VideoGuard Vodafone Germany G02/G09 (09C7) FastMode" }, + 21, 2020, 0, NDS2, "VideoGuard Vodafone Germany G02/G09 (09C7) FastMode" }, { { 0x3F, 0xFD, 0x14, 0x25, 0x02, 0x50, 0x00, 0x03, 0x33, 0xB0, 0x15, 0x69, 0xFF, 0x4A, 0x50, 0xF0, 0x80, 0x03, 0x4B, 0x4C, 0x03 }, - 21, 2004, 0, NDS2, "VideoGuard Vodafone Germany G02/G09 (09C7) FastMode" }, + 21, 2020, 0, NDS2, "VideoGuard Vodafone Germany G02/G09 (09C7) FastMode" }, { { 0x3F, 0xFD, 0x15, 0x25, 0x02, 0x50, 0x00, 0x03, 0x33, 0xB0, 0x15, 0x69, 0xFF, 0x4A, 0x50, 0xF0, 0x80, 0x03, 0x4B, 0x4C, 0x03 }, - 21, 2004, 0, NDS2, "VideoGuard Vodafone Germany G02/G09 (09C7) FastMode" }, + 21, 2020, 0, NDS2, "VideoGuard Vodafone Germany G02/G09 (09C7) FastMode" }, { { 0x3F, 0xFD, 0x11, 0x25, 0x02, 0x50, 0x80, 0x0F, 0x47, 0xB0, 0x02, 0x69, 0xFF, 0x4A, 0x50, 0xF0, 0x80, 0x00, 0x4B, 0x4C, 0x03 }, - 21, 2004, 0, NDS2, "VideoGuard Vodafone Germany G02/G09 (09EF)" }, + 21, 2020, 0, NDS2, "VideoGuard Vodafone Germany G02/G09 (09EF)" }, { { 0x3F, 0xFD, 0x12, 0x25, 0x02, 0x50, 0x80, 0x0F, 0x47, 0xB0, 0x02, 0x69, 0xFF, 0x4A, 0x50, 0xF0, 0x80, 0x00, 0x4B, 0x4C, 0x03 }, - 21, 2004, 0, NDS2, "VideoGuard Vodafone Germany G02/G09 (09EF) FastMode" }, + 21, 2020, 0, NDS2, "VideoGuard Vodafone Germany G02/G09 (09EF) FastMode" }, { { 0x3F, 0xFD, 0x13, 0x25, 0x02, 0x50, 0x80, 0x0F, 0x47, 0xB0, 0x02, 0x69, 0xFF, 0x4A, 0x50, 0xF0, 0x80, 0x00, 0x4B, 0x4C, 0x03 }, - 21, 2004, 0, NDS2, "VideoGuard Vodafone Germany G02/G09 (09EF) FastMode" }, + 21, 2020, 0, NDS2, "VideoGuard Vodafone Germany G02/G09 (09EF) FastMode" }, { { 0x3F, 0xFD, 0x14, 0x25, 0x02, 0x50, 0x80, 0x0F, 0x47, 0xB0, 0x02, 0x69, 0xFF, 0x4A, 0x50, 0xF0, 0x80, 0x00, 0x4B, 0x4C, 0x03 }, - 21, 2004, 0, NDS2, "VideoGuard Vodafone Germany G02/G09 (09EF) FastMode" }, + 21, 2020, 0, NDS2, "VideoGuard Vodafone Germany G02/G09 (09EF) FastMode" }, { { 0x3F, 0xFD, 0x15, 0x25, 0x02, 0x50, 0x80, 0x0F, 0x47, 0xB0, 0x02, 0x69, 0xFF, 0x4A, 0x50, 0xF0, 0x80, 0x00, 0x4B, 0x4C, 0x03 }, - 21, 2004, 0, NDS2, "VideoGuard Vodafone Germany G02/G09 (09EF) FastMode" }, + 21, 2020, 0, NDS2, "VideoGuard Vodafone Germany G02/G09 (09EF) FastMode" }, { { 0x3F, 0x7D, 0x13, 0x25, 0x02, 0x41, 0xB0, 0x03, 0x69, 0xFF, 0x4A, 0x50, 0xF0, 0x80, 0x00, 0x54, 0x37, 0x03 }, 18, 2004, 0, NDS2, "VideoGuard Telecolumbus (09AF)" }, @@ -990,6 +990,19 @@ int32_t do_cmd(struct s_reader *reader, const uint8_t *ins, const uint8_t *txbuf return len; } +int32_t videoguard_do_rawcmd(struct s_reader *reader, CMD_PACKET *cp) +{ + int32_t rc; + unsigned char cta_res[CTA_RES_LEN]; + memset(cta_res, 0, sizeof(cta_res)); + + reader->last_poll = time(0); // keep videoguard2_poll_status at bay, because it hurts consecutive commands + + rc = do_cmd(reader, cp->cmd, &cp->cmd[5], NULL, cta_res); + + return rc; +} + void rev_date_calc_tm(const uint8_t *Date, struct tm *timeinfo , int32_t base_year) { timeinfo->tm_year = Date[0] / 12 + base_year - 1900; // tm year starts at 1900 diff --git a/reader-videoguard-common.h b/reader-videoguard-common.h index 93814c35..74a3e9cc 100644 --- a/reader-videoguard-common.h +++ b/reader-videoguard-common.h @@ -66,6 +66,7 @@ extern int32_t cmd_table_get_info(struct s_reader *reader, const uint8_t *cmd, u extern int32_t cmd_exists(struct s_reader *reader, const uint8_t *cmd); extern int32_t read_cmd_len(struct s_reader *reader, const uint8_t *cmd); extern int32_t do_cmd(struct s_reader *reader, const uint8_t *ins, const uint8_t *txbuff, uint8_t *rxbuff, uint8_t *cta_res); +int32_t videoguard_do_rawcmd(struct s_reader *reader, CMD_PACKET *cp); extern void rev_date_calc_tm(const uint8_t *Date, struct tm *timeinfo , int32_t base_year); extern void set_known_card_info(struct s_reader *reader, const uint8_t *atr, const uint32_t *atr_size); diff --git a/reader-videoguard1.c b/reader-videoguard1.c index 10363422..9e585c80 100644 --- a/reader-videoguard1.c +++ b/reader-videoguard1.c @@ -360,6 +360,11 @@ static int32_t videoguard1_do_emm(struct s_reader *reader, EMM_PACKET *ep) return videoguard_do_emm(reader, ep, 0x48, read_tiers, vg1_do_cmd); } +static int32_t videoguard1_do_rawcmd(struct s_reader *reader, CMD_PACKET *cp) +{ + return videoguard_do_rawcmd(reader, cp); +} + static int32_t videoguard1_card_info(struct s_reader *reader) { /* info is displayed in init, or when processing info */ @@ -375,6 +380,7 @@ const struct s_cardsystem reader_videoguard1 = .desc = "videoguard1", .caids = (uint16_t[]){ 0x09, 0 }, .do_emm = videoguard1_do_emm, + .do_rawcmd = videoguard1_do_rawcmd, .do_ecm = videoguard1_do_ecm, .card_info = videoguard1_card_info, .card_init = videoguard1_card_init, diff --git a/reader-videoguard12.c b/reader-videoguard12.c index 2bd1abc3..19d5bab4 100644 --- a/reader-videoguard12.c +++ b/reader-videoguard12.c @@ -402,6 +402,11 @@ static int32_t videoguard12_do_emm(struct s_reader *reader, EMM_PACKET *ep) return videoguard_do_emm(reader, ep, 0x49, read_tiers, vg12_do_cmd); } +static int32_t videoguard12_do_rawcmd(struct s_reader *reader, CMD_PACKET *cp) +{ + return videoguard_do_rawcmd(reader, cp); +} + static int32_t videoguard12_card_info(struct s_reader *reader) { /* info is displayed in init, or when processing info */ @@ -417,6 +422,7 @@ const struct s_cardsystem reader_videoguard12 = .desc = "videoguard12", .caids = (uint16_t[]){ 0x09, 0 }, .do_emm = videoguard12_do_emm, + .do_rawcmd = videoguard12_do_rawcmd, .do_ecm = videoguard12_do_ecm, .card_info = videoguard12_card_info, .card_init = videoguard12_card_init, diff --git a/reader-videoguard2.c b/reader-videoguard2.c index 073b3516..6ad95bca 100644 --- a/reader-videoguard2.c +++ b/reader-videoguard2.c @@ -1568,6 +1568,11 @@ static int32_t videoguard2_do_emm(struct s_reader *reader, EMM_PACKET *ep) return videoguard_do_emm(reader, ep, 0xD1, vg2_read_tiers, do_cmd); } +static int32_t videoguard2_do_rawcmd(struct s_reader *reader, CMD_PACKET *cp) +{ + return videoguard_do_rawcmd(reader, cp); +} + static int32_t videoguard2_card_info(struct s_reader *reader) { // info is displayed in init, or when processing info @@ -1596,6 +1601,7 @@ const struct s_cardsystem reader_videoguard2 = .desc = "videoguard2", .caids = (uint16_t[]){ 0x09, 0 }, .do_emm = videoguard2_do_emm, + .do_rawcmd = videoguard2_do_rawcmd, .do_ecm = videoguard2_do_ecm, .card_info = videoguard2_card_info, .card_init = videoguard2_card_init, From 0467aa1d678a3c8bc8d40aa3d28e854681ff9b17 Mon Sep 17 00:00:00 2001 From: Pim Zandbergen Date: Wed, 15 Nov 2023 19:03:36 +0100 Subject: [PATCH 7/7] update .trunk-svn to 11726 --- .trunk-svn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.trunk-svn b/.trunk-svn index ff7e043f..c968c9c1 100644 --- a/.trunk-svn +++ b/.trunk-svn @@ -1 +1 @@ -11725 +11726