diff --git a/CMakeLists.txt b/CMakeLists.txt index 695802c..6c7f42b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -117,3 +117,8 @@ install(FILES "${MARS_DOSUTILS_NET_EXE}" install(FILES "${MARS_DOSUTILS_NET_EXE}" DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/login" RENAME map.exe) + +install(FILES "${MARS_DOSUTILS_NET_EXE}" + DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/login" + RENAME slist.exe) + diff --git a/slist.c b/slist.c index 7a3a4b1..929c613 100644 --- a/slist.c +++ b/slist.c @@ -2,17 +2,26 @@ #include "net.h" +#define NCP_BINDERY_FSERVER 0x0004 + static int usage(void) { - fprintf(stderr, "usage:\t%s [pattern]\n", funcname); - return(-1); + fprintf(stdout, "Usage: SLIST [Server] [/Continue]\n"); + return(0); } -static void print_net_node(uint8 *addr) +static int is_help_arg(char *s) { - fprintf(stdout, "%08lX %02X%02X%02X%02X%02X%02X", + if (!s) return(0); + return(!strcmp(s, "/?") || !strcmp(s, "-?") || !strcmp(s, "?")); +} + +static void print_net_node_status(uint8 *addr, int is_default) +{ + fprintf(stdout, "[%08lX][%02X%02X%02X%02X%02X%02X]%s", (unsigned long)GET_BE32(addr), - addr[4], addr[5], addr[6], addr[7], addr[8], addr[9]); + addr[4], addr[5], addr[6], addr[7], addr[8], addr[9], + is_default ? "Default" : ""); } int func_slist(int argc, char *argv[], int mode) @@ -22,33 +31,48 @@ int func_slist(int argc, char *argv[], int mode) uint8 pattern[50]; int found = 0; int result; + int i; (void)mode; - if (argc > 2) return(usage()); + strcpy(pattern, "*"); + + for (i = 1; i < argc; i++) { + 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")) { + continue; + } + return(usage()); + } + + strmaxcpy(pattern, argv[i], sizeof(pattern) - 1); + } - 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"); + 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) { NW_PROPERTY prop; - found = 1; + found++; last_id = obj.object_id; - fprintf(stdout, "%-52s", obj.object_name); + fprintf(stdout, "%-44s", obj.object_name); if (!ncp_17_3d(NCP_BINDERY_FSERVER, obj.object_name, 1, "NET_ADDRESS", &prop)) { - print_net_node(prop.value); + /* + * 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); } fprintf(stdout, "\n"); @@ -56,8 +80,7 @@ int func_slist(int argc, char *argv[], int mode) if (last_id == MAX_U32) break; } - if (!found) - fprintf(stdout, "No servers found\n"); + fprintf(stdout, "\nTotal of %d file servers found\n", found); return(0); }