Add GPL-2-or-later license headers to the DOS utility source files and document the purpose and local dependencies of each C, header and assembler file. Preserve the original Martin Stover copyright attribution for the historic MARS-NWE utility sources, including files that did not previously carry an explicit header but are part of the original tool set. Add Mario Fetka as the 2026 copyright holder for the current maintenance work, and use Mario-only headers for files without original Martin Stover ownership. Also add a root-level COPYING file containing the GPL-2 license text.
144 lines
3.5 KiB
C
144 lines
3.5 KiB
C
/*
|
|
* mars-nwe-dosutils - NetWare/DOS utility tools.
|
|
*
|
|
* Copyright (C) 2026 Mario Fetka
|
|
* Copyright (C) 1993,1996 Martin Stover, Marburg, Germany
|
|
*
|
|
* 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, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Purpose: SLIST utility for listing visible NetWare file servers.
|
|
* Depends on: net.h, netcall.c requester helpers, ncpcall.c bindery/server helpers, tools.c shared utility routines.
|
|
*/
|
|
|
|
|
|
#include "net.h"
|
|
|
|
#define NCP_BINDERY_FSERVER 0x0004
|
|
|
|
static int usage(void)
|
|
{
|
|
fprintf(stdout, "Usage: SLIST [Server] [/Continue] \n");
|
|
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(same_arg(s, "/?") || same_arg(s, "-?") || same_arg(s, "?"));
|
|
}
|
|
|
|
static unsigned long node_to_number(uint8 *addr)
|
|
{
|
|
unsigned long n = 0;
|
|
int i;
|
|
|
|
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][%12lu]%s",
|
|
(unsigned long)GET_BE32(addr),
|
|
node_to_number(addr),
|
|
is_default ? "Default " : "");
|
|
}
|
|
|
|
int func_slist(int argc, char *argv[], int mode)
|
|
{
|
|
BINDERY_OBJECT obj;
|
|
uint32 last_id = MAX_U32;
|
|
uint8 pattern[50];
|
|
int explicit_server = 0;
|
|
int found = 0;
|
|
int result;
|
|
int i;
|
|
int continuous = 0;
|
|
int line_count = 0;
|
|
|
|
(void)mode;
|
|
|
|
strcpy(pattern, "*");
|
|
|
|
for (i = 1; i < argc; i++) {
|
|
if (is_help_arg(argv[i])) return(usage());
|
|
|
|
if (argv[i][0] == '/' || argv[i][0] == '-') {
|
|
if (same_arg(argv[i], "/C") || same_arg(argv[i], "/CONTINUE") ||
|
|
same_arg(argv[i], "-C") || same_arg(argv[i], "-CONTINUE")) {
|
|
continuous = 1;
|
|
continue;
|
|
}
|
|
return(usage());
|
|
}
|
|
|
|
strmaxcpy(pattern, argv[i], sizeof(pattern) - 1);
|
|
explicit_server = 1;
|
|
}
|
|
|
|
upstr(pattern);
|
|
|
|
while ((result = ncp_17_37(last_id, NCP_BINDERY_FSERVER,
|
|
pattern, &obj)) == 0) {
|
|
NW_PROPERTY prop;
|
|
|
|
found++;
|
|
last_id = obj.object_id;
|
|
|
|
if (found == 1) {
|
|
fprintf(stdout, "%-48sNetwork Node Address Status\n",
|
|
"Known NetWare File Servers");
|
|
fprintf(stdout, "%-48s------- ------------ ------\n",
|
|
"--------------------------");
|
|
}
|
|
|
|
fprintf(stdout, "%-47s", obj.object_name);
|
|
|
|
if (!ncp_17_3d(NCP_BINDERY_FSERVER, obj.object_name,
|
|
1, "NET_ADDRESS", &prop)) {
|
|
print_net_node_status(prop.value, found == 1);
|
|
}
|
|
|
|
fprintf(stdout, "\n");
|
|
tool_page_line(&line_count, &continuous);
|
|
|
|
if (last_id == MAX_U32) break;
|
|
}
|
|
|
|
if (explicit_server && !found) {
|
|
fprintf(stdout, "Server %s not found.\n", pattern);
|
|
return(0);
|
|
}
|
|
|
|
fprintf(stdout, "\nTotal of %d file servers found\n", found);
|
|
|
|
return(0);
|
|
}
|