From 36d566939cc7adc449080a6d0f4b97b778d349aa Mon Sep 17 00:00:00 2001 From: Mario Fetka Date: Fri, 22 May 2026 16:26:20 +0200 Subject: [PATCH] add slist --- CMakeLists.txt | 35 ++++++++++------- ncpcall.c | 103 +++++++++++++++++++++++++++++++++++++++++++++++++ net.c | 2 - net.h | 24 +++++++++++- slist.c | 58 +++++++++++++++++++++++++--- 5 files changed, 199 insertions(+), 23 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cc61315..2e3f4bc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,16 +1,14 @@ -# DOS utilities for mars-nwe. -# -# Default mode: install a prebuilt net.exe from this source tree. This keeps the -# normal mars-nwe build independent from Open Watcom. -# -# Maintainer mode: configure with -DMARS_NWE_BUILD_DOSUTILS=ON to rebuild -# net.exe with Open Watcom v2 on Linux. +################################# +# mars-dosutils +############## set(MARS_DOSUTILS_NET_EXE "${CMAKE_CURRENT_SOURCE_DIR}/net.exe" - CACHE FILEPATH "Prebuilt DOS net.exe used for installation when MARS_NWE_BUILD_DOSUTILS is OFF" + CACHE FILEPATH "Prebuilt DOS net.exe used for installation" ) +set(MARS_DOSUTILS_STACK_SIZE "32768" CACHE STRING "DOS stack size for mars-dosutils net.exe") + set(MARS_DOSUTILS_PUBLIC_TOOLS net login @@ -23,13 +21,11 @@ set(MARS_DOSUTILS_PUBLIC_TOOLS map mapdel logout + slist capture endcap ) -# Do not install slist.exe yet: func_slist() is empty and SLIST is disabled in net.c. -# Do not install tests/debug by default either; they are developer-only helpers. - if(MARS_NWE_BUILD_DOSUTILS) find_package(OpenWatcom REQUIRED) @@ -40,6 +36,7 @@ if(MARS_NWE_BUILD_DOSUTILS) ncpcall.c login.c map.c + slist.c nwcrypt.c nwdebug.c nwtests.c @@ -48,7 +45,11 @@ if(MARS_NWE_BUILD_DOSUTILS) add_custom_command( OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/kern.obj" - COMMAND "${CMAKE_COMMAND}" -E env ${OPENWATCOM_ENV} + COMMAND "${CMAKE_COMMAND}" -E env + "WATCOM=${OPENWATCOM_ROOT}" + "PATH=${OPENWATCOM_BINDIR}:$ENV{PATH}" + "INCLUDE=${OPENWATCOM_INCLUDE}" + "EDPATH=${OPENWATCOM_ROOT}/eddat" "${OPENWATCOM_WASM}" -q -zq @@ -61,14 +62,18 @@ if(MARS_NWE_BUILD_DOSUTILS) add_custom_command( OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/net.exe" - COMMAND "${CMAKE_COMMAND}" -E env ${OPENWATCOM_ENV} + COMMAND "${CMAKE_COMMAND}" -E env + "WATCOM=${OPENWATCOM_ROOT}" + "PATH=${OPENWATCOM_BINDIR}:$ENV{PATH}" + "INCLUDE=${OPENWATCOM_INCLUDE}" + "EDPATH=${OPENWATCOM_ROOT}/eddat" "${OPENWATCOM_WCL}" -q -zq -bt=dos -ml -0 - -k32768 + -k${MARS_DOSUTILS_STACK_SIZE} -fe="${CMAKE_CURRENT_BINARY_DIR}/net.exe" ${DOSUTILS_C_SOURCES} "${CMAKE_CURRENT_BINARY_DIR}/kern.obj" @@ -92,7 +97,7 @@ else() message(FATAL_ERROR "Prebuilt DOS utility missing: ${MARS_DOSUTILS_NET_EXE}. " "Either commit net.exe into dosutils or configure with " - "-DMARS_NWE_BUILD_DOSUTILS=ON and Open Watcom installed." + "-DMARS_NWE_BUILD_DOSUTILS=ON and OpenWatcom installed." ) endif() endif() diff --git a/ncpcall.c b/ncpcall.c index 2d5da94..3f93f0e 100644 --- a/ncpcall.c +++ b/ncpcall.c @@ -283,3 +283,106 @@ int ncp_17_4b(uint8 *cryptkey, uint8 *objname, uint16 objtyp, if (neterrno) return(-1); return(0); } + + +int ncp_17_37(uint32 last_id, uint16 objtyp, uint8 *pattern, + BINDERY_OBJECT *target) +/* scan bindery object */ +{ + struct { + uint16 len; + uint8 func; + uint8 last_id[4]; + uint8 typ[2]; + uint8 patlen; + uint8 pattern[48]; + } req; + struct { + uint16 len; + uint8 object_id[4]; + uint8 object_type[2]; + uint8 object_name[48]; + uint8 object_flags; + uint8 object_security; + uint8 object_has_prop; + } repl; + int patlen = (pattern) ? min(48, strlen(pattern)) : 1; + + memset(&req, 0, sizeof(req)); + memset(&repl, 0, sizeof(repl)); + + req.func = 0x37; + U32_TO_BE32(last_id, req.last_id); + U16_TO_BE16(objtyp, req.typ); + req.patlen = (uint8)patlen; + if (pattern) memcpy(req.pattern, pattern, patlen); + else req.pattern[0] = '*'; + req.len = 8 + patlen; + + repl.len = sizeof(repl) - sizeof(uint16); + + neterrno = Net_Call(0xE300, &req, &repl); + if (neterrno) return(-1); + + if (target) { + target->object_id = GET_BE32(repl.object_id); + target->object_type = GET_BE16(repl.object_type); + memcpy(target->object_name, repl.object_name, 48); + target->object_name[48] = '\0'; + deb(target->object_name); + target->object_flags = repl.object_flags; + target->object_security = repl.object_security; + target->object_has_prop = repl.object_has_prop; + } + return(0); +} + +int ncp_17_3d(uint16 objtyp, uint8 *objname, int segment, + uint8 *propname, NW_PROPERTY *target) +/* read bindery property value */ +{ + struct { + uint16 len; + uint8 func; + uint8 typ[2]; + uint8 buff[1+48+1+1+16]; + } req; + struct { + uint16 len; + uint8 value[128]; + uint8 more_flag; + uint8 property_flag; + } repl; + uint8 *p = req.buff; + int objlen = min(48, strlen(objname)); + int proplen = min(16, strlen(propname)); + + memset(&req, 0, sizeof(req)); + memset(&repl, 0, sizeof(repl)); + + req.func = 0x3d; + U16_TO_BE16(objtyp, req.typ); + + *p++ = (uint8)objlen; + memcpy(p, objname, objlen); + p += objlen; + + *p++ = (uint8)segment; + + *p++ = (uint8)proplen; + memcpy(p, propname, proplen); + + req.len = 6 + objlen + proplen; + repl.len = sizeof(repl) - sizeof(uint16); + + neterrno = Net_Call(0xE300, &req, &repl); + if (neterrno) return(-1); + + if (target) { + memcpy(target->value, repl.value, 128); + target->more_flag = repl.more_flag; + target->property_flag = repl.property_flag; + } + return(0); +} + diff --git a/net.c b/net.c index 7f5b918..4d66987 100644 --- a/net.c +++ b/net.c @@ -34,9 +34,7 @@ static struct s_net_functions { {"PATHDEL","removes search path" , func_path , 1}, {"PATHINS","insert search path" , func_path , 2}, {"LOGOUT", "logout from server", func_logout , 0}, -#if 0 {"SLIST", "list servers", func_slist , 0}, -#endif {"PASSWD", "change password", func_passwd , 0}, #if 1 {"TESTS", "only testroutines!", func_tests , 0}, diff --git a/net.h b/net.h index eb7bfe1..85f3bbe 100644 --- a/net.h +++ b/net.h @@ -58,7 +58,7 @@ typedef struct { uint16 fragment_count; /* Anzahl Fragment Buffers */ uint8 *fragment_1; uint16 fragment_1_size; - /* K”nnen auch mehr sein */ + /* K�nnen auch mehr sein */ } ECB; #include "kern.h" @@ -106,6 +106,24 @@ typedef struct { #define NWCLIENT 4 #define NWBIND 5 +#define NCP_BINDERY_FSERVER 0x0004 + +typedef struct { + uint32 object_id; + uint16 object_type; + uint8 object_name[49]; + uint8 object_flags; + uint8 object_security; + uint8 object_has_prop; +} BINDERY_OBJECT; + +typedef struct { + uint8 value[128]; + uint8 more_flag; + uint8 property_flag; +} NW_PROPERTY; + + /* net.c */ extern char *funcname; extern char prgpath[]; @@ -235,4 +253,8 @@ extern int func_tests (int argc, char *argv[], int mode); extern int func_capture(int argc, char *argv[], int mode); +extern int ncp_17_37(uint32 last_id, uint16 objtyp, uint8 *pattern, + BINDERY_OBJECT *target); +extern int ncp_17_3d(uint16 objtyp, uint8 *objname, int segment, + uint8 *propname, NW_PROPERTY *target); diff --git a/slist.c b/slist.c index dcc220d..7a3a4b1 100644 --- a/slist.c +++ b/slist.c @@ -1,15 +1,63 @@ -/* map.c 12-Jan-96 */ - -/**************************************************************** - * (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany * - ****************************************************************/ +/* slist.c - list known NetWare file servers, DOS mars-dosutils version */ #include "net.h" +static int usage(void) +{ + fprintf(stderr, "usage:\t%s [pattern]\n", funcname); + return(-1); +} + +static void print_net_node(uint8 *addr) +{ + fprintf(stdout, "%08lX %02X%02X%02X%02X%02X%02X", + (unsigned long)GET_BE32(addr), + addr[4], addr[5], addr[6], addr[7], addr[8], addr[9]); +} + int func_slist(int argc, char *argv[], int mode) { + BINDERY_OBJECT obj; + uint32 last_id = MAX_U32; + uint8 pattern[50]; + int found = 0; + int result; + (void)mode; + if (argc > 2) return(usage()); + if (argc == 2) strmaxcpy(pattern, argv[1], sizeof(pattern) - 1); + else strcpy(pattern, "*"); + upstr(pattern); + fprintf(stdout, "\n%-52s%-10s%-12s\n", + "Known NetWare File Servers", "Network", "Node Address"); + fprintf(stdout, + "-----------------------------------------------" + "---------------------------\n"); + + while ((result = ncp_17_37(last_id, NCP_BINDERY_FSERVER, + pattern, &obj)) == 0) { + NW_PROPERTY prop; + + found = 1; + last_id = obj.object_id; + + fprintf(stdout, "%-52s", obj.object_name); + + if (!ncp_17_3d(NCP_BINDERY_FSERVER, obj.object_name, + 1, "NET_ADDRESS", &prop)) { + print_net_node(prop.value); + } + + fprintf(stdout, "\n"); + + if (last_id == MAX_U32) break; + } + + if (!found) + fprintf(stdout, "No servers found\n"); + + return(0); }