From 1601a805136c50f2b712701318586c177be273a9 Mon Sep 17 00:00:00 2001 From: Mario Fetka Date: Fri, 22 May 2026 19:38:31 +0200 Subject: [PATCH] slist --- slist.c | 50 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/slist.c b/slist.c index 929c613..23e355a 100644 --- a/slist.c +++ b/slist.c @@ -10,17 +10,44 @@ static int usage(void) return(0); } +static int same_arg(char *a, char *b) +{ + while (*a || *b) { + int ca = *a++; + int cb = *b++; + if (ca >= 'a' && ca <= 'z') ca -= 32; + if (cb >= 'a' && cb <= 'z') cb -= 32; + if (ca != cb) return(0); + } + return(1); +} + static int is_help_arg(char *s) { if (!s) return(0); - return(!strcmp(s, "/?") || !strcmp(s, "-?") || !strcmp(s, "?")); + return(same_arg(s, "/?") || same_arg(s, "-?") || same_arg(s, "?")); +} + +static unsigned long node_to_number(uint8 *addr) +{ + unsigned long n = 0; + int i; + + /* + * Novell SLIST displays the node field right-aligned in a 12 character + * bracketed field. For a node like 000000000001 this appears as " 1". + */ + for (i = 4; i < 10; i++) + n = (n << 8) + addr[i]; + + return(n); } static void print_net_node_status(uint8 *addr, int is_default) { - fprintf(stdout, "[%08lX][%02X%02X%02X%02X%02X%02X]%s", + fprintf(stdout, "[%08lX][%12lu]%s", (unsigned long)GET_BE32(addr), - addr[4], addr[5], addr[6], addr[7], addr[8], addr[9], + node_to_number(addr), is_default ? "Default" : ""); } @@ -41,8 +68,8 @@ int func_slist(int argc, char *argv[], int mode) if (is_help_arg(argv[i])) return(usage()); if (argv[i][0] == '/' || argv[i][0] == '-') { - if (!stricmp(argv[i], "/C") || !stricmp(argv[i], "/CONTINUE") || - !stricmp(argv[i], "-C") || !stricmp(argv[i], "-CONTINUE")) { + if (same_arg(argv[i], "/C") || same_arg(argv[i], "/CONTINUE") || + same_arg(argv[i], "-C") || same_arg(argv[i], "-CONTINUE")) { continue; } return(usage()); @@ -53,8 +80,12 @@ int func_slist(int argc, char *argv[], int mode) upstr(pattern); - fprintf(stdout, "Known NetWare File Servers Network Node Address Status\n"); - fprintf(stdout, "-------------------------------------------- -------- ----------------------\n"); + /* + * Match Novell SLIST spacing closely: + * name column 44 chars, then Network / Node Address / Status. + */ + fprintf(stdout, "Known NetWare File Servers Network Node Address Status\n"); + fprintf(stdout, "------------------------- -------- -------------------\n"); while ((result = ncp_17_37(last_id, NCP_BINDERY_FSERVER, pattern, &obj)) == 0) { @@ -67,11 +98,6 @@ int func_slist(int argc, char *argv[], int mode) if (!ncp_17_3d(NCP_BINDERY_FSERVER, obj.object_name, 1, "NET_ADDRESS", &prop)) { - /* - * We only have one active connection in mars-dosutils, so mark the - * first/current server as Default. This matches the useful Novell - * output closely enough for scripts and humans. - */ print_net_node_status(prop.value, found == 1); }