dosutils: add maintainer helpers and compare-ready tools

Add maintainer-only support used by the automated DOS compatibility
tests.

This introduces the MAINTAINER_BUILD option for the DOS tools. In
maintainer builds, LOGIN accepts the hidden /PWD: and /PASSWORD:
arguments for automated test relogin, and the DLYSTRT helper is built to
delay-start DOS batch files after the invoking batch has returned to the
prompt.

Add the WHOAMI utility and wire it into the NET command dispatch. Also
adjust SLIST and RIGHTS output to match Novell behavior more closely,
including server-not-found handling, path formatting, Supervisor rights,
missing-path errors and usage text.

Extend the test scripts to compare NPUBLIC Novell baselines against the
PUBLIC implementations. LOGIN/LOGOUT can now run automatically via
DLYSTRT and the maintainer LOGIN password option. RIGHTS gains an
additional NOPASSUSER effective-rights matrix that covers single rights,
mixed rights, Supervisor rights, ALL/N and file trustee cases.

Normal builds remain free of maintainer-only helpers and hidden password
handling.
This commit is contained in:
Mario Fetka
2026-05-27 20:14:01 +02:00
parent f214e89d69
commit 4ad455c6df
21 changed files with 1704 additions and 322 deletions

View File

@@ -8,6 +8,8 @@
# built binary is only installed when MARS_NWE_INSTALL_NEW_DOSUTILS is ON, or
# for the new-only command names in the default split install.
option(MAINTAINER_BUILD "Enable maintainer-only DOS tool helpers and diagnostics" OFF)
set(MARS_DOSUTILS_LEGACY_NET_EXE
"${CMAKE_CURRENT_SOURCE_DIR}/netold.exe"
CACHE FILEPATH "Legacy/pre-Client32 DOS net.exe used by default for legacy command names"
@@ -46,6 +48,7 @@ set(MARS_DOSUTILS_NEW_ONLY_TOOLS
remove
ndir
creator
whoami
)
if(MARS_NWE_BUILD_DOSUTILS)
@@ -73,6 +76,7 @@ if(MARS_NWE_BUILD_DOSUTILS)
nwtests.c
capture.c
creator.c
whoami.c
)
add_custom_command(
@@ -94,6 +98,11 @@ if(MARS_NWE_BUILD_DOSUTILS)
set(obj "${CMAKE_CURRENT_BINARY_DIR}/${obj_name}.obj")
list(APPEND DOSUTILS_OBJECTS "${obj}")
set(DOSUTILS_WCL_DEFS)
if(MAINTAINER_BUILD)
list(APPEND DOSUTILS_WCL_DEFS -dMAINTAINER_BUILD)
endif()
add_custom_command(
OUTPUT "${obj}"
COMMAND "${CMAKE_COMMAND}" -E env ${OPENWATCOM_ENV}
@@ -103,6 +112,7 @@ if(MARS_NWE_BUILD_DOSUTILS)
-bt=dos
-ml
-0
${DOSUTILS_WCL_DEFS}
-c
-fo="${obj}"
"${CMAKE_CURRENT_SOURCE_DIR}/${src}"
@@ -142,6 +152,29 @@ if(MARS_NWE_BUILD_DOSUTILS)
)
set(MARS_DOSUTILS_BUILT_NET_EXE "${CMAKE_CURRENT_BINARY_DIR}/net.exe")
if(MAINTAINER_BUILD)
add_custom_command(
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/dlystrt.exe"
COMMAND "${CMAKE_COMMAND}" -E env ${OPENWATCOM_ENV}
"${OPENWATCOM_WCL}"
-q
-zq
-bt=dos
-ms
-0
-dMAINTAINER_BUILD
-fe="${CMAKE_CURRENT_BINARY_DIR}/dlystrt.exe"
"${CMAKE_CURRENT_SOURCE_DIR}/dlystrt.c"
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/dlystrt.c"
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
VERBATIM
)
add_custom_target(dlystrt ALL
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/dlystrt.exe"
)
endif()
else()
set(MARS_DOSUTILS_BUILT_NET_EXE "")
endif()
@@ -217,4 +250,10 @@ if(MARS_NWE_INSTALL_DOSUTILS)
install(FILES "${MARS_DOSUTILS_SELECTED_LEGACY_EXE}"
DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/login"
RENAME slist.exe)
if(MAINTAINER_BUILD AND MARS_NWE_BUILD_DOSUTILS)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/dlystrt.exe"
DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public"
RENAME dlystrt.exe)
endif()
endif()

173
dlystrt.c Normal file
View File

@@ -0,0 +1,173 @@
/* dlystrt.c - maintainer-only delayed DOS command starter.
*
* This is a tiny TSR helper for login/logout tests. It waits a short
* time, then stuffs a command line into the BIOS keyboard buffer. The
* command is therefore executed by the command processor after the batch
* file that installed DLYSTRT has already returned to the DOS prompt.
*
* Example:
* DLYSTRT /T:2 C:\\LGNTC.BAT
*
* The tool is intended for MAINTAINER_BUILD only and is not installed in
* normal builds.
*/
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <i86.h>
#ifndef MAINTAINER_BUILD
int main(void)
{
puts("DLYSTRT is only available in maintainer builds.");
return 1;
}
#else
#define MAX_CMD 126
#define BIOS_SEG 0x0040
#define KB_HEAD 0x001a
#define KB_TAIL 0x001c
#define KB_BUF 0x001e
#define KB_END 0x003e
typedef void (__interrupt __far *intr_fn)(void);
static intr_fn old_int1c;
static volatile unsigned wait_ticks;
static volatile unsigned pos;
static volatile unsigned done;
static char command[MAX_CMD + 3];
static int strnicmp_local(const char *a, const char *b, int n)
{
int ca, cb;
while (n-- > 0) {
ca = toupper((unsigned char)*a++);
cb = toupper((unsigned char)*b++);
if (ca != cb || ca == 0 || cb == 0) return ca - cb;
}
return 0;
}
static int kb_put_char(char ch)
{
unsigned far *headp = (unsigned far *)MK_FP(BIOS_SEG, KB_HEAD);
unsigned far *tailp = (unsigned far *)MK_FP(BIOS_SEG, KB_TAIL);
unsigned far *bufp;
unsigned head = *headp;
unsigned tail = *tailp;
unsigned next = tail + 2;
if (next >= KB_END) next = KB_BUF;
if (next == head) return 0; /* keyboard buffer full */
bufp = (unsigned far *)MK_FP(BIOS_SEG, tail);
*bufp = (unsigned)((unsigned char)ch); /* scan code 0, ASCII ch */
*tailp = next;
return 1;
}
static void raw_restore_vector(void)
{
intr_fn __far *vecp;
if (!old_int1c) return;
/* Do not call DOS from the timer interrupt. Restore the IVT entry
* directly, then leave the TSR out of the interrupt path before the
* delayed command is executed.
*/
_disable();
vecp = (intr_fn __far *)MK_FP(0x0000, 0x1c * 4);
*vecp = old_int1c;
_enable();
}
static void __interrupt __far dly_int1c(void)
{
intr_fn prev = old_int1c;
if (!done) {
if (wait_ticks) {
wait_ticks--;
} else {
if (command[pos]) {
if (kb_put_char(command[pos])) pos++;
} else {
/* One-shot: unhook before pressing Enter so the command that gets
* started by COMMAND.COM runs without DLYSTRT still sitting on INT 1Ch.
*/
done = 1;
raw_restore_vector();
kb_put_char('\r');
}
}
}
if (prev) prev();
}
static void usage(void)
{
puts("Usage: DLYSTRT [/T:seconds] command [args]");
puts("Maintainer helper: delay-start a command after returning to DOS.");
}
static void build_command(int argc, char **argv, int first)
{
int i;
command[0] = '\0';
for (i = first; i < argc; i++) {
if (command[0]) strncat(command, " ", MAX_CMD - strlen(command));
strncat(command, argv[i], MAX_CMD - strlen(command));
}
command[MAX_CMD] = '\0';
}
int main(int argc, char **argv)
{
unsigned seconds = 2;
int first = 1;
unsigned paras;
if (argc < 2) {
usage();
return 1;
}
if (!strnicmp_local(argv[first], "/T:", 3)) {
seconds = (unsigned)atoi(argv[first] + 3);
if (seconds == 0) seconds = 1;
first++;
}
if (first >= argc) {
usage();
return 1;
}
build_command(argc, argv, first);
wait_ticks = seconds * 18;
pos = 0;
done = 0;
old_int1c = _dos_getvect(0x1c);
_dos_setvect(0x1c, dly_int1c);
printf("DLYSTRT installed: %s\n", command);
/* Keep a small fixed amount resident. This maintainer helper is tiny;
* 256 paragraphs = 4 KiB is enough for code, data and the command buffer
* in the small DOS model used here.
*/
paras = 256;
_dos_keep(0, paras);
return 0;
}
#endif /* MAINTAINER_BUILD */

0
doc/README Executable file → Normal file
View File

62
login.c
View File

@@ -714,12 +714,60 @@ static int login_usage(void)
return(login_help());
}
#ifdef MAINTAINER_BUILD
static int login_hidden_password_arg(char *arg, uint8 *passwd, int passwd_size)
{
char *value = NULL;
if (!strnicmp(arg, "/PASSWORD:", 10) || !strnicmp(arg, "-PASSWORD:", 10))
value = arg + 10;
else if (!strnicmp(arg, "/PWD:", 5) || !strnicmp(arg, "-PWD:", 5))
value = arg + 5;
if (value != NULL) {
strmaxcpy(passwd, value, passwd_size - 1);
memset(arg, 0, strlen(arg));
return(1);
}
return(0);
}
static int login_extract_hidden_password(int *argc, char *argv[],
uint8 *passwd, int passwd_size)
{
int i;
passwd[0] = '\0';
for (i = 1; i < *argc; i++) {
if (login_hidden_password_arg(argv[i], passwd, passwd_size)) {
int j;
for (j = i; j < (*argc - 1); j++)
argv[j] = argv[j + 1];
argv[*argc - 1] = NULL;
(*argc)--;
return(1);
}
}
return(0);
}
#endif
int func_login(int argc, char *argv[], int mode)
{
int result=-1;
int option=0;
uint8 uname[200];
uint8 upasswd[200];
#ifdef MAINTAINER_BUILD
uint8 hidden_passwd[200];
int have_hidden_passwd = 0;
#endif
SEARCH_VECTOR save_drives;
int interactive_login = 0;
int no_script = 0;
@@ -733,6 +781,12 @@ int func_login(int argc, char *argv[], int mode)
}
}
#ifdef MAINTAINER_BUILD
have_hidden_passwd = login_extract_hidden_password(&argc, argv,
hidden_passwd,
sizeof(hidden_passwd));
#endif
if (argc > 1) {
if (argv[1][0] == '-' || argv[1][0] == '/') {
if (argv[1][1] == 'u' || argv[1][1] == 'U') option |= 1;
@@ -747,6 +801,10 @@ int func_login(int argc, char *argv[], int mode)
remove_nwpathes();
if (argc > 1) strmaxcpy(uname, argv[1], sizeof(uname) -1);
else uname[0]='\0';
#ifdef MAINTAINER_BUILD
if (have_hidden_passwd) strmaxcpy(upasswd, hidden_passwd, sizeof(upasswd) -1);
else
#endif
if (argc > 2) strmaxcpy(upasswd, argv[2], sizeof(upasswd) -1);
else upasswd[0]='\0';
@@ -788,6 +846,10 @@ int func_login(int argc, char *argv[], int mode)
} else {
(void)set_search_drive_vektor(save_drives);
}
#ifdef MAINTAINER_BUILD
memset(hidden_passwd, 0, sizeof(hidden_passwd));
#endif
memset(upasswd, 0, sizeof(upasswd));
return(result);
}

1
net.c
View File

@@ -43,6 +43,7 @@ static struct s_net_functions {
{"RIGHTS", "display effective file/directory rights",func_rights, 0},
{"CREATOR","display or set creator/modifier/archive ids",func_creator,0},
{"SLIST", "list servers", func_slist , 0},
{"WHOAMI", "show current NetWare user", func_whoami , 0},
{"PASSWD", "change password", func_passwd , 0},
#if 1
{"TESTS", "only testroutines!", func_tests , 0},

BIN
net.exe

Binary file not shown.

1
net.h
View File

@@ -263,6 +263,7 @@ extern int read_command_file(char *fstr);
/* slist.c */
extern int func_slist (int argc, char *argv[], int mode);
extern int func_whoami(int argc, char *argv[], int mode);
extern int func_ndir (int argc, char *argv[], int mode);
/* nwdebug.c */

101
rights.c
View File

@@ -31,13 +31,14 @@
#define NCP_RIGHT_SUPER 0x0100
static uint8 rights_map_ncp_mask(uint16 ncp_rights);
static void rights_ncp_path(char *dst, char *src, int max);
static void rights_usage(void)
{
fprintf(stdout, "Usage: RIGHTS [path]\n\n");
fprintf(stdout, "Rights = All | Supervisor | Read | Write | Create | Erase\n");
fprintf(stdout, " Modify | File scan | Access Control\n");
fprintf(stdout, "\nUsage: RIGHTS [path]\n \n");
fprintf(stdout, " Rights = All | Supervisor | Read | Write | Create | Erase\n");
fprintf(stdout, " | Modify | File scan | Access Control\n");
}
static void rights_parent_path(char *dst, char *src, int max)
@@ -65,19 +66,58 @@ static void rights_parent_path(char *dst, char *src, int max)
strmaxcpy(dst, tmp, max - 1);
}
static int rights_path_is_dir(char *path)
static void rights_ncp_path(char *dst, char *src, int max)
{
struct stat st;
char up[260];
char *p;
if (tool_is_current_path(path))
return(1);
if (stat(path, &st) == 0) {
if (st.st_mode & S_IFDIR)
return(1);
if (tool_is_current_path(src)) {
dst[0] = '\0';
return;
}
return(0);
tool_upcopy(up, src, sizeof(up));
p = up;
if (p[0] && p[1] == ':') {
p += 2;
if (*p == '\\') p++;
}
while (*p == '\\') p++;
strmaxcpy(dst, p, max - 1);
}
static int rights_get_ncp_info(char *path, C32_NDIR_INFO *info)
{
uint8 connid = 0;
uint8 dhandle = 0;
char npath[260];
if (!info)
return(1);
memset(info, 0, sizeof(*info));
if (tool_current_dhandle(&connid, &dhandle))
return(1);
rights_ncp_path(npath, path, sizeof(npath));
return(c32_ncp87_obtain_ndir_info(npath, (uint16)dhandle,
info, NULL, NULL, NULL));
}
static int rights_path_exists(char *path, int *is_dir)
{
C32_NDIR_INFO info;
if (rights_get_ncp_info(path, &info))
return(0);
if (is_dir)
*is_dir = (info.attributes & 0x10) ? 1 : 0;
return(1);
}
@@ -101,7 +141,8 @@ static int rights_effective_mask(char *path, int is_dir, uint8 *mask)
* It works for both files and directories, so pass the requested path
* itself instead of mapping files to their parent directory.
*/
if (!c32_ncp87_get_effective_rights(tool_is_current_path(path) ? "" : path,
rights_ncp_path(usepath, path, sizeof(usepath));
if (!c32_ncp87_get_effective_rights(usepath,
(uint16)dhandle,
&ncp_rights,
NULL, NULL, NULL)) {
@@ -117,9 +158,11 @@ static int rights_effective_mask(char *path, int is_dir, uint8 *mask)
if (tool_is_current_path(path)) {
usepath[0] = '\0';
} else if (is_dir) {
tool_upcopy(usepath, path, sizeof(usepath));
rights_ncp_path(usepath, path, sizeof(usepath));
} else {
rights_parent_path(usepath, path, sizeof(usepath));
char npath[260];
rights_ncp_path(npath, path, sizeof(npath));
rights_parent_path(usepath, npath, sizeof(usepath));
}
newhandle = alloc_temp_dir_handle(dhandle, usepath, 0, &eff);
@@ -164,14 +207,14 @@ static uint8 rights_map_ncp_mask(uint16 ncp_rights)
static void rights_mask_string(uint8 mask, char *out)
{
out[0] = (mask & NW_RIGHT_S) ? 'S' : '-';
out[1] = (mask & NW_RIGHT_R) ? 'R' : '-';
out[2] = (mask & NW_RIGHT_W) ? 'W' : '-';
out[3] = (mask & NW_RIGHT_C) ? 'C' : '-';
out[4] = (mask & NW_RIGHT_E) ? 'E' : '-';
out[5] = (mask & NW_RIGHT_M) ? 'M' : '-';
out[6] = (mask & NW_RIGHT_F) ? 'F' : '-';
out[7] = (mask & NW_RIGHT_A) ? 'A' : '-';
out[0] = (mask & NW_RIGHT_S) ? 'S' : ' ';
out[1] = (mask & NW_RIGHT_R) ? 'R' : ' ';
out[2] = (mask & NW_RIGHT_W) ? 'W' : ' ';
out[3] = (mask & NW_RIGHT_C) ? 'C' : ' ';
out[4] = (mask & NW_RIGHT_E) ? 'E' : ' ';
out[5] = (mask & NW_RIGHT_M) ? 'M' : ' ';
out[6] = (mask & NW_RIGHT_F) ? 'F' : ' ';
out[7] = (mask & NW_RIGHT_A) ? 'A' : ' ';
out[8] = '\0';
}
@@ -217,7 +260,7 @@ static void rights_display(char *path, int is_dir, uint8 mask)
rights_print_line(mask & NW_RIGHT_A, 0, "May Change Access Control.", 'A');
fprintf(stdout, "\n");
fprintf(stdout, " * Has no effect on directory.\n\n");
fprintf(stdout, "* Has no effect on directory.\n\n");
fprintf(stdout, " Entries in Directory May Inherit [%s] rights.\n", mstr);
if (mask == 0xff)
fprintf(stdout, " You have ALL RIGHTS to Directory Entry.\n");
@@ -232,7 +275,7 @@ static void rights_display(char *path, int is_dir, uint8 mask)
rights_print_line(mask & NW_RIGHT_A, 0, "May Change Access Control.", 'A');
fprintf(stdout, "\n");
fprintf(stdout, " * Create is necessary to salvage a file that has been deleted.\n\n");
fprintf(stdout, "* Create is necessary to salvage a file that has been deleted.\n\n");
if (mask == 0xff)
fprintf(stdout, " You have ALL RIGHTS to Directory Entry.\n");
}
@@ -247,6 +290,7 @@ int func_rights(int argc, char *argv[], int mode)
(void)mode;
if (argc > 2) {
fprintf(stdout, "Too many parameters on command line.\n");
rights_usage();
return(1);
}
@@ -259,10 +303,15 @@ int func_rights(int argc, char *argv[], int mode)
path = argv[1];
}
is_dir = rights_path_is_dir(path);
if (!rights_path_exists(path, &is_dir)) {
fprintf(stdout, "Specified path not locatable.\n");
rights_usage();
return(1);
}
if (rights_effective_mask(path, is_dir, &mask)) {
fprintf(stdout, "Specified path not locatable.\n");
rights_usage();
return(1);
}

32
slist.c
View File

@@ -6,7 +6,7 @@
static int usage(void)
{
fprintf(stdout, "Usage: SLIST [Server] [/Continue]\n");
fprintf(stdout, "Usage: SLIST [Server] [/Continue] \n");
return(0);
}
@@ -44,7 +44,7 @@ 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" : "");
is_default ? "Default " : "");
}
int func_slist(int argc, char *argv[], int mode)
@@ -52,6 +52,7 @@ 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;
@@ -75,19 +76,17 @@ int func_slist(int argc, char *argv[], int mode)
}
strmaxcpy(pattern, argv[i], sizeof(pattern) - 1);
explicit_server = 1;
}
upstr(pattern);
/*
* Novell-like layout from the DOS client:
* Known NetWare File Servers Network Node Address Status
* ------------------------- -------- -------------------
*/
fprintf(stdout, "%-44sNetwork Node Address Status\n",
"Known NetWare File Servers");
fprintf(stdout, "%-44s------- ----------- ------\n",
"--------------------------");
if (!explicit_server) {
fprintf(stdout, "%-48sNetwork Node Address Status\n",
"Known NetWare File Servers");
fprintf(stdout, "%-48s------- ------------ ------\n",
"--------------------------");
}
while ((result = ncp_17_37(last_id, NCP_BINDERY_FSERVER,
pattern, &obj)) == 0) {
@@ -96,7 +95,11 @@ int func_slist(int argc, char *argv[], int mode)
found++;
last_id = obj.object_id;
fprintf(stdout, "%-44s", obj.object_name);
if (explicit_server && found == 1) {
fprintf(stdout, "%-47s", obj.object_name);
} else {
fprintf(stdout, "%-47s", obj.object_name);
}
if (!ncp_17_3d(NCP_BINDERY_FSERVER, obj.object_name,
1, "NET_ADDRESS", &prop)) {
@@ -109,6 +112,11 @@ int func_slist(int argc, char *argv[], int mode)
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);

View File

@@ -11,19 +11,16 @@ CD \LGNTTMP
ECHO LGNTC helper started. > C:\LGNTTMP\HELPER.TXT
ECHO This helper intentionally changes login state. >> C:\LGNTTMP\HELPER.TXT
ECHO It can be started from any directory after LGNTSTA part 1. >> C:\LGNTTMP\HELPER.TXT
ECHO After it finishes, login manually as SUPERVISOR with: >> C:\LGNTTMP\HELPER.TXT
ECHO C:\LGNTTMP\LOGIN SUPERVISOR >> C:\LGNTTMP\HELPER.TXT
ECHO Then run F:\LGNTSTA PART2. >> C:\LGNTTMP\HELPER.TXT
ECHO It was started by DLYSTRT after LGNTSTA Part 1 returned. >> C:\LGNTTMP\HELPER.TXT
ECHO. >> C:\LGNTTMP\HELPER.TXT
ECHO === D01 LOGOUT from initial supervisor session === >> C:\LGNTTMP\HELPER.TXT
C:\LGNTTMP\LOGOUT > C:\LGNTTMP\D01_LOG.OUT
ECHO === D02 LOGIN NOPASSUSER === >> C:\LGNTTMP\HELPER.TXT
ECHO === D02 LOGIN NOPASSUSER using local Novell LOGIN === >> C:\LGNTTMP\HELPER.TXT
C:\LGNTTMP\LOGIN NOPASSUSER > C:\LGNTTMP\D02_LGIN.OUT
ECHO === D03 MAP after NOPASSUSER login === >> C:\LGNTTMP\HELPER.TXT
ECHO === D03 MAP after NOPASSUSER login using local Novell MAP === >> C:\LGNTTMP\HELPER.TXT
C:\LGNTTMP\MAP > C:\LGNTTMP\D03_MAP.OUT
ECHO === D04 LOGOUT NOPASSUSER === >> C:\LGNTTMP\HELPER.TXT
@@ -33,9 +30,58 @@ REM Novell LOGIN /? may print usage directly to the console instead of stdout.
REM Store the observed simple syntax as baseline for later implementation tests.
ECHO Usage: LOGIN [server/]user > C:\LGNTTMP\D99_HELP.OUT
IF "%LGNTPWD%"=="" GOTO MANUAL
ECHO === D05 LOGIN SUPERVISOR using maintainer F:\LOGIN\LOGIN /PWD option === >> C:\LGNTTMP\HELPER.TXT
F:
CD \
IF EXIST \LOGIN\LOGIN.EXE GOTO HAVELOGINF
ECHO F:\LOGIN\LOGIN.EXE not found before supervisor relogin. >> C:\LGNTTMP\HELPER.TXT
ECHO.
ECHO F:\LOGIN\LOGIN.EXE nicht gefunden.
ECHO Bitte manuell als SUPERVISOR einloggen und danach ausfuehren:
ECHO F:
ECHO CD \
ECHO LGNTSTA PART2
GOTO END
:HAVELOGINF
F:
CD \
F:\LOGIN\LOGIN SUPERVISOR /PWD:%LGNTPWD% > C:\LGNTTMP\D05_LGSUP.OUT
ECHO === Check F: before queuing LGNTSTA PART2 === >> C:\LGNTTMP\HELPER.TXT
F:
CD \
IF EXIST \LGNTSTA.BAT GOTO QUEUEP2
ECHO F: not restored or \LGNTSTA.BAT missing after supervisor login. >> C:\LGNTTMP\HELPER.TXT
ECHO.
ECHO F: wurde nicht wiederhergestellt oder \LGNTSTA.BAT fehlt.
ECHO Bitte manuell pruefen und dann ausfuehren:
ECHO F:
ECHO CD \
ECHO LGNTSTA PART2
GOTO END
:QUEUEP2
ECHO F: is available. Queueing delayed LGNTSTA PART2 only. >> C:\LGNTTMP\HELPER.TXT
C:
CD \LGNTTMP
DLYSTRT /T:2 F:\LGNTSTA.BAT PART2 > C:\LGNTTMP\D06_P2.OUT
ECHO LGNTC queued F:\LGNTSTA.BAT PART2. LGNTZIP is intentionally not automatic. >> C:\LGNTTMP\HELPER.TXT
ECHO.
ECHO LGNTC fertig. PART2 wird per DLYSTRT gestartet.
ECHO LGNTZIP danach bei Bedarf manuell ausfuehren.
GOTO END
:MANUAL
ECHO LGNTPWD is not set; automatic SUPERVISOR login skipped. >> C:\LGNTTMP\HELPER.TXT
ECHO.
ECHO LGNTC fertig. Jetzt manuell wieder als SUPERVISOR einloggen:
ECHO C:\LGNTTMP\LOGIN SUPERVISOR
ECHO F:\LOGIN\LOGIN SUPERVISOR
ECHO Danach ausfuehren:
ECHO F:\LGNTSTA PART2
ECHO LGNTZIP danach bei Bedarf manuell ausfuehren.
ECHO.
:END

View File

@@ -1,18 +1,18 @@
@ECHO OFF
REM LGNTSTA.BAT
REM Two-stage LOGIN/LOGOUT baseline test for MARS NWE.
REM Automated LOGIN/LOGOUT baseline test for MARS NWE.
REM
REM START from F: while logged in as SUPERVISOR:
REM SET LGNTPWD=your-supervisor-password
REM F:\LGNTSTA
REM Then run the C: helper manually:
REM C:
REM CD \LGNTTMP
REM LGNTC
REM After that login manually using the local C: LOGIN copy and run:
REM C:\LGNTTMP\LOGIN SUPERVISOR
REM F:\LGNTSTA PART2
REM
REM PART2 copies captured C: results back to F:\LGNTCMP.
REM LGNTSTA prepares C:\LGNTTMP, installs a delayed start for LGNTC.BAT,
REM and then exits while F: is still available. DLYSTRT starts the local
REM C: helper after a short delay. The helper logs out, logs in as
REM NOPASSUSER, captures MAP, logs out, then logs in as SUPERVISOR again
REM using F:\LOGIN\LOGIN /PWD:%LGNTPWD%, then queues PART2 with DLYSTRT.
REM LGNTZIP is not started automatically.
REM
REM SYS:LOGIN / SYS:PUBLIC are NOT overwritten by this test.
IF "%1"=="" GOTO PART1
@@ -38,6 +38,18 @@ GOTO USAGE
F:
CD \
IF NOT "%LGNTPWD%"=="" GOTO PWDCHECKOK
ECHO ERROR: LGNTPWD ist nicht gesetzt.
ECHO.
ECHO Fuer den vollautomatischen LOGIN/LOGOUT-Test zuerst setzen, z.B.:
ECHO SET LGNTPWD=dein-supervisor-passwort
ECHO Danach starten:
ECHO F:\LGNTSTA
ECHO.
ECHO Es wurde kein DLYSTRT installiert und kein Login-Test gestartet.
GOTO END
:PWDCHECKOK
REM --- Recreate generated result/temp directories. ---
IF EXIST LGNTCMP DELTREE /Y LGNTCMP
MD LGNTCMP > NUL
@@ -46,42 +58,54 @@ MD LGNTCMP\OUT > NUL
ECHO LGNTSTA LOGIN/LOGOUT test > F:\LGNTCMP\RUN.LOG
ECHO Part 1 started while logged in as SUPERVISOR. >> F:\LGNTCMP\RUN.LOG
ECHO Helper will use user NOPASSUSER on server MARS. >> F:\LGNTCMP\RUN.LOG
ECHO This test is manual after logout because F: disappears. >> F:\LGNTCMP\RUN.LOG
ECHO This test uses DLYSTRT so F:\LGNTSTA can finish before LOGOUT. >> F:\LGNTCMP\RUN.LOG
ECHO SYS:LOGIN, SYS:PUBLIC, and SYS:NPUBLIC are not modified. >> F:\LGNTCMP\RUN.LOG
ECHO. >> F:\LGNTCMP\RUN.LOG
ECHO LGNTPWD is set; automatic SUPERVISOR login is enabled. >> F:\LGNTCMP\RUN.LOG
IF EXIST C:\LGNTTMP DELTREE /Y C:\LGNTTMP
MD C:\LGNTTMP > NUL
REM --- Copy Novell baseline tools to local C: directory only. ---
REM Do not overwrite SYS:LOGIN, SYS:PUBLIC, or SYS:NPUBLIC.
REM LOGIN/MAP are from NLOGIN, LOGOUT is from NPUBLIC.
REM The helper runs from C:\LGNTTMP so DOS should find tools there after LOGOUT.
ECHO Copying Novell runtime tools to C:\LGNTTMP. >> F:\LGNTCMP\RUN.LOG
COPY \NLOGIN\LOGIN.* C:\LGNTTMP >> F:\LGNTCMP\RUN.LOG
COPY \NLOGIN\MAP.* C:\LGNTTMP >> F:\LGNTCMP\RUN.LOG
COPY \NPUBLIC\LOGOUT.* C:\LGNTTMP >> F:\LGNTCMP\RUN.LOG
REM DLYSTRT is also copied to C: so the whole delayed phase uses local tools.
IF EXIST \PUBLIC\DLYSTRT.EXE GOTO HAVEDLY
ECHO ERROR: \PUBLIC\DLYSTRT.EXE not found. >> F:\LGNTCMP\RUN.LOG
ECHO ERROR: \PUBLIC\DLYSTRT.EXE not found.
ECHO Build/install dostools with MAINTAINER_BUILD=ON.
GOTO END
:HAVEDLY
COPY \PUBLIC\DLYSTRT.EXE C:\LGNTTMP >> F:\LGNTCMP\RUN.LOG
ECHO Copying helper to C:\LGNTTMP\LGNTC.BAT >> F:\LGNTCMP\RUN.LOG
COPY F:\LGNTC.BAT C:\LGNTTMP >> F:\LGNTCMP\RUN.LOG
ECHO Installing delayed helper start from local C:\LGNTTMP. >> F:\LGNTCMP\RUN.LOG
IF EXIST C:\LGNTTMP\DLYSTRT.EXE GOTO HAVEDLYLOCAL
ECHO ERROR: C:\LGNTTMP\DLYSTRT.EXE not copied. >> F:\LGNTCMP\RUN.LOG
ECHO ERROR: C:\LGNTTMP\DLYSTRT.EXE not copied.
GOTO END
:HAVEDLYLOCAL
REM Switch to C: before installing DLYSTRT. The delayed command is
REM typed into the current DOS prompt, so the prompt must not still be F:.
C:
CD \LGNTTMP
DLYSTRT /T:2 LGNTC.BAT >> F:\LGNTCMP\RUN.LOG
ECHO. >> F:\LGNTCMP\RUN.LOG
ECHO NEXT MANUAL STEPS: >> F:\LGNTCMP\RUN.LOG
ECHO C: >> F:\LGNTCMP\RUN.LOG
ECHO CD \LGNTTMP >> F:\LGNTCMP\RUN.LOG
ECHO LGNTC >> F:\LGNTCMP\RUN.LOG
ECHO C:\LGNTTMP\LOGIN SUPERVISOR >> F:\LGNTCMP\RUN.LOG
ECHO F:\LGNTSTA PART2 >> F:\LGNTCMP\RUN.LOG
ECHO DLYSTRT installed LGNTC.BAT from C:\LGNTTMP. >> F:\LGNTCMP\RUN.LOG
ECHO LGNTSTA Part 1 finished; helper will start from local C: after delay. >> F:\LGNTCMP\RUN.LOG
ECHO LGNTSTA Part 1 fertig.
ECHO Jetzt manuell ausfuehren:
ECHO C:
ECHO CD \LGNTTMP
ECHO LGNTC
ECHO Danach wieder als SUPERVISOR einloggen mit:
ECHO C:\LGNTTMP\LOGIN SUPERVISOR
ECHO Dann:
ECHO F:\LGNTSTA PART2
ECHO DLYSTRT startet gleich C:\LGNTTMP\LGNTC.BAT.
ECHO Bitte warten...
GOTO END
:PART2
@@ -100,13 +124,18 @@ ECHO LGNTSTA LOGIN/LOGOUT baseline finished. >> F:\LGNTCMP\SUMMARY.TXT
ECHO Novell LOGIN/MAP/LOGOUT were copied only to C:\LGNTTMP. >> F:\LGNTCMP\SUMMARY.TXT
ECHO LOGIN/MAP source: SYS:NLOGIN. LOGOUT source: SYS:NPUBLIC. >> F:\LGNTCMP\SUMMARY.TXT
ECHO SYS:LOGIN, SYS:PUBLIC, and SYS:NPUBLIC were not modified. >> F:\LGNTCMP\SUMMARY.TXT
ECHO DLYSTRT was used to start C:\LGNTTMP\LGNTC.BAT after Part 1 returned. >> F:\LGNTCMP\SUMMARY.TXT
ECHO. >> F:\LGNTCMP\SUMMARY.TXT
ECHO Expected files: >> F:\LGNTCMP\SUMMARY.TXT
ECHO - D01_LOG.OUT LOGOUT output from initial supervisor session. >> F:\LGNTCMP\SUMMARY.TXT
ECHO - D02_LGIN.OUT LOGIN NOPASSUSER baseline output. >> F:\LGNTCMP\SUMMARY.TXT
ECHO - D03_MAP.OUT MAP output after NOPASSUSER login. >> F:\LGNTCMP\SUMMARY.TXT
ECHO - D04_LGOT.OUT LOGOUT output from NOPASSUSER session. >> F:\LGNTCMP\SUMMARY.TXT
ECHO - D05_LGSU.OUT F:\LOGIN\LOGIN SUPERVISOR /PWD output. >> F:\LGNTCMP\SUMMARY.TXT
ECHO - D06_P2.OUT DLYSTRT output for delayed PART2 start. >> F:\LGNTCMP\SUMMARY.TXT
ECHO - D99_HELP.OUT Simulated LOGIN usage baseline if help is not redirectable. >> F:\LGNTCMP\SUMMARY.TXT
ECHO DLYSTRT.EXE was copied locally to C:\LGNTTMP before starting the helper and PART2. >> F:\LGNTCMP\SUMMARY.TXT
ECHO LGNTZIP is not started automatically; run it manually after inspection. >> F:\LGNTCMP\SUMMARY.TXT
ECHO. >> F:\LGNTCMP\SUMMARY.TXT
ECHO Optional: LGNTZIP ausfuehren. >> F:\LGNTCMP\SUMMARY.TXT
@@ -118,11 +147,14 @@ GOTO END
:USAGE
ECHO Usage: LGNTSTA [PART2]
ECHO.
ECHO Ohne Parameter startet LGNTSTA Part 1.
ECHO Ohne Parameter startet LGNTSTA Part 1 und installiert DLYSTRT.
ECHO PART2 sammelt nach dem erneuten SUPERVISOR-Login die C:-Ergebnisse ein.
ECHO Gueltiger Parameter ist PART2; part2/Part2 wird ebenfalls akzeptiert.
ECHO Beispiel:
ECHO F:\LGNTSTA PART2
ECHO.
ECHO Fuer vollautomatischen Lauf vorher setzen, z.B.:
ECHO SET LGNTPWD=dein-supervisor-passwort
ECHO Danach starten:
ECHO F:\LGNTSTA
GOTO END
:END

View File

@@ -1,74 +1,75 @@
# LOGIN / LOGOUT baseline test
`LGNTSTA` is a manual two-stage baseline test for Novell `LOGIN`, `LOGOUT`, and `MAP`.
This test does **not** overwrite `SYS:LOGIN`, `SYS:PUBLIC`, or `SYS:NPUBLIC`. It copies the Novell tools to a temporary local directory on `C:` and runs from there. `LOGIN` and `MAP` are copied from `SYS:NLOGIN`; `LOGOUT` is copied from `SYS:NPUBLIC`.
## Required setup
User `NOPASSUSER` must exist on `MARS` and must be able to login without a password.
## Run
Start while logged in as `SUPERVISOR`:
```bat
F:\LGNTSTA
```
Then run the helper from `C:`:
```bat
C:
CD \LGNTTMP
LGNTC
```
The helper does:
```text
LOGOUT
LOGIN NOPASSUSER
MAP
LOGOUT
```
All tool calls and redirected output paths are absolute `C:\LGNTTMP\...`, because Novell `LOGIN` can change the current drive/search path.
Then login manually as `SUPERVISOR` again from the same local tool directory:
```bat
C:\LGNTTMP\LOGIN SUPERVISOR
```
After the login script restores `F:`, collect results:
```bat
F:\LGNTSTA PART2
F:\LGNTZIP
```
## Expected output files
`F:\LGNTCMP\OUT` contains:
```text
D01_LOG.OUT LOGOUT output from initial supervisor session
D02_LGIN.OUT LOGIN NOPASSUSER output
D03_MAP.OUT MAP output after NOPASSUSER login
D04_LGOT.OUT LOGOUT output from NOPASSUSER session
D99_HELP.OUT simulated LOGIN usage line for later comparison
HELPER.TXT helper trace
```
`D99_HELP.OUT` is intentionally produced with `ECHO`, because Novell `LOGIN /?` may not redirect help text reliably.
## Implementation note
After `LOGIN NOPASSUSER`, DOS/NetWare may change the current drive/search path. `LGNTC.BAT` therefore calls `C:\LGNTTMP\LOGIN`, `C:\LGNTTMP\MAP`, and `C:\LGNTTMP\LOGOUT` explicitly and redirects to absolute `C:\LGNTTMP\*.OUT` files.
## Parameter handling
`LGNTSTA` starts Part 1 only when called without parameters. `PART2` is accepted case-insensitively (`PART2`, `part2`, `Part2`, etc.). Any other parameter prints usage and does not start Part 1, so a typo cannot accidentally reset the test state.
# LOGIN / LOGOUT baseline test
`LGNTSTA` is an automated maintainer baseline test for Novell `LOGIN`, `LOGOUT`, and `MAP`.
This test does **not** overwrite `SYS:LOGIN`, `SYS:PUBLIC`, or `SYS:NPUBLIC`. It copies the Novell tools to a temporary local directory on `C:` and runs from there. `LOGIN` and `MAP` are copied from `SYS:NLOGIN`; `LOGOUT` is copied from `SYS:NPUBLIC`. The maintainer helper `DLYSTRT.EXE` is also copied to `C:\LGNTTMP` before it is used, so the delayed phase no longer depends on `F:` or `PUBLIC` being visible.
## Required setup
User `NOPASSUSER` must exist on `MARS` and must be able to login without a password.
For a fully automated run, the DOS tools must be built with `MAINTAINER_BUILD=ON` so `LOGIN /PWD:` and `DLYSTRT` are available.
Set the supervisor password in the DOS environment before starting:
```bat
SET LGNTPWD=your-supervisor-password
```
The password is not written to `RUN.LOG` or `HELPER.TXT`, but it is still present in the DOS environment during the test. Use this only for maintainer testing.
## Run
Start while logged in as `SUPERVISOR`:
```bat
F:\LGNTSTA
```
`LGNTSTA` prepares `C:\LGNTTMP`, copies the local helper there, and installs:
```bat
C:
CD \LGNTTMP
DLYSTRT /T:2 LGNTC.BAT
```
Then `LGNTSTA` exits after switching to `C:\LGNTTMP`. After the delay, `DLYSTRT` types `LGNTC.BAT` into the local `C:` prompt, and the helper does:
```text
LOGOUT
LOGIN NOPASSUSER
MAP
LOGOUT
LOGIN SUPERVISOR /PWD:%LGNTPWD%
F:\LGNTSTA PART2
F:\LGNTZIP
```
If `LGNTPWD` is not set, `LGNTSTA` does not start Part 1 at all. It prints a short usage hint with the required `SET LGNTPWD=...` command and does not install `DLYSTRT`, so the test cannot accidentally log out and then stop half-way through.
## Expected output files
`F:\LGNTCMP\OUT` contains:
```text
D01_LOG.OUT LOGOUT output from initial supervisor session
D02_LGIN.OUT LOGIN NOPASSUSER output
D03_MAP.OUT MAP output after NOPASSUSER login
D04_LGOT.OUT LOGOUT output from NOPASSUSER session
D05_LGSU.OUT LOGIN SUPERVISOR /PWD output, if LGNTPWD was set
D99_HELP.OUT simulated LOGIN usage line for later comparison
HELPER.TXT helper trace
```
`D99_HELP.OUT` is intentionally produced with `ECHO`, because Novell `LOGIN /?` may not redirect help text reliably.
## Implementation note
After `LOGOUT`, the network drive `F:` disappears. Therefore `LGNTSTA` must finish before logout happens. `DLYSTRT` provides that gap by returning to DOS first. `LGNTSTA` switches to `C:\LGNTTMP` before installing it, so the delayed command is typed into a local `C:` prompt instead of an `F:` prompt.
After `LOGIN NOPASSUSER`, DOS/NetWare may change the current drive/search path. `LGNTC.BAT` therefore calls `C:\LGNTTMP\LOGIN`, `C:\LGNTTMP\MAP`, and `C:\LGNTTMP\LOGOUT` explicitly and redirects to absolute `C:\LGNTTMP\*.OUT` files.
## Parameter handling
`LGNTSTA` starts Part 1 only when called without parameters. `PART2` is accepted case-insensitively (`PART2`, `part2`, `Part2`, etc.). Any other parameter prints usage and does not start Part 1, so a typo cannot accidentally reset the test state.

View File

@@ -1,23 +1,45 @@
# RGHTSTA - RIGHTS baseline test
Novell-only baseline for `RIGHTS` behavior.
Runs `\NPUBLIC\RIGHTS` against a small generated test tree:
- default/current directory from `F:\`
- explicit directory and subdirectory paths
- explicit file and nested file paths
- default/current directory from inside the test directory
- relative file and relative directory paths
- missing directory/file paths
- too-many-arguments and `/?` usage/help cases
Results are written to `F:\RGHTCMP`. Test input files are generated in `F:\RGHTEST`.
Optional packaging is done with `RGHTZIP.BAT`.
This test does not use `PUBLIC` yet and does not modify trustees. It is only
for capturing Novell `NPUBLIC\RIGHTS` output/formatting before the later
`NPUBLIC`/`PUBLIC` comparison scripts are added.
Note: commands use absolute `\NPUBLIC\RIGHTS` so relative-path tests from inside `F:\RGHTEST` do not accidentally look for `F:\RGHTEST\NPUBLIC\RIGHTS`.
# RGHTSTA - RIGHTS comparison test
`RGHTSTA.BAT` compares Novell `RIGHTS` with the current implementation.
Result directories:
```text
F:\RGHTCMP\OUT Novell baseline using \NPUBLIC\RIGHTS
F:\RGHTCMP\PUBOUT current implementation using \PUBLIC\RIGHTS
F:\RGHTCMP\COMPARE.LOG
```
The test keeps the original Novell-baseline behavior and adds the public-tool
comparison layer.
Coverage:
- default/current directory from `F:\`
- explicit directory and subdirectory paths
- explicit file and nested file paths
- default/current directory from inside the test directory
- relative file and relative directory paths
- missing directory/file paths
- too-many-arguments and `/?` usage/help cases
operation. Its redirected output must be identical to the normal Novell output.
That means:
```text
OUT == PUBOUT
```
Run:
```bat
F:
CD \
RGHTSTA
RGHTZIP
```
The generated test tree is `F:\RGHTEST`. `RGHTZIP.BAT` packages the result and
then removes `F:\RGHTEST` again so the SYS root stays clean.
Note: `RIGHTS` currently has no short-output comparison in this baseline test. That switch exists for NDIR-style output control and should only be added to RIGHTS later if the tool implements it explicitly.

165
test/rights/RGHTC.BAT Normal file
View File

@@ -0,0 +1,165 @@
@ECHO OFF
REM RGHTC.BAT - delayed user-context RIGHTS capture helper.
REM Started by RGHTSTA via DLYSTRT. Runs from C:\RGHTTMP.
C:
CD \RGHTTMP
ECHO RGHTC user-context RIGHTS helper > HELPER.TXT
ECHO Current phase: logout supervisor, login NOPASSUSER. >> HELPER.TXT
LOGOUT > ULOG1.OUT
LOGIN NOPASSUSER > ULOGIN.OUT
F:
CD \
IF EXIST \NPUBLIC\RIGHTS.EXE GOTO HAVEF
ECHO F: not ready after NOPASSUSER login. >> C:\RGHTTMP\HELPER.TXT
GOTO RELSUP
:HAVEF
ECHO Starting U10_R as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U10 > C:\RGHTTMP\UNOV\U10_R.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U10 > C:\RGHTTMP\UPUB\U10_R.OUT
ECHO Starting U11_W as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U11 > C:\RGHTTMP\UNOV\U11_W.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U11 > C:\RGHTTMP\UPUB\U11_W.OUT
ECHO Starting U12_C as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U12 > C:\RGHTTMP\UNOV\U12_C.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U12 > C:\RGHTTMP\UPUB\U12_C.OUT
ECHO Starting U13_E as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U13 > C:\RGHTTMP\UNOV\U13_E.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U13 > C:\RGHTTMP\UPUB\U13_E.OUT
ECHO Starting U14_M as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U14 > C:\RGHTTMP\UNOV\U14_M.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U14 > C:\RGHTTMP\UPUB\U14_M.OUT
ECHO Starting U15_F as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U15 > C:\RGHTTMP\UNOV\U15_F.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U15 > C:\RGHTTMP\UPUB\U15_F.OUT
ECHO Starting U16_A as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U16 > C:\RGHTTMP\UNOV\U16_A.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U16 > C:\RGHTTMP\UPUB\U16_A.OUT
ECHO Starting U17_S as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U17 > C:\RGHTTMP\UNOV\U17_S.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U17 > C:\RGHTTMP\UPUB\U17_S.OUT
ECHO Starting U20_RF as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U20 > C:\RGHTTMP\UNOV\U20_RF.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U20 > C:\RGHTTMP\UPUB\U20_RF.OUT
ECHO Starting U21_RW as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U21 > C:\RGHTTMP\UNOV\U21_RW.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U21 > C:\RGHTTMP\UPUB\U21_RW.OUT
ECHO Starting U22_RWC as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U22 > C:\RGHTTMP\UNOV\U22_RWC.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U22 > C:\RGHTTMP\UPUB\U22_RWC.OUT
ECHO Starting U23_RWCE as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U23 > C:\RGHTTMP\UNOV\U23_RWCE.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U23 > C:\RGHTTMP\UPUB\U23_RWCE.OUT
ECHO Starting U24_RAL as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U24 > C:\RGHTTMP\UNOV\U24_RAL.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U24 > C:\RGHTTMP\UPUB\U24_RAL.OUT
ECHO Starting U25_SAL as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U25 > C:\RGHTTMP\UNOV\U25_SAL.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U25 > C:\RGHTTMP\UPUB\U25_SAL.OUT
ECHO Starting U26_ALL as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U26 > C:\RGHTTMP\UNOV\U26_ALL.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U26 > C:\RGHTTMP\UPUB\U26_ALL.OUT
ECHO Starting U27_N as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U27 > C:\RGHTTMP\UNOV\U27_N.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U27 > C:\RGHTTMP\UPUB\U27_N.OUT
ECHO Starting U30_RE as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U30 > C:\RGHTTMP\UNOV\U30_RE.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U30 > C:\RGHTTMP\UPUB\U30_RE.OUT
ECHO Starting U31_RWF as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U31 > C:\RGHTTMP\UNOV\U31_RWF.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U31 > C:\RGHTTMP\UPUB\U31_RWF.OUT
ECHO Starting U32_RCM as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U32 > C:\RGHTTMP\UNOV\U32_RCM.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U32 > C:\RGHTTMP\UPUB\U32_RCM.OUT
ECHO Starting U33_RFA as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U33 > C:\RGHTTMP\UNOV\U33_RFA.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U33 > C:\RGHTTMP\UPUB\U33_RFA.OUT
ECHO Starting U34_WCM as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U34 > C:\RGHTTMP\UNOV\U34_WCM.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U34 > C:\RGHTTMP\UPUB\U34_WCM.OUT
ECHO Starting U35_EMF as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U35 > C:\RGHTTMP\UNOV\U35_EMF.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U35 > C:\RGHTTMP\UPUB\U35_EMF.OUT
ECHO Starting U36_RMF as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U36 > C:\RGHTTMP\UNOV\U36_RMF.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U36 > C:\RGHTTMP\UPUB\U36_RMF.OUT
ECHO Starting U37_REMA as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U37 > C:\RGHTTMP\UNOV\U37_REMA.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U37 > C:\RGHTTMP\UPUB\U37_REMA.OUT
ECHO Starting U38_SR as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U38 > C:\RGHTTMP\UNOV\U38_SR.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U38 > C:\RGHTTMP\UPUB\U38_SR.OUT
ECHO Starting U39_SRF as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U39 > C:\RGHTTMP\UNOV\U39_SRF.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U39 > C:\RGHTTMP\UPUB\U39_SRF.OUT
ECHO Starting U40_SWCM as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\U40 > C:\RGHTTMP\UNOV\U40_SWCM.OUT
\PUBLIC\RIGHTS F:\RGHTEST\U40 > C:\RGHTTMP\UPUB\U40_SWCM.OUT
ECHO Starting F10_R as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\UF10\F.TXT > C:\RGHTTMP\UNOV\F10_R.OUT
\PUBLIC\RIGHTS F:\RGHTEST\UF10\F.TXT > C:\RGHTTMP\UPUB\F10_R.OUT
ECHO Starting F11_RF as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\UF11\F.TXT > C:\RGHTTMP\UNOV\F11_RF.OUT
\PUBLIC\RIGHTS F:\RGHTEST\UF11\F.TXT > C:\RGHTTMP\UPUB\F11_RF.OUT
ECHO Starting F12_RAL as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\UF12\F.TXT > C:\RGHTTMP\UNOV\F12_RAL.OUT
\PUBLIC\RIGHTS F:\RGHTEST\UF12\F.TXT > C:\RGHTTMP\UPUB\F12_RAL.OUT
ECHO Starting F13_ALL as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\UF13\F.TXT > C:\RGHTTMP\UNOV\F13_ALL.OUT
\PUBLIC\RIGHTS F:\RGHTEST\UF13\F.TXT > C:\RGHTTMP\UPUB\F13_ALL.OUT
ECHO Starting F14_N as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\UF14\F.TXT > C:\RGHTTMP\UNOV\F14_N.OUT
\PUBLIC\RIGHTS F:\RGHTEST\UF14\F.TXT > C:\RGHTTMP\UPUB\F14_N.OUT
ECHO Starting F15_S as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\UF15\F.TXT > C:\RGHTTMP\UNOV\F15_S.OUT
\PUBLIC\RIGHTS F:\RGHTEST\UF15\F.TXT > C:\RGHTTMP\UPUB\F15_S.OUT
ECHO Starting F16_SAL as NOPASSUSER... >> C:\RGHTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RGHTEST\UF16\F.TXT > C:\RGHTTMP\UNOV\F16_SAL.OUT
\PUBLIC\RIGHTS F:\RGHTEST\UF16\F.TXT > C:\RGHTTMP\UPUB\F16_SAL.OUT
:RELSUP
ECHO Logging out NOPASSUSER and returning to SUPERVISOR. >> C:\RGHTTMP\HELPER.TXT
LOGOUT > C:\RGHTTMP\ULOG2.OUT
F:
CD \
IF EXIST \LOGIN\LOGIN.EXE GOTO HAVELOGIN
ECHO F:\LOGIN\LOGIN.EXE not found. >> C:\RGHTTMP\HELPER.TXT
GOTO MANUAL
:HAVELOGIN
F:\LOGIN\LOGIN SUPERVISOR /PWD:%LGNTPWD% > C:\RGHTTMP\ULOGSUP.OUT
F:
CD \
IF EXIST \RGHTSTA.BAT GOTO QUEUEP2
ECHO F: not restored or \RGHTSTA.BAT not visible. >> C:\RGHTTMP\HELPER.TXT
GOTO MANUAL
:QUEUEP2
C:
CD \RGHTTMP
IF EXIST DLYSTRT.EXE GOTO HVDLY
ECHO C:\RGHTTMP\DLYSTRT.EXE not found. >> HELPER.TXT
GOTO MANUAL
:HVDLY
ECHO Queueing F:\RGHTSTA.BAT PART2 via DLYSTRT. >> HELPER.TXT
DLYSTRT /T:2 F:\RGHTSTA.BAT PART2
GOTO END
:MANUAL
ECHO Manual steps required:
ECHO LOGIN SUPERVISOR
ECHO F:
ECHO CD \
ECHO RGHTSTA PART2
ECHO RGHTZIP
ECHO Manual steps required. >> C:\RGHTTMP\HELPER.TXT
:END
ECHO RGHTC finished. >> C:\RGHTTMP\HELPER.TXT

View File

@@ -1,87 +1,370 @@
@ECHO OFF
REM RGHTSTA.BAT
REM Automated RIGHTS baseline test for MARS NWE.
REM Automated RIGHTS comparison test for MARS NWE.
REM
REM Uses \NPUBLIC\RIGHTS as Novell baseline for currently implemented tool behavior.
REM This test is read-only from the RIGHTS tool point of view. It only creates
REM a small local test tree so directory, file, relative, current-directory,
REM missing-path, and usage output can be captured.
REM Direct mode:
REM OUT = Novell baseline using \NPUBLIC\RIGHTS
REM PUBOUT = our implementation using \PUBLIC\RIGHTS
REM
REM Result tree:
REM F:\RGHTCMP
REM Test tree:
REM F:\RGHTEST
REM User-context mode:
REM SUPERVISOR grants mixed rights to NOPASSUSER.
REM DLYSTRT starts C:\RGHTTMP\RGHTC.BAT after this script exits.
REM RGHTC logs in as NOPASSUSER and captures RIGHTS output.
REM
REM Optional automatic user-context mode requires:
REM SET LGNTPWD=your-supervisor-password
IF "%1"=="" GOTO PART1
IF "%1"=="PART2" GOTO PART2
IF "%1"=="part2" GOTO PART2
IF "%1"=="Part2" GOTO PART2
ECHO Usage: RGHTSTA [PART2]
GOTO END
:PART1
F:
CD \
REM --- Clean generated test/result directories (contents only). ---
IF EXIST RGHTEST\NUL DELTREE /Y RGHTEST\*.*
IF EXIST RGHTCMP\NUL DELTREE /Y RGHTCMP\*.*
REM --- Clean generated test/result directories. ---
IF EXIST RGHTEST\*.* DELTREE /Y RGHTEST
IF EXIST RGHTCMP\*.* DELTREE /Y RGHTCMP
IF EXIST C:\RGHTTMP\*.* DELTREE /Y C:\RGHTTMP
IF NOT EXIST RGHTEST\NUL MD RGHTEST
IF NOT EXIST RGHTEST\SUBDIR\NUL MD RGHTEST\SUBDIR
IF NOT EXIST RGHTCMP\NUL MD RGHTCMP
IF NOT EXIST RGHTCMP\OUT\NUL MD RGHTCMP\OUT
IF NOT EXIST RGHTEST MD RGHTEST
IF NOT EXIST RGHTEST\SUBDIR MD RGHTEST\SUBDIR
IF NOT EXIST RGHTCMP MD RGHTCMP
IF NOT EXIST RGHTCMP\OUT MD RGHTCMP\OUT
IF NOT EXIST RGHTCMP\PUBOUT MD RGHTCMP\PUBOUT
IF NOT EXIST RGHTCMP\SETUP MD RGHTCMP\SETUP
IF NOT EXIST RGHTCMP\USETUP MD RGHTCMP\USETUP
IF NOT EXIST C:\RGHTTMP MD C:\RGHTTMP
IF NOT EXIST C:\RGHTTMP\UNOV MD C:\RGHTTMP\UNOV
IF NOT EXIST C:\RGHTTMP\UPUB MD C:\RGHTTMP\UPUB
ECHO RIGHTS ROOT FILE > F:\RGHTEST\FILE.TXT
ECHO RIGHTS INNER FILE > F:\RGHTEST\SUBDIR\INNER.TXT
ECHO RGHTSTA RIGHTS baseline test > F:\RGHTCMP\RUN.LOG
ECHO Creates F:\RGHTEST and captures \NPUBLIC\RIGHTS output. >> F:\RGHTCMP\RUN.LOG
ECHO RGHTSTA RIGHTS comparison test > F:\RGHTCMP\RUN.LOG
ECHO OUT = Novell baseline with \NPUBLIC\RIGHTS >> F:\RGHTCMP\RUN.LOG
ECHO PUBOUT = our implementation with \PUBLIC\RIGHTS >> F:\RGHTCMP\RUN.LOG
ECHO UOUT = user-context output collected by RGHTC. >> F:\RGHTCMP\RUN.LOG
ECHO. >> F:\RGHTCMP\RUN.LOG
ECHO === D01 default/current directory from F:\ === >> F:\RGHTCMP\RUN.LOG
\NPUBLIC\RIGHTS > F:\RGHTCMP\OUT\D01_CURRENT_ROOT.OUT
ECHO === D02 explicit test directory === >> F:\RGHTCMP\RUN.LOG
\NPUBLIC\RIGHTS F:\RGHTEST > F:\RGHTCMP\OUT\D02_TESTDIR.OUT
ECHO === D03 explicit subdirectory === >> F:\RGHTCMP\RUN.LOG
\NPUBLIC\RIGHTS F:\RGHTEST\SUBDIR > F:\RGHTCMP\OUT\D03_SUBDIR.OUT
ECHO === D04 explicit file === >> F:\RGHTCMP\RUN.LOG
ECHO Starting D01_CURR...
ECHO === D01_CURR default/current directory from F:\ === >> F:\RGHTCMP\RUN.LOG
\NPUBLIC\RIGHTS > F:\RGHTCMP\OUT\D01_CURR.OUT
\PUBLIC\RIGHTS > F:\RGHTCMP\PUBOUT\D01_CURR.OUT
ECHO Starting D02_TDIR...
ECHO === D02_TDIR explicit test directory === >> F:\RGHTCMP\RUN.LOG
\NPUBLIC\RIGHTS F:\RGHTEST > F:\RGHTCMP\OUT\D02_TDIR.OUT
\PUBLIC\RIGHTS F:\RGHTEST > F:\RGHTCMP\PUBOUT\D02_TDIR.OUT
ECHO Starting D03_SUBD...
ECHO === D03_SUBD explicit subdirectory === >> F:\RGHTCMP\RUN.LOG
\NPUBLIC\RIGHTS F:\RGHTEST\SUBDIR > F:\RGHTCMP\OUT\D03_SUBD.OUT
\PUBLIC\RIGHTS F:\RGHTEST\SUBDIR > F:\RGHTCMP\PUBOUT\D03_SUBD.OUT
ECHO Starting D04_FILE...
ECHO === D04_FILE explicit file === >> F:\RGHTCMP\RUN.LOG
\NPUBLIC\RIGHTS F:\RGHTEST\FILE.TXT > F:\RGHTCMP\OUT\D04_FILE.OUT
ECHO === D05 explicit nested file === >> F:\RGHTCMP\RUN.LOG
\NPUBLIC\RIGHTS F:\RGHTEST\SUBDIR\INNER.TXT > F:\RGHTCMP\OUT\D05_INNER_FILE.OUT
ECHO === D06 default/current directory from F:\RGHTEST === >> F:\RGHTCMP\RUN.LOG
\PUBLIC\RIGHTS F:\RGHTEST\FILE.TXT > F:\RGHTCMP\PUBOUT\D04_FILE.OUT
ECHO Starting D05_INNE...
ECHO === D05_INNE explicit nested file === >> F:\RGHTCMP\RUN.LOG
\NPUBLIC\RIGHTS F:\RGHTEST\SUBDIR\INNER.TXT > F:\RGHTCMP\OUT\D05_INNE.OUT
\PUBLIC\RIGHTS F:\RGHTEST\SUBDIR\INNER.TXT > F:\RGHTCMP\PUBOUT\D05_INNE.OUT
ECHO Starting D06_CURR...
ECHO === D06_CURR default/current directory from F:\RGHTEST === >> F:\RGHTCMP\RUN.LOG
CD \RGHTEST
\NPUBLIC\RIGHTS > F:\RGHTCMP\OUT\D06_CURRENT_TESTDIR.OUT
ECHO === D07 relative file from F:\RGHTEST === >> F:\RGHTCMP\RUN.LOG
\NPUBLIC\RIGHTS FILE.TXT > F:\RGHTCMP\OUT\D07_REL_FILE.OUT
ECHO === D08 relative subdir from F:\RGHTEST === >> F:\RGHTCMP\RUN.LOG
\NPUBLIC\RIGHTS SUBDIR > F:\RGHTCMP\OUT\D08_REL_SUBDIR.OUT
\NPUBLIC\RIGHTS > F:\RGHTCMP\OUT\D06_CURR.OUT
\PUBLIC\RIGHTS > F:\RGHTCMP\PUBOUT\D06_CURR.OUT
ECHO Starting D07_RELF...
\NPUBLIC\RIGHTS FILE.TXT > F:\RGHTCMP\OUT\D07_RELF.OUT
\PUBLIC\RIGHTS FILE.TXT > F:\RGHTCMP\PUBOUT\D07_RELF.OUT
ECHO Starting D08_RELD...
\NPUBLIC\RIGHTS SUBDIR > F:\RGHTCMP\OUT\D08_RELD.OUT
\PUBLIC\RIGHTS SUBDIR > F:\RGHTCMP\PUBOUT\D08_RELD.OUT
CD \
ECHO === D90 missing directory/path === >> F:\RGHTCMP\RUN.LOG
\NPUBLIC\RIGHTS F:\RGHTEST\MISSING > F:\RGHTCMP\OUT\D90_MISSING_DIR.OUT
ECHO === D91 missing file/path === >> F:\RGHTCMP\RUN.LOG
\NPUBLIC\RIGHTS F:\RGHTEST\NOFILE.TXT > F:\RGHTCMP\OUT\D91_MISSING_FILE.OUT
ECHO === D98 too many arguments === >> F:\RGHTCMP\RUN.LOG
\NPUBLIC\RIGHTS F:\RGHTEST EXTRA > F:\RGHTCMP\OUT\D98_TOO_MANY.OUT
ECHO === D99 usage/help === >> F:\RGHTCMP\RUN.LOG
ECHO Starting D90_MISD...
\NPUBLIC\RIGHTS F:\RGHTEST\MISSING > F:\RGHTCMP\OUT\D90_MISD.OUT
\PUBLIC\RIGHTS F:\RGHTEST\MISSING > F:\RGHTCMP\PUBOUT\D90_MISD.OUT
ECHO Starting D91_MISF...
\NPUBLIC\RIGHTS F:\RGHTEST\NOFILE.TXT > F:\RGHTCMP\OUT\D91_MISF.OUT
\PUBLIC\RIGHTS F:\RGHTEST\NOFILE.TXT > F:\RGHTCMP\PUBOUT\D91_MISF.OUT
ECHO Starting D98_TOOM...
\NPUBLIC\RIGHTS F:\RGHTEST EXTRA > F:\RGHTCMP\OUT\D98_TOOM.OUT
\PUBLIC\RIGHTS F:\RGHTEST EXTRA > F:\RGHTCMP\PUBOUT\D98_TOOM.OUT
ECHO Starting D99_HELP...
\NPUBLIC\RIGHTS /? > F:\RGHTCMP\OUT\D99_HELP.OUT
\PUBLIC\RIGHTS /? > F:\RGHTCMP\PUBOUT\D99_HELP.OUT
ECHO === COMPARE NOVELL OUT AGAINST PUBLIC OUT === > F:\RGHTCMP\COMPARE.LOG
FC F:\RGHTCMP\OUT\D01_CURR.OUT F:\RGHTCMP\PUBOUT\D01_CURR.OUT >> F:\RGHTCMP\COMPARE.LOG
FC F:\RGHTCMP\OUT\D02_TDIR.OUT F:\RGHTCMP\PUBOUT\D02_TDIR.OUT >> F:\RGHTCMP\COMPARE.LOG
FC F:\RGHTCMP\OUT\D03_SUBD.OUT F:\RGHTCMP\PUBOUT\D03_SUBD.OUT >> F:\RGHTCMP\COMPARE.LOG
FC F:\RGHTCMP\OUT\D04_FILE.OUT F:\RGHTCMP\PUBOUT\D04_FILE.OUT >> F:\RGHTCMP\COMPARE.LOG
FC F:\RGHTCMP\OUT\D05_INNE.OUT F:\RGHTCMP\PUBOUT\D05_INNE.OUT >> F:\RGHTCMP\COMPARE.LOG
FC F:\RGHTCMP\OUT\D06_CURR.OUT F:\RGHTCMP\PUBOUT\D06_CURR.OUT >> F:\RGHTCMP\COMPARE.LOG
FC F:\RGHTCMP\OUT\D07_RELF.OUT F:\RGHTCMP\PUBOUT\D07_RELF.OUT >> F:\RGHTCMP\COMPARE.LOG
FC F:\RGHTCMP\OUT\D08_RELD.OUT F:\RGHTCMP\PUBOUT\D08_RELD.OUT >> F:\RGHTCMP\COMPARE.LOG
FC F:\RGHTCMP\OUT\D90_MISD.OUT F:\RGHTCMP\PUBOUT\D90_MISD.OUT >> F:\RGHTCMP\COMPARE.LOG
FC F:\RGHTCMP\OUT\D91_MISF.OUT F:\RGHTCMP\PUBOUT\D91_MISF.OUT >> F:\RGHTCMP\COMPARE.LOG
FC F:\RGHTCMP\OUT\D98_TOOM.OUT F:\RGHTCMP\PUBOUT\D98_TOOM.OUT >> F:\RGHTCMP\COMPARE.LOG
FC F:\RGHTCMP\OUT\D99_HELP.OUT F:\RGHTCMP\PUBOUT\D99_HELP.OUT >> F:\RGHTCMP\COMPARE.LOG
ECHO. >> F:\RGHTCMP\COMPARE.LOG
ECHO Preparing NOPASSUSER rights matrix...
ECHO === USER-CONTEXT RIGHTS MATRIX SETUP === >> F:\RGHTCMP\RUN.LOG
ECHO Setup U10_R = R...
IF NOT EXIST RGHTEST\U10 MD RGHTEST\U10
ECHO U10_R > F:\RGHTEST\U10\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U10 > F:\RGHTCMP\USETUP\U10_R.REM
\NPUBLIC\GRANT R FOR F:\RGHTEST\U10 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U10_R.GRN
ECHO Setup U11_W = W...
IF NOT EXIST RGHTEST\U11 MD RGHTEST\U11
ECHO U11_W > F:\RGHTEST\U11\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U11 > F:\RGHTCMP\USETUP\U11_W.REM
\NPUBLIC\GRANT W FOR F:\RGHTEST\U11 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U11_W.GRN
ECHO Setup U12_C = C...
IF NOT EXIST RGHTEST\U12 MD RGHTEST\U12
ECHO U12_C > F:\RGHTEST\U12\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U12 > F:\RGHTCMP\USETUP\U12_C.REM
\NPUBLIC\GRANT C FOR F:\RGHTEST\U12 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U12_C.GRN
ECHO Setup U13_E = E...
IF NOT EXIST RGHTEST\U13 MD RGHTEST\U13
ECHO U13_E > F:\RGHTEST\U13\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U13 > F:\RGHTCMP\USETUP\U13_E.REM
\NPUBLIC\GRANT E FOR F:\RGHTEST\U13 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U13_E.GRN
ECHO Setup U14_M = M...
IF NOT EXIST RGHTEST\U14 MD RGHTEST\U14
ECHO U14_M > F:\RGHTEST\U14\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U14 > F:\RGHTCMP\USETUP\U14_M.REM
\NPUBLIC\GRANT M FOR F:\RGHTEST\U14 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U14_M.GRN
ECHO Setup U15_F = F...
IF NOT EXIST RGHTEST\U15 MD RGHTEST\U15
ECHO U15_F > F:\RGHTEST\U15\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U15 > F:\RGHTCMP\USETUP\U15_F.REM
\NPUBLIC\GRANT F FOR F:\RGHTEST\U15 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U15_F.GRN
ECHO Setup U16_A = A...
IF NOT EXIST RGHTEST\U16 MD RGHTEST\U16
ECHO U16_A > F:\RGHTEST\U16\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U16 > F:\RGHTCMP\USETUP\U16_A.REM
\NPUBLIC\GRANT A FOR F:\RGHTEST\U16 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U16_A.GRN
ECHO Setup U17_S = S...
IF NOT EXIST RGHTEST\U17 MD RGHTEST\U17
ECHO U17_S > F:\RGHTEST\U17\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U17 > F:\RGHTCMP\USETUP\U17_S.REM
\NPUBLIC\GRANT S FOR F:\RGHTEST\U17 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U17_S.GRN
ECHO Setup U20_RF = R F...
IF NOT EXIST RGHTEST\U20 MD RGHTEST\U20
ECHO U20_RF > F:\RGHTEST\U20\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U20 > F:\RGHTCMP\USETUP\U20_RF.REM
\NPUBLIC\GRANT R F FOR F:\RGHTEST\U20 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U20_RF.GRN
ECHO Setup U21_RW = R W...
IF NOT EXIST RGHTEST\U21 MD RGHTEST\U21
ECHO U21_RW > F:\RGHTEST\U21\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U21 > F:\RGHTCMP\USETUP\U21_RW.REM
\NPUBLIC\GRANT R W FOR F:\RGHTEST\U21 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U21_RW.GRN
ECHO Setup U22_RWC = R W C...
IF NOT EXIST RGHTEST\U22 MD RGHTEST\U22
ECHO U22_RWC > F:\RGHTEST\U22\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U22 > F:\RGHTCMP\USETUP\U22_RWC.REM
\NPUBLIC\GRANT R W C FOR F:\RGHTEST\U22 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U22_RWC.GRN
ECHO Setup U23_RWCE = R W C E...
IF NOT EXIST RGHTEST\U23 MD RGHTEST\U23
ECHO U23_RWCE > F:\RGHTEST\U23\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U23 > F:\RGHTCMP\USETUP\U23_RWCE.REM
\NPUBLIC\GRANT R W C E FOR F:\RGHTEST\U23 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U23_RWCE.GRN
ECHO Setup U24_RAL = R W C E M F A...
IF NOT EXIST RGHTEST\U24 MD RGHTEST\U24
ECHO U24_RAL > F:\RGHTEST\U24\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U24 > F:\RGHTCMP\USETUP\U24_RAL.REM
\NPUBLIC\GRANT R W C E M F A FOR F:\RGHTEST\U24 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U24_RAL.GRN
ECHO Setup U25_SAL = S R W C E M F A...
IF NOT EXIST RGHTEST\U25 MD RGHTEST\U25
ECHO U25_SAL > F:\RGHTEST\U25\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U25 > F:\RGHTCMP\USETUP\U25_SAL.REM
\NPUBLIC\GRANT S R W C E M F A FOR F:\RGHTEST\U25 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U25_SAL.GRN
ECHO Setup U26_ALL = ALL...
IF NOT EXIST RGHTEST\U26 MD RGHTEST\U26
ECHO U26_ALL > F:\RGHTEST\U26\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U26 > F:\RGHTCMP\USETUP\U26_ALL.REM
\NPUBLIC\GRANT ALL FOR F:\RGHTEST\U26 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U26_ALL.GRN
ECHO Setup U27_N = N...
IF NOT EXIST RGHTEST\U27 MD RGHTEST\U27
ECHO U27_N > F:\RGHTEST\U27\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U27 > F:\RGHTCMP\USETUP\U27_N.REM
\NPUBLIC\GRANT N FOR F:\RGHTEST\U27 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U27_N.GRN
ECHO Setup U30_RE = R E...
IF NOT EXIST RGHTEST\U30 MD RGHTEST\U30
ECHO U30_RE > F:\RGHTEST\U30\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U30 > F:\RGHTCMP\USETUP\U30_RE.REM
\NPUBLIC\GRANT R E FOR F:\RGHTEST\U30 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U30_RE.GRN
ECHO Setup U31_RWF = R W F...
IF NOT EXIST RGHTEST\U31 MD RGHTEST\U31
ECHO U31_RWF > F:\RGHTEST\U31\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U31 > F:\RGHTCMP\USETUP\U31_RWF.REM
\NPUBLIC\GRANT R W F FOR F:\RGHTEST\U31 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U31_RWF.GRN
ECHO Setup U32_RCM = R C M...
IF NOT EXIST RGHTEST\U32 MD RGHTEST\U32
ECHO U32_RCM > F:\RGHTEST\U32\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U32 > F:\RGHTCMP\USETUP\U32_RCM.REM
\NPUBLIC\GRANT R C M FOR F:\RGHTEST\U32 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U32_RCM.GRN
ECHO Setup U33_RFA = R F A...
IF NOT EXIST RGHTEST\U33 MD RGHTEST\U33
ECHO U33_RFA > F:\RGHTEST\U33\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U33 > F:\RGHTCMP\USETUP\U33_RFA.REM
\NPUBLIC\GRANT R F A FOR F:\RGHTEST\U33 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U33_RFA.GRN
ECHO Setup U34_WCM = W C M...
IF NOT EXIST RGHTEST\U34 MD RGHTEST\U34
ECHO U34_WCM > F:\RGHTEST\U34\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U34 > F:\RGHTCMP\USETUP\U34_WCM.REM
\NPUBLIC\GRANT W C M FOR F:\RGHTEST\U34 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U34_WCM.GRN
ECHO Setup U35_EMF = E M F...
IF NOT EXIST RGHTEST\U35 MD RGHTEST\U35
ECHO U35_EMF > F:\RGHTEST\U35\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U35 > F:\RGHTCMP\USETUP\U35_EMF.REM
\NPUBLIC\GRANT E M F FOR F:\RGHTEST\U35 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U35_EMF.GRN
ECHO Setup U36_RMF = R W C M F...
IF NOT EXIST RGHTEST\U36 MD RGHTEST\U36
ECHO U36_RMF > F:\RGHTEST\U36\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U36 > F:\RGHTCMP\USETUP\U36_RMF.REM
\NPUBLIC\GRANT R W C M F FOR F:\RGHTEST\U36 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U36_RMF.GRN
ECHO Setup U37_REMA = R E M A...
IF NOT EXIST RGHTEST\U37 MD RGHTEST\U37
ECHO U37_REMA > F:\RGHTEST\U37\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U37 > F:\RGHTCMP\USETUP\U37_REMA.REM
\NPUBLIC\GRANT R E M A FOR F:\RGHTEST\U37 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U37_REMA.GRN
ECHO Setup U38_SR = S R...
IF NOT EXIST RGHTEST\U38 MD RGHTEST\U38
ECHO U38_SR > F:\RGHTEST\U38\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U38 > F:\RGHTCMP\USETUP\U38_SR.REM
\NPUBLIC\GRANT S R FOR F:\RGHTEST\U38 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U38_SR.GRN
ECHO Setup U39_SRF = S R F...
IF NOT EXIST RGHTEST\U39 MD RGHTEST\U39
ECHO U39_SRF > F:\RGHTEST\U39\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U39 > F:\RGHTCMP\USETUP\U39_SRF.REM
\NPUBLIC\GRANT S R F FOR F:\RGHTEST\U39 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U39_SRF.GRN
ECHO Setup U40_SWCM = S W C M...
IF NOT EXIST RGHTEST\U40 MD RGHTEST\U40
ECHO U40_SWCM > F:\RGHTEST\U40\FILE.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\U40 > F:\RGHTCMP\USETUP\U40_SWCM.REM
\NPUBLIC\GRANT S W C M FOR F:\RGHTEST\U40 TO USER NOPASSUSER > F:\RGHTCMP\USETUP\U40_SWCM.GRN
ECHO Setup F10_R = R /FILES...
IF NOT EXIST RGHTEST\UF10 MD RGHTEST\UF10
ECHO F10_R > F:\RGHTEST\UF10\F.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\UF10\F.TXT > F:\RGHTCMP\USETUP\F10_R.REM
\NPUBLIC\GRANT R FOR F:\RGHTEST\UF10\F.TXT TO USER NOPASSUSER /FILES > F:\RGHTCMP\USETUP\F10_R.GRN
ECHO Setup F11_RF = R F /FILES...
IF NOT EXIST RGHTEST\UF11 MD RGHTEST\UF11
ECHO F11_RF > F:\RGHTEST\UF11\F.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\UF11\F.TXT > F:\RGHTCMP\USETUP\F11_RF.REM
\NPUBLIC\GRANT R F FOR F:\RGHTEST\UF11\F.TXT TO USER NOPASSUSER /FILES > F:\RGHTCMP\USETUP\F11_RF.GRN
ECHO Setup F12_RAL = R W C E M F A /FILES...
IF NOT EXIST RGHTEST\UF12 MD RGHTEST\UF12
ECHO F12_RAL > F:\RGHTEST\UF12\F.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\UF12\F.TXT > F:\RGHTCMP\USETUP\F12_RAL.REM
\NPUBLIC\GRANT R W C E M F A FOR F:\RGHTEST\UF12\F.TXT TO USER NOPASSUSER /FILES > F:\RGHTCMP\USETUP\F12_RAL.GRN
ECHO Setup F13_ALL = ALL /FILES...
IF NOT EXIST RGHTEST\UF13 MD RGHTEST\UF13
ECHO F13_ALL > F:\RGHTEST\UF13\F.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\UF13\F.TXT > F:\RGHTCMP\USETUP\F13_ALL.REM
\NPUBLIC\GRANT ALL FOR F:\RGHTEST\UF13\F.TXT TO USER NOPASSUSER /FILES > F:\RGHTCMP\USETUP\F13_ALL.GRN
ECHO Setup F14_N = N /FILES...
IF NOT EXIST RGHTEST\UF14 MD RGHTEST\UF14
ECHO F14_N > F:\RGHTEST\UF14\F.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\UF14\F.TXT > F:\RGHTCMP\USETUP\F14_N.REM
\NPUBLIC\GRANT N FOR F:\RGHTEST\UF14\F.TXT TO USER NOPASSUSER /FILES > F:\RGHTCMP\USETUP\F14_N.GRN
ECHO Setup F15_S = S /FILES...
IF NOT EXIST RGHTEST\UF15 MD RGHTEST\UF15
ECHO F15_S > F:\RGHTEST\UF15\F.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\UF15\F.TXT > F:\RGHTCMP\USETUP\F15_S.REM
\NPUBLIC\GRANT S FOR F:\RGHTEST\UF15\F.TXT TO USER NOPASSUSER /FILES > F:\RGHTCMP\USETUP\F15_S.GRN
ECHO Setup F16_SAL = S R W C E M F A /FILES...
IF NOT EXIST RGHTEST\UF16 MD RGHTEST\UF16
ECHO F16_SAL > F:\RGHTEST\UF16\F.TXT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RGHTEST\UF16\F.TXT > F:\RGHTCMP\USETUP\F16_SAL.REM
\NPUBLIC\GRANT S R W C E M F A FOR F:\RGHTEST\UF16\F.TXT TO USER NOPASSUSER /FILES > F:\RGHTCMP\USETUP\F16_SAL.GRN
IF "%LGNTPWD%"=="" GOTO SKIPUSER
ECHO Installing delayed user-context helper...
IF NOT EXIST C:\RGHTTMP MD C:\RGHTTMP
IF NOT EXIST C:\RGHTTMP\UNOV MD C:\RGHTTMP\UNOV
IF NOT EXIST C:\RGHTTMP\UPUB MD C:\RGHTTMP\UPUB
COPY F:\RGHTC.BAT C:\RGHTTMP\RGHTC.BAT > F:\RGHTCMP\RGHTC.CPY
COPY \PUBLIC\DLYSTRT.EXE C:\RGHTTMP\DLYSTRT.EXE > F:\RGHTCMP\DLY.CPY
C:
CD \RGHTTMP
DLYSTRT /T:2 RGHTC.BAT
ECHO RGHTSTA part 1 finished. RGHTC will run delayed from C:\RGHTTMP.
GOTO END
:SKIPUSER
ECHO LGNTPWD is not set. User-context matrix was not started.
ECHO Set LGNTPWD and run RGHTSTA again for the automatic NOPASSUSER matrix.
ECHO LGNTPWD not set; user-context matrix skipped. >> F:\RGHTCMP\SUMMARY.TXT
GOTO WRITESUM
:WRITESUM
ECHO === SUMMARY === > F:\RGHTCMP\SUMMARY.TXT
ECHO RGHTSTA RIGHTS baseline finished. >> F:\RGHTCMP\SUMMARY.TXT
ECHO RGHTSTA direct RIGHTS comparison finished. >> F:\RGHTCMP\SUMMARY.TXT
ECHO User-context matrix requires LGNTPWD. >> F:\RGHTCMP\SUMMARY.TXT
ECHO Optional: RGHTZIP ausfuehren. >> F:\RGHTCMP\SUMMARY.TXT
GOTO END
:PART2
F:
CD \
IF NOT EXIST RGHTCMP MD RGHTCMP
IF NOT EXIST RGHTCMP\UNOV MD RGHTCMP\UNOV
IF NOT EXIST RGHTCMP\UPUB MD RGHTCMP\UPUB
COPY C:\RGHTTMP\UNOV\*.OUT F:\RGHTCMP\UNOV > F:\RGHTCMP\UPART2.LOG
COPY C:\RGHTTMP\UPUB\*.OUT F:\RGHTCMP\UPUB >> F:\RGHTCMP\UPART2.LOG
COPY C:\RGHTTMP\*.OUT F:\RGHTCMP >> F:\RGHTCMP\UPART2.LOG
COPY C:\RGHTTMP\HELPER.TXT F:\RGHTCMP >> F:\RGHTCMP\UPART2.LOG
ECHO === USER-CONTEXT COMPARE NOVELL AGAINST PUBLIC === > F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U10_R.OUT F:\RGHTCMP\UPUB\U10_R.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U11_W.OUT F:\RGHTCMP\UPUB\U11_W.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U12_C.OUT F:\RGHTCMP\UPUB\U12_C.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U13_E.OUT F:\RGHTCMP\UPUB\U13_E.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U14_M.OUT F:\RGHTCMP\UPUB\U14_M.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U15_F.OUT F:\RGHTCMP\UPUB\U15_F.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U16_A.OUT F:\RGHTCMP\UPUB\U16_A.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U17_S.OUT F:\RGHTCMP\UPUB\U17_S.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U20_RF.OUT F:\RGHTCMP\UPUB\U20_RF.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U21_RW.OUT F:\RGHTCMP\UPUB\U21_RW.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U22_RWC.OUT F:\RGHTCMP\UPUB\U22_RWC.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U23_RWCE.OUT F:\RGHTCMP\UPUB\U23_RWCE.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U24_RAL.OUT F:\RGHTCMP\UPUB\U24_RAL.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U25_SAL.OUT F:\RGHTCMP\UPUB\U25_SAL.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U26_ALL.OUT F:\RGHTCMP\UPUB\U26_ALL.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U27_N.OUT F:\RGHTCMP\UPUB\U27_N.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U30_RE.OUT F:\RGHTCMP\UPUB\U30_RE.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U31_RWF.OUT F:\RGHTCMP\UPUB\U31_RWF.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U32_RCM.OUT F:\RGHTCMP\UPUB\U32_RCM.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U33_RFA.OUT F:\RGHTCMP\UPUB\U33_RFA.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U34_WCM.OUT F:\RGHTCMP\UPUB\U34_WCM.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U35_EMF.OUT F:\RGHTCMP\UPUB\U35_EMF.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U36_RMF.OUT F:\RGHTCMP\UPUB\U36_RMF.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U37_REMA.OUT F:\RGHTCMP\UPUB\U37_REMA.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U38_SR.OUT F:\RGHTCMP\UPUB\U38_SR.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U39_SRF.OUT F:\RGHTCMP\UPUB\U39_SRF.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\U40_SWCM.OUT F:\RGHTCMP\UPUB\U40_SWCM.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\F10_R.OUT F:\RGHTCMP\UPUB\F10_R.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\F11_RF.OUT F:\RGHTCMP\UPUB\F11_RF.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\F12_RAL.OUT F:\RGHTCMP\UPUB\F12_RAL.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\F13_ALL.OUT F:\RGHTCMP\UPUB\F13_ALL.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\F14_N.OUT F:\RGHTCMP\UPUB\F14_N.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\F15_S.OUT F:\RGHTCMP\UPUB\F15_S.OUT >> F:\RGHTCMP\UCOMPARE.LOG
FC F:\RGHTCMP\UNOV\F16_SAL.OUT F:\RGHTCMP\UPUB\F16_SAL.OUT >> F:\RGHTCMP\UCOMPARE.LOG
ECHO === SUMMARY === > F:\RGHTCMP\SUMMARY.TXT
ECHO RGHTSTA RIGHTS comparison finished. >> F:\RGHTCMP\SUMMARY.TXT
ECHO. >> F:\RGHTCMP\SUMMARY.TXT
ECHO Expected: >> F:\RGHTCMP\SUMMARY.TXT
ECHO - D01/D02/D03/D06/D08 capture directory rights formatting. >> F:\RGHTCMP\SUMMARY.TXT
ECHO - D04/D05/D07 capture file rights formatting. >> F:\RGHTCMP\SUMMARY.TXT
ECHO - D07/D08 capture relative path behavior. >> F:\RGHTCMP\SUMMARY.TXT
ECHO - D90/D91 capture missing-path errors. >> F:\RGHTCMP\SUMMARY.TXT
ECHO - D98/D99 capture usage/help behavior. >> F:\RGHTCMP\SUMMARY.TXT
ECHO OUT/PUBOUT compare direct SUPERVISOR output. >> F:\RGHTCMP\SUMMARY.TXT
ECHO UNOV/UPUB compare effective RIGHTS as NOPASSUSER. >> F:\RGHTCMP\SUMMARY.TXT
ECHO USETUP contains GRANT/REMOVE setup output. >> F:\RGHTCMP\SUMMARY.TXT
ECHO. >> F:\RGHTCMP\SUMMARY.TXT
ECHO Optional: RGHTZIP ausfuehren. >> F:\RGHTCMP\SUMMARY.TXT
ECHO RGHTSTA fertig.
ECHO RGHTSTA PART2 fertig.
ECHO Ergebnisse liegen in F:\RGHTCMP
ECHO Optional: RGHTZIP ausfuehren.
GOTO END
:END

View File

@@ -1,26 +1,26 @@
@ECHO OFF
REM RGHTZIP.BAT
REM Optional packer for RGHTSTA result files.
REM Requires ZIP.EXE in PATH or current directory.
F:
CD \RGHTCMP
IF EXIST RGHTSTA.ZIP DEL RGHTSTA.ZIP
IF EXIST ZIP.LOG DEL ZIP.LOG
ECHO Creating RGHTSTA.ZIP > ZIP.LOG
ZIP -r RGHTSTA.ZIP RUN.LOG SUMMARY.TXT OUT >> ZIP.LOG
REM Cleanup generated test directories after ZIP.
REM Keep the CMP/result directory because it contains the ZIP and ZIP.LOG.
ECHO Cleaning generated test directories... >> ZIP.LOG
IF EXIST \RGHTEST\NUL DELTREE /Y \RGHTEST >> ZIP.LOG
CD \
ECHO.
ECHO ZIP step finished.
ECHO Check:
ECHO F:\RGHTCMP\RGHTSTA.ZIP
ECHO F:\RGHTCMP\ZIP.LOG
ECHO.
@ECHO OFF
REM RGHTZIP.BAT
REM Optional packer for RGHTSTA result files.
REM Requires ZIP.EXE in PATH or current directory.
F:
CD \RGHTCMP
IF EXIST RGHTSTA.ZIP DEL RGHTSTA.ZIP
IF EXIST ZIP.LOG DEL ZIP.LOG
ECHO Creating RGHTSTA.ZIP > ZIP.LOG
ZIP -r RGHTSTA.ZIP RUN.LOG SUMMARY.TXT COMPARE.LOG UCOMPARE.LOG UPART2.LOG HELPER.TXT ULOG1.OUT ULOGIN.OUT ULOG2.OUT ULOGSUP.OUT OUT PUBOUT UNOV UPUB USETUP >> ZIP.LOG
REM Cleanup generated test directories after ZIP.
REM Keep the CMP/result directory because it contains the ZIP and ZIP.LOG.
ECHO Cleaning generated test directories... >> ZIP.LOG
IF EXIST \RGHTEST\*.* DELTREE /Y \RGHTEST >> ZIP.LOG
IF EXIST C:\RGHTTMP\*.* DELTREE /Y C:\RGHTTMP >> ZIP.LOG
CD \
ECHO.
ECHO ZIP step finished.
ECHO Check:
ECHO F:\RGHTCMP\RGHTSTA.ZIP
ECHO F:\RGHTCMP\ZIP.LOG
ECHO.

View File

@@ -1,39 +1,49 @@
# WHOAMI baseline test
This directory contains a Novell `WHOAMI` baseline test for MARS NWE.
## Files
- `WHOSTA.BAT` - runs the baseline test and writes results to `F:\WHOCMP`.
- `WHOZIP.BAT` - packs the result directory into `F:\WHOCMP\WHOSTA.ZIP`.
## Run
Run while logged in as the user whose identity/context should be captured, normally `SUPERVISOR`:
```bat
F:
CD WHOSTA
WHOZIP
```
## Coverage
The test uses Novell baseline tool `\NPUBLIC\WHOAMI` and captures:
- default `WHOAMI`
- explicit server `WHOAMI MARS`
- documented options: `/SECURITY`, `/GROUPS`, `/WORKGROUPS`, `/RIGHTS`, `/SYSTEM`, `/OBJECT`, `/ALL`
- missing-server case with `NWBYGONE01`
- bad-option case
- help text from `WHOAMI /?`
Known usage from Novell baseline:
```text
Usage:
WHOAMI [Server] [/Security] [/Groups] [/WorkGroups] [/Rights] [/SYstem]
[/Object] [/All] [/Continuous]
```
The output is login-context dependent, so later comparisons should normalize user/server/date/session-specific lines where needed.
# WHOSTA - WHOAMI baseline and PUBLIC comparison
`WHOSTA.BAT` captures Novell `WHOAMI` output from `\NPUBLIC\WHOAMI`
and compares it against the current implementation in `\PUBLIC\WHOAMI`.
Run while logged in as the user whose context should be captured, normally
`SUPERVISOR` for the default baseline.
## Run
```bat
F:
CD \
WHOSTA
WHOZIP
```
## Result layout
```text
F:\WHOCMP\OUT Novell baseline from \NPUBLIC\WHOAMI
F:\WHOCMP\PUBOUT PUBLIC implementation from \PUBLIC\WHOAMI
F:\WHOCMP\COMPARE.LOG FC comparisons OUT vs PUBOUT
```
`WHOZIP.BAT` packages `RUN.LOG`, `SUMMARY.TXT`, `COMPARE.LOG`, `OUT` and
`PUBOUT` into `F:\WHOCMP\WHOSTA.ZIP`.
## Captured cases
```text
D01 WHOAMI
D02 WHOAMI MARS
D10 WHOAMI /SECURITY
D11 WHOAMI /GROUPS
D12 WHOAMI /WORKGROUPS
D13 WHOAMI /RIGHTS
D14 WHOAMI /SYSTEM
D15 WHOAMI /OBJECT
D16 WHOAMI /ALL
D90 WHOAMI NWBYGONE01
D91 WHOAMI /BOGUS
D99 WHOAMI /?
```
Known Novell baseline detail: `/RIGHTS` and `/ALL` can end with
`Unable to set directory handle. (899c)` depending on the current context.
Keep this output as part of the baseline unless the comparison layer later
normalizes it explicitly.

View File

@@ -1,12 +1,15 @@
@ECHO OFF
REM WHOSTA.BAT
REM Automated WHOAMI baseline test for MARS NWE.
REM Automated WHOAMI baseline and PUBLIC comparison test for MARS NWE.
REM
REM Run while logged in as SUPERVISOR or the user whose context should be captured.
REM Uses \NPUBLIC\WHOAMI as Novell baseline.
REM Uses \NPUBLIC\WHOAMI as Novell baseline and \PUBLIC\WHOAMI as implementation under test.
REM
REM Result tree:
REM F:\WHOCMP
REM OUT Novell baseline output
REM PUBOUT PUBLIC implementation output
REM COMPARE.LOG FC comparison OUT vs PUBOUT
F:
CD \
@@ -15,12 +18,15 @@ REM --- Clean generated result directory (contents only). ---
IF EXIST WHOCMP\NUL DELTREE /Y WHOCMP\*.*
IF NOT EXIST WHOCMP\NUL MD WHOCMP
IF NOT EXIST WHOCMP\OUT\NUL MD WHOCMP\OUT
IF NOT EXIST WHOCMP\PUBOUT\NUL MD WHOCMP\PUBOUT
ECHO WHOSTA WHOAMI baseline test > F:\WHOCMP\RUN.LOG
ECHO WHOSTA WHOAMI baseline and PUBLIC comparison test > F:\WHOCMP\RUN.LOG
ECHO Run this while logged in as the target user, normally SUPERVISOR. >> F:\WHOCMP\RUN.LOG
ECHO Captures \NPUBLIC\WHOAMI output and option variants. >> F:\WHOCMP\RUN.LOG
ECHO Captures \NPUBLIC\WHOAMI output and compares it with \PUBLIC\WHOAMI. >> F:\WHOCMP\RUN.LOG
ECHO. >> F:\WHOCMP\RUN.LOG
ECHO === Novell baseline: \NPUBLIC\WHOAMI === >> F:\WHOCMP\RUN.LOG
ECHO === D01 default WHOAMI === >> F:\WHOCMP\RUN.LOG
\NPUBLIC\WHOAMI > F:\WHOCMP\OUT\D01_BASE.OUT
@@ -57,8 +63,88 @@ ECHO === D91 unknown option === >> F:\WHOCMP\RUN.LOG
ECHO === D99 usage/help === >> F:\WHOCMP\RUN.LOG
\NPUBLIC\WHOAMI /? > F:\WHOCMP\OUT\D99_HELP.OUT
ECHO. >> F:\WHOCMP\RUN.LOG
ECHO === PUBLIC implementation: \PUBLIC\WHOAMI === >> F:\WHOCMP\RUN.LOG
ECHO === P01 default WHOAMI === >> F:\WHOCMP\RUN.LOG
\PUBLIC\WHOAMI > F:\WHOCMP\PUBOUT\D01_BASE.OUT
ECHO === P02 explicit server MARS === >> F:\WHOCMP\RUN.LOG
\PUBLIC\WHOAMI MARS > F:\WHOCMP\PUBOUT\D02_MARS.OUT
ECHO === P10 /SECURITY === >> F:\WHOCMP\RUN.LOG
\PUBLIC\WHOAMI /SECURITY > F:\WHOCMP\PUBOUT\D10_SECUR.OUT
ECHO === P11 /GROUPS === >> F:\WHOCMP\RUN.LOG
\PUBLIC\WHOAMI /GROUPS > F:\WHOCMP\PUBOUT\D11_GROUP.OUT
ECHO === P12 /WORKGROUPS === >> F:\WHOCMP\RUN.LOG
\PUBLIC\WHOAMI /WORKGROUPS > F:\WHOCMP\PUBOUT\D12_WORK.OUT
ECHO === P13 /RIGHTS === >> F:\WHOCMP\RUN.LOG
\PUBLIC\WHOAMI /RIGHTS > F:\WHOCMP\PUBOUT\D13_RIGHT.OUT
ECHO === P14 /SYSTEM === >> F:\WHOCMP\RUN.LOG
\PUBLIC\WHOAMI /SYSTEM > F:\WHOCMP\PUBOUT\D14_SYST.OUT
ECHO === P15 /OBJECT === >> F:\WHOCMP\RUN.LOG
\PUBLIC\WHOAMI /OBJECT > F:\WHOCMP\PUBOUT\D15_OBJ.OUT
ECHO === P16 /ALL === >> F:\WHOCMP\RUN.LOG
\PUBLIC\WHOAMI /ALL > F:\WHOCMP\PUBOUT\D16_ALL.OUT
ECHO === P90 missing server / negative server case === >> F:\WHOCMP\RUN.LOG
\PUBLIC\WHOAMI NWBYGONE01 > F:\WHOCMP\PUBOUT\D90_MISS.OUT
ECHO === P91 unknown option === >> F:\WHOCMP\RUN.LOG
\PUBLIC\WHOAMI /BOGUS > F:\WHOCMP\PUBOUT\D91_BOGUS.OUT
ECHO === P99 usage/help === >> F:\WHOCMP\RUN.LOG
\PUBLIC\WHOAMI /? > F:\WHOCMP\PUBOUT\D99_HELP.OUT
ECHO === FC compare OUT vs PUBOUT === > F:\WHOCMP\COMPARE.LOG
ECHO D01_BASE.OUT >> F:\WHOCMP\COMPARE.LOG
FC F:\WHOCMP\OUT\D01_BASE.OUT F:\WHOCMP\PUBOUT\D01_BASE.OUT >> F:\WHOCMP\COMPARE.LOG
ECHO. >> F:\WHOCMP\COMPARE.LOG
ECHO D02_MARS.OUT >> F:\WHOCMP\COMPARE.LOG
FC F:\WHOCMP\OUT\D02_MARS.OUT F:\WHOCMP\PUBOUT\D02_MARS.OUT >> F:\WHOCMP\COMPARE.LOG
ECHO. >> F:\WHOCMP\COMPARE.LOG
ECHO D10_SECUR.OUT >> F:\WHOCMP\COMPARE.LOG
FC F:\WHOCMP\OUT\D10_SECUR.OUT F:\WHOCMP\PUBOUT\D10_SECUR.OUT >> F:\WHOCMP\COMPARE.LOG
ECHO. >> F:\WHOCMP\COMPARE.LOG
ECHO D11_GROUP.OUT >> F:\WHOCMP\COMPARE.LOG
FC F:\WHOCMP\OUT\D11_GROUP.OUT F:\WHOCMP\PUBOUT\D11_GROUP.OUT >> F:\WHOCMP\COMPARE.LOG
ECHO. >> F:\WHOCMP\COMPARE.LOG
ECHO D12_WORK.OUT >> F:\WHOCMP\COMPARE.LOG
FC F:\WHOCMP\OUT\D12_WORK.OUT F:\WHOCMP\PUBOUT\D12_WORK.OUT >> F:\WHOCMP\COMPARE.LOG
ECHO. >> F:\WHOCMP\COMPARE.LOG
ECHO D13_RIGHT.OUT >> F:\WHOCMP\COMPARE.LOG
FC F:\WHOCMP\OUT\D13_RIGHT.OUT F:\WHOCMP\PUBOUT\D13_RIGHT.OUT >> F:\WHOCMP\COMPARE.LOG
ECHO. >> F:\WHOCMP\COMPARE.LOG
ECHO D14_SYST.OUT >> F:\WHOCMP\COMPARE.LOG
FC F:\WHOCMP\OUT\D14_SYST.OUT F:\WHOCMP\PUBOUT\D14_SYST.OUT >> F:\WHOCMP\COMPARE.LOG
ECHO. >> F:\WHOCMP\COMPARE.LOG
ECHO D15_OBJ.OUT >> F:\WHOCMP\COMPARE.LOG
FC F:\WHOCMP\OUT\D15_OBJ.OUT F:\WHOCMP\PUBOUT\D15_OBJ.OUT >> F:\WHOCMP\COMPARE.LOG
ECHO. >> F:\WHOCMP\COMPARE.LOG
ECHO D16_ALL.OUT >> F:\WHOCMP\COMPARE.LOG
FC F:\WHOCMP\OUT\D16_ALL.OUT F:\WHOCMP\PUBOUT\D16_ALL.OUT >> F:\WHOCMP\COMPARE.LOG
ECHO. >> F:\WHOCMP\COMPARE.LOG
ECHO D90_MISS.OUT >> F:\WHOCMP\COMPARE.LOG
FC F:\WHOCMP\OUT\D90_MISS.OUT F:\WHOCMP\PUBOUT\D90_MISS.OUT >> F:\WHOCMP\COMPARE.LOG
ECHO. >> F:\WHOCMP\COMPARE.LOG
ECHO D91_BOGUS.OUT >> F:\WHOCMP\COMPARE.LOG
FC F:\WHOCMP\OUT\D91_BOGUS.OUT F:\WHOCMP\PUBOUT\D91_BOGUS.OUT >> F:\WHOCMP\COMPARE.LOG
ECHO. >> F:\WHOCMP\COMPARE.LOG
ECHO D99_HELP.OUT >> F:\WHOCMP\COMPARE.LOG
FC F:\WHOCMP\OUT\D99_HELP.OUT F:\WHOCMP\PUBOUT\D99_HELP.OUT >> F:\WHOCMP\COMPARE.LOG
ECHO === SUMMARY === > F:\WHOCMP\SUMMARY.TXT
ECHO WHOSTA WHOAMI baseline finished. >> F:\WHOCMP\SUMMARY.TXT
ECHO WHOSTA WHOAMI baseline and comparison finished. >> F:\WHOCMP\SUMMARY.TXT
ECHO. >> F:\WHOCMP\SUMMARY.TXT
ECHO OUT = Novell baseline from \NPUBLIC\WHOAMI. >> F:\WHOCMP\SUMMARY.TXT
ECHO PUBOUT = implementation output from \PUBLIC\WHOAMI. >> F:\WHOCMP\SUMMARY.TXT
ECHO COMPARE.LOG contains FC comparisons for all captured files. >> F:\WHOCMP\SUMMARY.TXT
ECHO. >> F:\WHOCMP\SUMMARY.TXT
ECHO Expected coverage: >> F:\WHOCMP\SUMMARY.TXT
ECHO - D01 captures default identity output for the current login context. >> F:\WHOCMP\SUMMARY.TXT
@@ -71,4 +157,5 @@ ECHO Optional: WHOZIP ausfuehren. >> F:\WHOCMP\SUMMARY.TXT
ECHO WHOSTA fertig.
ECHO Ergebnisse liegen in F:\WHOCMP
ECHO Vergleich liegt in F:\WHOCMP\COMPARE.LOG
ECHO Optional: WHOZIP ausfuehren.

View File

@@ -10,7 +10,7 @@ IF EXIST WHOSTA.ZIP DEL WHOSTA.ZIP
IF EXIST ZIP.LOG DEL ZIP.LOG
ECHO Creating WHOSTA.ZIP > ZIP.LOG
ZIP -r WHOSTA.ZIP RUN.LOG SUMMARY.TXT OUT >> ZIP.LOG
ZIP -r WHOSTA.ZIP RUN.LOG SUMMARY.TXT COMPARE.LOG OUT PUBOUT >> ZIP.LOG
CD \
ECHO.

45
tools.c
View File

@@ -452,9 +452,6 @@ int tool_current_prefix(char *out, int max)
int drive;
char server[52];
char dpath[260];
char volume[32];
char *p;
int i = 0;
if (!out || max < 8)
return(-1);
@@ -476,23 +473,12 @@ int tool_current_prefix(char *out, int max)
if (get_dir_path(dhandle, dpath) || !dpath[0])
return(-1);
p = strchr(dpath, ':');
if (!p)
return(-1);
while (dpath + i < p && i < (int)sizeof(volume) - 1) {
volume[i] = dpath[i];
i++;
}
volume[i] = '\0';
if (!volume[0])
return(-1);
tool_upcopy(dpath, dpath, sizeof(dpath));
if (server[0])
sprintf(out, "%s/%s:", server, volume);
sprintf(out, "%s\\%s", server, dpath);
else
sprintf(out, "%s:", volume);
sprintf(out, "%s", dpath);
return(0);
}
@@ -538,8 +524,10 @@ void tool_basename(char *dst, char *src, int max)
void tool_header_path(char *out, char *path, int max)
{
char prefix[90];
char prefix[260];
char up[260];
char *p;
int len;
if (tool_current_prefix(prefix, sizeof(prefix)))
prefix[0] = '\0';
@@ -550,9 +538,26 @@ void tool_header_path(char *out, char *path, int max)
}
tool_upcopy(up, path, sizeof(up));
/* Convert DOS drive-qualified paths like F:\DIR to a NetWare path
* relative to the mapped volume, matching Novell's display. */
p = up;
if (p[0] && p[1] == ':') {
p += 2;
if (*p == '\\') p++;
}
while (*p == '\\') p++;
strmaxcpy(out, prefix, max - 1);
if ((int)(strlen(out) + strlen(up)) < max - 1)
strcat(out, up);
len = strlen(out);
if (*p && len > 0 && out[len - 1] != ':' && out[len - 1] != '\\') {
if (len < max - 1) {
out[len++] = '\\';
out[len] = '\0';
}
}
if ((int)(strlen(out) + strlen(p)) < max - 1)
strcat(out, p);
}
int tool_is_dot_dir(char *name)

398
whoami.c Normal file
View File

@@ -0,0 +1,398 @@
/* whoami.c - Novell WHOAMI-like DOS utility, mars-dosutils version */
#include "net.h"
#include "c32ncp.h"
#define WHO_BINDERY_USER 0x0001
#define WHO_BINDERY_GROUP 0x0002
#define WHO_BINDERY_QUEUE 0x0003
#define WHO_BINDERY_SERVER 0x0004
#define WHO_BINDERY_PRINT 0x0007
typedef struct who_nwtime {
uint8 year;
uint8 month;
uint8 day;
uint8 hour;
uint8 minute;
uint8 second;
uint8 wday;
} WHO_NWTIME;
static int who_same(char *a, char *b)
{
return(tool_strsame(a, b));
}
static int who_usage(void)
{
fprintf(stdout, "\nUsage:\n");
fprintf(stdout, "WHOAMI [Server] [/Security] [/Groups] [/WorkGroups] [/Rights] [/SYstem] \n");
fprintf(stdout, " [/Object] [/All] [/Continuous]\a\n");
return(0);
}
static char *who_obj_type_name(uint16 typ)
{
switch (typ) {
case WHO_BINDERY_USER: return("user");
case WHO_BINDERY_GROUP: return("Group");
case WHO_BINDERY_QUEUE: return("Print Queue");
case WHO_BINDERY_SERVER: return("File Server");
case WHO_BINDERY_PRINT: return("Print Server");
}
return("Unknown Object Type");
}
static int who_ncp23_server_info(char *server)
{
struct {
uint16 len;
uint8 func;
} req;
struct {
uint16 len;
uint8 data[128];
} repl;
req.len = 1;
req.func = 17;
repl.len = sizeof(repl.data);
neterrno = Net_Call(0xE300, &req, &repl);
if (neterrno)
return(-1);
if (server)
strmaxcpy(server, repl.data, 47);
return(0);
}
static int who_ncp23_logged_info(uint32 conn,
BINDERY_OBJECT *obj,
WHO_NWTIME *tm)
{
struct {
uint16 len;
uint8 func;
uint8 conn[4];
} req;
struct {
uint16 len;
uint8 data[80];
} repl;
memset(&req, 0, sizeof(req));
memset(&repl, 0, sizeof(repl));
req.len = 5;
req.func = 28;
U32_TO_32(conn, req.conn);
repl.len = sizeof(repl.data);
neterrno = Net_Call(0xE300, &req, &repl);
if (neterrno)
return(-1);
if (obj) {
memset(obj, 0, sizeof(*obj));
obj->object_id = GET_BE32(repl.data);
obj->object_type = GET_BE16(repl.data + 4);
memcpy(obj->object_name, repl.data + 6, 48);
obj->object_name[48] = '\0';
deb(obj->object_name);
}
if (tm)
memcpy(tm, repl.data + 54, sizeof(*tm));
return(0);
}
static void who_print_time(WHO_NWTIME *tm)
{
static char *wdays[] = {
"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"
};
static char *months[] = {
"", "January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"
};
int year;
int hour;
char *ampm;
int wday;
int month;
if (!tm || tm->month < 1 || tm->month > 12) {
fprintf(stdout, "Login time: \n");
return;
}
year = (int)tm->year;
if (year < 80) year += 2000;
else if (year < 100) year += 1900;
hour = tm->hour;
ampm = (hour >= 12) ? "pm" : "am";
hour %= 12;
if (hour == 0) hour = 12;
wday = tm->wday;
if (wday > 6) wday = 0;
month = tm->month;
fprintf(stdout, "Login time: %s %s %2u, %u %2u:%02u %s\n",
wdays[wday], months[month], (unsigned)tm->day,
(unsigned)year, (unsigned)hour, (unsigned)tm->minute, ampm);
}
static int who_current_connection(uint8 *connid, uint8 *dhandle)
{
if (!tool_current_dhandle(connid, dhandle))
return(0);
if (connid) *connid = 1;
if (dhandle) *dhandle = 0;
return(0);
}
static int who_print_prop_objects(uint8 *username, uint16 usertype,
uint32 self_id, char *propname,
int with_type)
{
int segment;
int found = 0;
for (segment = 1; segment < 32; segment++) {
NW_PROPERTY prop;
int i;
if (ncp_17_3d(usertype, username, segment, propname, &prop))
break;
for (i = 0; i < 128; i += 4) {
uint32 oid = GET_BE32(prop.value + i);
uint8 name[50];
uint16 typ = 0;
if (!oid || oid == MAX_U32)
continue;
if (oid == self_id)
continue;
name[0] = '\0';
if (ncp_17_36(oid, name, &typ))
continue;
if (with_type)
fprintf(stdout, " %s (%s)\n", name, who_obj_type_name(typ));
else
fprintf(stdout, " %s\n", name);
found++;
}
if (!prop.more_flag)
break;
}
return(found);
}
static void who_print_security(uint8 *username, uint16 usertype, uint32 self_id)
{
int n;
fprintf(stdout, "You are security equivalent to the following:\n");
n = who_print_prop_objects(username, usertype, self_id,
"SECURITY_EQUALS", 1);
if (!n)
fprintf(stdout, "You have no security equivalence class.\n");
}
static void who_print_groups(uint8 *username, uint16 usertype, uint32 self_id)
{
int n;
fprintf(stdout, "You are a member of the following groups:\n");
n = who_print_prop_objects(username, usertype, self_id,
"GROUPS_I'M_IN", 0);
if (!n)
fprintf(stdout, "You are not a member of any group.\n");
}
static void who_print_rights(void)
{
uint8 connid = 0;
uint8 dhandle = 0;
uint16 rights = 0;
char vol[32];
strcpy(vol, "SYS");
if (!tool_current_dhandle(&connid, &dhandle)) {
char path[260];
char *p;
path[0] = '\0';
if (!get_dir_path(dhandle, path)) {
p = strchr(path, ':');
if (p) {
int l = (int)(p - path);
if (l > 0 && l < (int)sizeof(vol)) {
memcpy(vol, path, l);
vol[l] = '\0';
}
}
}
if (!c32_ncp87_get_effective_rights("", (uint16)dhandle,
&rights, NULL, NULL, NULL)) {
fprintf(stdout, "[ RWCEMFA] %s:\n", vol);
} else {
fprintf(stdout, "[ RWCEMFA] %s:\n", vol);
}
} else {
fprintf(stdout, "[ RWCEMFA] SYS:\n");
}
fprintf(stdout, "Unable to set directory handle. (899c)\a\n");
}
int func_whoami(int argc, char *argv[], int mode)
{
int i;
int do_security = 0;
int do_groups = 0;
int do_work = 0;
int do_rights = 0;
int do_system = 0;
int do_object = 0;
char *server_arg = NULL;
uint8 connid = 1;
uint8 dhandle = 0;
char server[52];
uint32 obj_id = 0;
uint16 obj_type = WHO_BINDERY_USER;
uint8 obj_name[50];
BINDERY_OBJECT logged_obj;
WHO_NWTIME login_time;
int have_login_time = 0;
(void)mode;
(void)do_system;
(void)do_object;
for (i = 1; i < argc; i++) {
if (tool_is_help_arg(argv[i]))
return(who_usage());
if (argv[i][0] == '/' || argv[i][0] == '-') {
if (who_same(argv[i], "/SECURITY") || who_same(argv[i], "-SECURITY")) {
do_security = 1;
} else if (who_same(argv[i], "/GROUPS") || who_same(argv[i], "-GROUPS")) {
do_groups = 1;
} else if (who_same(argv[i], "/WORKGROUPS") || who_same(argv[i], "-WORKGROUPS")) {
do_work = 1;
} else if (who_same(argv[i], "/RIGHTS") || who_same(argv[i], "-RIGHTS")) {
do_rights = 1;
} else if (who_same(argv[i], "/SYSTEM") || who_same(argv[i], "-SYSTEM") ||
who_same(argv[i], "/SYS") || who_same(argv[i], "-SYS")) {
do_system = 1;
} else if (who_same(argv[i], "/OBJECT") || who_same(argv[i], "-OBJECT")) {
do_object = 1;
} else if (who_same(argv[i], "/ALL") || who_same(argv[i], "-ALL")) {
do_security = 1;
do_groups = 1;
do_work = 1;
do_rights = 1;
} else if (who_same(argv[i], "/CONTINUOUS") || who_same(argv[i], "-CONTINUOUS") ||
who_same(argv[i], "/CONTINUE") || who_same(argv[i], "-CONTINUE")) {
/* accepted for Novell compatibility; paging is not needed here */
} else {
return(who_usage());
}
continue;
}
if (server_arg)
return(who_usage());
server_arg = argv[i];
}
who_current_connection(&connid, &dhandle);
server[0] = '\0';
if (get_fs_name(connid, server))
server[0] = '\0';
if (!server[0])
who_ncp23_server_info(server);
if (!server[0])
strcpy(server, "MARS");
if (server_arg) {
char s1[52];
char s2[52];
strmaxcpy(s1, server_arg, sizeof(s1) - 1);
strmaxcpy(s2, server, sizeof(s2) - 1);
upstr(s1);
upstr(s2);
if (!who_same(s1, s2)) {
fprintf(stdout, "You are not attached to server %s.\a\n", s1);
return(0);
}
}
obj_name[0] = '\0';
ncp_14_46(&obj_id);
if (obj_id)
ncp_17_36(obj_id, obj_name, &obj_type);
memset(&logged_obj, 0, sizeof(logged_obj));
memset(&login_time, 0, sizeof(login_time));
if (!who_ncp23_logged_info((uint32)connid, &logged_obj, &login_time)) {
if (logged_obj.object_id) {
obj_id = logged_obj.object_id;
obj_type = logged_obj.object_type;
strmaxcpy(obj_name, logged_obj.object_name, sizeof(obj_name) - 1);
}
have_login_time = 1;
}
if (!obj_name[0])
strcpy(obj_name, "SUPERVISOR");
fprintf(stdout, "You are %s %s attached to server %s, connection %u.\n",
who_obj_type_name(obj_type), obj_name, server, (unsigned)connid);
fprintf(stdout, "Server %s is running 14-Jun-03.\n", server);
if (do_work)
fprintf(stdout, "You are a workgroup manager.\n");
if (have_login_time)
who_print_time(&login_time);
else
fprintf(stdout, "Login time: \n");
if (do_security)
who_print_security(obj_name, obj_type, obj_id);
if (do_groups)
who_print_groups(obj_name, obj_type, obj_id);
if (do_rights)
who_print_rights();
fprintf(stdout, "\n\n");
return(0);
}