Compare commits

..

67 Commits

Author SHA1 Message Date
Mario Fetka
d570dd59ec docs: refresh NCOPY status and path helper usage
Document that NCOPY is still compiled but intentionally not registered in the
NET multicall dispatcher while the NCP87/OpenCreate -> NCP74 server-side copy
path remains under investigation.

Also remove NCOPY's local parent-pattern wrapper and call the shared
tool_parent_pattern() helper directly, while keeping the NCOPY-specific default
handling for empty parent and pattern results at the call site.

No behavior change.
2026-05-29 13:51:48 +02:00
Mario Fetka
686b27a668 tools: add shared path directory helper
Move the common path-is-directory check into tools.c and declare it in net.h.

Replace the local NDIR and Trustee helper implementations with
tool_path_is_dir(), and update NDIR, REMOVE and REVOKE callers to use the
shared helper directly. The helper preserves the existing behavior of treating
empty and current-directory paths as directories and otherwise falling back to
stat().

No behavior change.
2026-05-29 13:09:05 +02:00
Mario Fetka
e73eb89f8c docs: update NCP and IPX layer documentation
Update README and file-level comments after the NCP/IPX source split and
renames.

Document the current layering: ncpapi.c/ncpapi.h contain the ncpXX_YY_*
protocol API wrappers, ncpcall.c contains low-level requester/transport
helpers, ncp.asm/ncp.h provide INT 21h and Client32 requester entry points, and
ipx.asm/ipx.h provide IPX and far-memory assembly glue.

Also remove stale c32ncp/kern_wasm/kern.h planning references and update the
license section to mention the root-level COPYING file.

No behavior change.
2026-05-29 12:58:35 +02:00
Mario Fetka
892bea8a5e ncopy: use shared endian helpers
Replace the local NCOPY endian buffer helpers with the shared tools.c helpers.

This removes duplicate little-endian and big-endian get/put code while keeping
the experimental NCOPY NCP request layouts unchanged.

No behavior change.
2026-05-29 12:50:17 +02:00
Mario Fetka
b6bdbf958f tools: add shared parent path helper
Move the common parent path extraction helper into tools.c and declare it in
net.h.

Replace the local implementations in RIGHTS, NDIR and NWTESTS with
tool_parent_path(). The helper keeps the existing behavior of uppercasing the
path and preserving a trailing volume colon for parent paths such as SYS:.

No behavior change.
2026-05-29 12:46:13 +02:00
Mario Fetka
3a55cc9fc0 ipx: keep original Martin Stover copyright only
Remove the 2026 Mario Fetka copyright line from ipx.asm.

The file contains the split-out IPX and xmemmove assembly glue from the original
Martin Stover kern.asm code, without new authorship-bearing changes.

No behavior change.
2026-05-29 12:35:55 +02:00
Mario Fetka
34ec41e760 trustee: share trustee header path formatting
Move the shared GRANT/REMOVE/REVOKE header path formatting into trustee.c.

The Novell trustee tools display the server and volume separator as
SERVER/SYS: while keeping the remaining path separators as DOS backslashes.
Use one trustee_header_path() helper for that formatting instead of keeping
separate local copies in GRANT, REMOVE and REVOKE.

No behavior change.
2026-05-29 12:33:32 +02:00
Mario Fetka
f3e77819d8 dosutils: use shared option helper functions
Replace small local option helper wrappers with the shared tools.c helpers.

SLIST now uses tool_is_help_arg() directly, and REMOVE/REVOKE use
tool_is_files_option() and tool_is_subdirs_option() instead of Trustee-specific
wrappers. This keeps trustee.c focused on Rights/Trustee behavior and leaves
generic command-line option handling in tools.c.

No behavior change.
2026-05-29 12:27:02 +02:00
Mario Fetka
8f8ce00093 ncp: rename requester assembly header
Finish the ncpcall.asm/ncpcall.h to ncp.asm/ncp.h rename.

Update the Open Watcom build, object names, include directives, header guard,
README references and file-level dependency comments to use the shorter ncp
naming. The split remains the same: ncp.asm/ncp.h provide the low-level INT 21h
and Client32 requester entry points, ncpcall.c contains requester transport
helpers, and ncpapi.c contains the ncpXX_YY_* protocol API wrappers.

No behavior change.
2026-05-29 12:13:13 +02:00
Mario Fetka
98ffa17006 ncpcalls: split IPX and requester assembly glue
Split the Open Watcom assembly glue into separate IPX and NCP requester
modules.

Keep the IPX socket and far-memory helper entry points in ipx.asm and move the
INT 21h Net_Call plus Client32 requester entry points into ncpcall.asm. Split
the former kern.h declarations accordingly into ipx.h and ncpcall.h, and update
net.h and the Open Watcom build to use the new headers and object files.

This matches the current source layout where ncpcall.c owns the low-level NCP
transport helpers and ncpapi.c owns the ncpXX_YY_* protocol API wrappers.

No behavior change.
2026-05-29 12:04:16 +02:00
Mario Fetka
3740e1450c ncpapi: rename c32ncp files to NCP API names
Finish the c32ncp.c/c32ncp.h to ncpapi.c/ncpapi.h rename.

Update the build files, include directives, dependency tracking, header guard,
README references and file-level comments to use the new ncpapi naming. This
matches the current split where ncpapi contains the ncpXX_YY_* protocol API
wrappers and ncpcall contains the lower-level requester/transport helpers.

No behavior change.
2026-05-29 11:48:03 +02:00
Mario Fetka
d7f2a6551f ncpcalls: rename probe helpers as requester calls
Rename the remaining Client32 transport helper symbols from Probe-style names
to request-style names.

These helpers are no longer only diagnostic probes; they are the low-level
requester paths used by the NCP API wrappers. Rename the raw5 helper to the
more general ncp_raw_request() name and update the MapVar/OpenRef helpers to
ncp_mapvar_request() and ncp_openref_request().

No behavior change.
2026-05-29 11:40:32 +02:00
Mario Fetka
40e7ebf939 ncpcalls: rename remaining C32 transport symbols
Rename the remaining C32-prefixed transport helpers, probe helpers, types and
constants to protocol-oriented NCP names.

This removes implementation-oriented c32/C32 naming from the shared NCP API and
transport layer while keeping the current c32ncp.c/c32ncp.h file names until
the later ncpapi.c/ncpapi.h rename. The new names avoid conflicts by using
ncp_* helper names and NCP_* type/constant prefixes.

No behavior change.
2026-05-29 11:32:09 +02:00
Mario Fetka
9e89f85622 ncpcalls: move Client32 transport helpers out of NCP API file
Move the Client32/Raw5 transport helper routines from c32ncp.c into
ncpcall.c.

This keeps c32ncp.c focused on the ncpXX_YY_* protocol API wrappers in
preparation for the later ncpapi.c/ncpapi.h rename, while ncpcall.c owns the
lower-level requester and Client32 transport helpers.

No packet layout or NCP wrapper behavior is changed.
2026-05-29 11:23:25 +02:00
Mario Fetka
4b8e6e2792 ncpapi: collect protocol wrappers in c32ncp
Move the existing ncpXX_YY_* protocol wrapper implementations from ncpcall.c
into c32ncp.c.

This makes c32ncp.c the staging file for the future ncpapi.c rename, while
ncpcall.c is kept for lower-level requester/transport helpers. No function
names or packet logic are changed.

No behavior change.
2026-05-29 11:21:06 +02:00
Mario Fetka
c152661eeb c32ncp: use shared endian helpers
Replace the local endian buffer helpers in c32ncp.c with the shared tools.c
helpers.

This removes the remaining c32-local get/put helpers for little-endian and
big-endian packet fields while keeping the NCP wrapper logic unchanged. It also
keeps c32ncp.c focused on the future ncpapi role, with generic buffer handling
provided by tools.c.

No behavior change.
2026-05-29 11:11:12 +02:00
Mario Fetka
e7f67fa004 c32ncp: document NCP API wrapper functions
Add function-level comments to the NCP API wrappers in c32ncp.c.

Document the local packet helpers, Client32/Raw5 handle-path setup, NCP87
entry information and DOS information calls, effective rights lookup,
trustee-related NCP22/NCP87 wrappers, and the experimental NCP87/01,
NCP74 and NCP66 helpers used by the NCOPY investigation.

The comments are written so the file can later be renamed to ncpapi.c without
changing the documented API purpose.

No behavior change.
2026-05-29 10:57:57 +02:00
Mario Fetka
7c1499a16c ncpapi: use protocol names for NCP wrapper functions
Rename the public NCP wrapper functions in c32ncp.c/c32ncp.h from c32_ncp*
implementation-oriented names to protocol-oriented ncpXX_YY_* names.

This prepares the code for a later c32ncp.c/c32ncp.h -> ncpapi.c/ncpapi.h
file rename while keeping the current file names unchanged for now. The new
names keep the NCP function/subfunction visible and describe the operation
performed by each wrapper.

Update all callers to use the new names. Transport-specific helpers such as
c32_get_ncp_handle() are left unchanged.

No behavior change.
2026-05-29 10:50:05 +02:00
Mario Fetka
091dff6764 net: document multicall command dispatch
Add comments to net.c describing the NET multicall dispatch table and helper
flow.

Document how commands are resolved through NET <command> and renamed/stub-style
argv[0] invocation, how the mode field is used by shared handlers, and why
NCOPY is currently not registered in the dispatcher.

No behavior change.
2026-05-29 10:32:40 +02:00
Mario Fetka
ee5252c554 trustee: document rights and trustee helper functions
Add function-level comments to the Trustee/Rights helper routines in trustee.c.

Document option parsing, rights word parsing and formatting, bindery object
lookup, and trustee-specific directory handling. This clarifies the intended
split between generic helpers in tools.c and Trustee/Rights-specific behavior
in trustee.c.

No behavior change.
2026-05-29 10:22:52 +02:00
Mario Fetka
18323a6198 tools: document shared helper functions
Add function-level comments to the shared helper routines in tools.c.

Document the purpose and behavior of the common DOS compatibility, keyboard,
paging, memory, string, environment, current directory handle, path formatting,
wildcard and endian/NCP22 helper functions.

No behavior change.
2026-05-29 10:18:54 +02:00
Mario Fetka
7a444c6856 ncpcalls: document low-level NCP wrappers
Add function-level comments to the low-level NCP wrapper functions in
ncpcall.c.

Document each wrapper's purpose, NCP function/subfunction, requester path and
return behavior. The descriptions are based on the existing implementation and
cross-checked against the MARS-NWE admin sources and Novell SDK/WebSDK
references.

No behavior change.
2026-05-29 10:13:01 +02:00
Mario Fetka
adf16cab28 ncpcalls: keep bindery access level wrapper on NCP14 name
Rename the bindery access level wrapper from ncp17_46_get_bindery_access_level()
to ncp14_46_get_bindery_access_level().

The previous rename made the operation look like a normal NCP17 bindery wrapper,
but the historic implementation used the ncp_14_46 naming. Keep that protocol
reference visible while retaining the descriptive operation name.

No behavior change.
2026-05-29 10:01:48 +02:00
Mario Fetka
53e28c6bfe ncpcalls: use descriptive names for NCP wrapper functions
Rename the low-level NCP wrapper functions in ncpcall.c and net.h to include
both the NCP function/subfunction number and the operation they perform.

This keeps the numeric protocol reference visible for comparison with SDK
documentation and MARS-NWE logs, while making call sites easier to understand.
Update all callers to use the new names.

No behavior change.
2026-05-29 09:55:33 +02:00
Mario Fetka
19afe23651 dosutils: use shared path helper predicates
Replace small local path predicate wrappers with the shared tools.c helpers.

NDIR now uses tool_is_dot_dir() directly and NCOPY uses tool_has_wildcards()
for wildcard checks. More behavior-sensitive NCOPY path helpers are left local
for now to avoid changing path normalization or default handling while NCOPY
remains under investigation.
2026-05-29 09:49:14 +02:00
Mario Fetka
9ef8aeccc0 trustee: use shared tool helpers for generic path handling
Remove generic wrapper helpers from trustee.c and switch GRANT/REMOVE/REVOKE
callers to the shared tools.c helpers directly.

Keep trustee.c focused on Trustee/Rights-specific behavior such as option
parsing, rights parsing/formatting, object lookup and trustee path handling.
The generic string, current directory handle, uppercase and path helper logic
now lives in tools.c where it can be reused by other DOS utilities.
2026-05-29 09:44:14 +02:00
Mario Fetka
b3cec8eecf tools: add shared current directory handle helper
Add tool_current_dhandle_only() as a small wrapper for callers that only need
the current NetWare directory handle.

Replace the local creator_current_dhandle() and tests_current_dhandle()
implementations in CREATOR and NWTESTS with the shared helper. This removes
duplicate requester-current-directory code without changing behavior.
2026-05-29 09:38:08 +02:00
Mario Fetka
5fa36cc6f4 dosutils: use shared case-insensitive string helper
Replace local case-insensitive argument comparison helpers in MAP, SLIST,
WHOAMI and NWTESTS with the shared tool_strsame() helper.

This removes small duplicate helpers without changing command parsing behavior.
Trustee-specific wrappers and the experimental NCOPY code are intentionally
left untouched.
2026-05-29 09:32:23 +02:00
Mario Fetka
fc91f3f274 tools: add shared NCP22 name helper
Move the common NCP22 DOS name buffer helper into tools.c and declare it in
net.h.

Replace the local copy/uppercase implementations in CREATOR, FLAG, FLAGDIR,
NDIR and NWTESTS with tool_copy_ncp22_name(). The helper keeps the existing
behavior: uppercase conversion, path separator rejection and the 1..12 byte
DOS name length limit.

NCOPY is intentionally left untouched while its NCP copy path remains under
investigation.
2026-05-29 09:26:28 +02:00
Mario Fetka
0362cc7810 tools: add shared endian helpers
Move common little-endian and big-endian buffer helpers into tools.c and
declare them in net.h.

Replace local duplicate implementations in FLAG, FLAGDIR and NDIR with the
shared helpers. This keeps the existing packet layouts unchanged while reducing
copy/paste code across the DOS utilities.

NCOPY and the experimental NCP copy code are intentionally left untouched for
now.
2026-05-29 09:19:22 +02:00
Mario Fetka
de931af3c4 Correct copyright for historic file 2026-05-29 08:09:32 +02:00
Mario Fetka
50524cf759 dosutils: add GPL-2 headers and file descriptions
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.
2026-05-29 08:07:09 +02:00
Mario Fetka
4a952b4c4c dosutils: align Novell-compatible tests and stage NCOPY work
Update the DOS utilities and test suite with the current Novell comparison
state.

Validated/updated tool behavior:
- improve CREATOR output by showing Novell-style attribute and rights masks
- extend FLAGDIR handling with old NCP22 directory attribute read/write
  fallback paths
- expand NDIR Novell-style formatting, filtering, /SUB handling, date output,
  DI/RI attribute display and richer metadata collection
- adjust REVOKE output/grammar, recursive /SUBDIRECTORIES behavior and trustee
  update/delete paths to better match Novell tools
- adjust SLIST header/output behavior for logged-in and logged-out cases
- update README status to reflect the currently green/tested tools

Test-suite changes:
- add/refresh Novell comparison tests for CREATOR, NDIR, REVOKE and SLIST
- update NCOPY tests and collection scripts for the current investigation state
- refresh per-tool README files and top-level test documentation
- keep MAP documented as still separately open

NCOPY:
- add the current NCOPY implementation and experimental NCP74/server-side-copy
  scaffolding
- build ncopy.c so it stays compile-tested
- keep NCOPY disabled in the NET multicall dispatch for now because the
  server-side-copy/open-handle path is still unsafe and needs further analysis

Build:
- include ncopy.c in the DOS utility build
- drop the temporary MARS_DOSUTILS_VERSION define wiring from CMake
2026-05-29 07:40:04 +02:00
Mario Fetka
5da600c2a5 dosutils: match Novell paths for flags and trustees
Move FLAG, GRANT and REMOVE closer to the request paths used by the
Novell tools and extend the DOS comparison tests.

FLAG now reads attributes through the old NCP22 directory scan path and
writes them through NCP22/25 Set Directory/File Information. This keeps
extended attributes such as Delete Inhibit and Rename Inhibit intact and
matches the Novell behavior observed in the server logs.

GRANT now prefers NCP22/27 SetTrustee with an NCP87 fallback. Supervisor
rights are expanded like Novell does, so granting S sends and reports the
full SRWCEMFA mask. The visible output, path formatting and error text
are adjusted to match the Novell baseline.

REMOVE now prefers NCP22/2B DelTrustee with an NCP87 fallback. The
DelTrustee request layout is corrected, /SUBDIRS handling is aligned
with Novell, and the output/error text is matched to the baseline.

The FLAG, FLAGDIR, GRANT and REMOVE tests now compare NPUBLIC baselines
against the PUBLIC implementations and add delayed NOPASSUSER readback
checks using DLYSTRT and the maintainer LOGIN password option.
2026-05-28 07:54:41 +02:00
Mario Fetka
0fa4a6f700 dosutils: remove hard-coded MARS fallbacks
Do not fall back to the literal server name "MARS" in LOGIN or WHOAMI.

LOGIN now uses a neutral usage example and tries to resolve the current
file server through the active connection/NCP server info. If no server
name can be determined, it reports the Novell-style error:

  No known file server.

WHOAMI likewise no longer invents a default server name. If the current
server name cannot be resolved, it reports the Novell-style failure:

  Unable to get server name. (%x)

This keeps the tools usable on servers with arbitrary names instead of
silently producing MARS-specific output.
2026-05-27 20:30:56 +02:00
Mario Fetka
4ad455c6df 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.
2026-05-27 20:14:01 +02:00
Mario Fetka
f214e89d69 tests: add Novell DOS tool baseline suite
Add DOS-side baseline scripts for the Novell tools used to compare the
reimplemented public utilities.

The suite covers the current baseline set:

  MAP
  SLIST
  WHOAMI
  LOGIN / LOGOUT
  NDIR
  NCOPY
  FLAG
  FLAGDIR
  CREATOR
  RIGHTS
  GRANT
  REVOKE
  REMOVE

It also includes supporting trustee, rights, rename, move, delete and
file-operation tests.

Each test writes reproducible output into a per-tool CMP directory and
provides a matching ZIP helper for collecting the results. The ZIP
helpers clean generated test trees afterwards so SYS: does not keep
accumulating temporary directories.

This is the Novell baseline layer only. A later change can extend the
same scripts to run the full comparison cycle:

  NPUBLIC baseline -> PUBLIC implementation -> NPUBLIC control
2026-05-27 13:31:46 +02:00
Mario Fetka
0df41482c7 dosutils: add creator and supporting NCP helpers
Add the CREATOR utility and wire it into the DOS tools build and NET
command dispatch.

Extend the client-side NCP helpers with the calls needed by the new and
updated tools, including DOS namespace information and effective-rights
queries. Also update MAP handling for automatic drive mappings used by
the login script.

This commit contains the tool/source support only. The DOS baseline test
suite is kept separate and will be added in a follow-up commit.
2026-05-27 13:31:02 +02:00
Mario Fetka
6d2d3f367f dosutils: use NCP87 DOS info fields in NDIR
Add a Client32 NCP87 helper for obtaining DOS namespace file and
subdirectory information and use it in NDIR.

The new helper reads the classic NCP87 subfunction 6 RIM_ALL DOS info
block, including timestamps, inherited rights, directory identifiers and
size metadata.

Use the NCP87 inherited rights mask for the inherited-rights column while
keeping the existing Client32 effective-rights path for the effective
rights column.  Also use the NCP87 modify, archive, last-access and
creation date fields for the /DATES display, falling back to DOS
findfirst timestamps when the NCP87 info request is not available.

Tighten the /DATES layout so the full Created/Copied timestamp remains
within an 80-column DOS screen.
2026-05-25 09:17:56 +02:00
Mario Fetka
7117bfff68 dosutils: add Novell-style NDIR listing tool
Add an initial Novell-style NDIR implementation for the DOS utilities.

The new tool supports basic DOS namespace directory listings using
_dos_findfirst/_dos_findnext, including wildcard paths, current-directory
listing, files-only and directories-only modes, recursive /SUB listings,
continuous output and Novell-style help text.

NDIR separates file and directory output into Novell-like sections,
prints long NetWare-style attribute brackets, and reports both file bytes
and allocated bytes in blocks using a simple per-file 4 KiB block
approximation for the initial implementation.

Add initial /RIGHTS support.  The rights format displays rights columns
for files and directories, obtains effective rights through Client32
NCP87, and falls back to the older directory-handle effective-rights path
when needed.  For now the inherited-rights column uses the effective
rights value until a separate inherited-rights mask is available.

Add initial /DATES support with a Novell-style date column layout showing
Last Updated, Last Archived, Accessed and Created/Copied fields.  The
initial implementation uses the DOS findfirst update timestamp for the
available date values and placeholder archive/access values until full
NetWare namespace date fields are exposed.

Add /SHORT and /BRIEF as compact output modes for recursive listings and
manual testing.  These modes keep the useful values while suppressing the
large Novell-style section headers and empty recursive sections.

Wire NDIR into the multicall dispatcher, CMake build and install list,
and document the supported command forms in the README.

Owner display, true inherited-right masks, full namespace date fields,
sorting and restrictions remain future work.
2026-05-25 08:49:47 +02:00
Mario Fetka
c50202e93b dosutils: factor shared helpers and update README
Move common DOS utility helper code into tools.c and expose it through
net.h.  This removes duplicated command-local helpers from GRANT,
RIGHTS, FLAG, FLAGDIR and the trustee helper layer.

The shared helpers cover case-insensitive argument comparison, help and
option detection, /FILES and /SUBDIRS parsing, current network directory
handle lookup, current volume prefix formatting, uppercase DOS path
copying, basename/header-path handling, wildcard detection and simple
path joining/splitting.

Keep the command frontends smaller and less coupled so the current
multicall utility can later be split into smaller grouped multicall
binaries, such as trustee tools, login/session tools and file/flag
tools.

Update the DOS utilities README for the newer Client32 and trustee
commands.  Document RIGHTS, GRANT, REVOKE and REMOVE in the status,
feature, command and install sections.  Add command reference entries
for the trustee tools, including Novell-style syntax, supported rights,
recursive/file options and missing-trustee behavior.

Also mention the shared trustee helper layer and common tools.c helpers
used by the newer command frontends.
2026-05-24 20:45:56 +02:00
Mario Fetka
4cafe16980 dosutils: add Novell-style REVOKE and REMOVE trustee tools
Implement REVOKE and REMOVE for the Client32 DOS utilities.

REVOKE now supports Novell-style syntax:

  REVOKE rightslist* [FOR path] FROM [USER|GROUP] name [options]

and removes rights from explicit trustee assignments.  It scans the
trustee list first, updates the trustee rights mask, and deletes the
trustee entry when no rights remain.

REMOVE now supports Novell-style syntax:

  REMOVE [USER | GROUP] name [FROM path] [option]

and deletes explicit trustee assignments for users or groups.

Both tools support USER/GROUP lookup, /FILES, /SUBDIRS,
/SUBDIRECTORIES, wildcard file targets, recursive directory handling,
Novell-style help text and summary output.  Missing trustee entries are
reported with Novell-style "No trustee for the specified ..." messages.

Add shared trustee helpers and Client32 NCP87 trustee scan/delete
support.  Also adjust GRANT ALL so it matches Novell behavior by not
granting Supervisor implicitly; Supervisor must be granted explicitly.
2026-05-24 20:23:43 +02:00
Mario Fetka
fc97eb8d25 dosutils: add Novell-style paging to FLAG tools and SLIST
- add a shared DOS pager helper for long tool output
- page FLAG wildcard output with the Novell continue prompt
- fix FLAGDIR current-directory handling for "." and volume root
- add FLAGDIR wildcard directory listing support
- page FLAGDIR wildcard output like Novell FLAGDIR
- keep FLAGDIR display formatting aligned with Novell output
- make SLIST /CONTINUE enable continuous output
- keep SLIST bindery scanning compatible with ncpfs behavior
- preserve SLIST NET_ADDRESS display and default server marking
2026-05-24 15:51:38 +02:00
Mario Fetka
f940d2d88e dosutils: implement GRANT trustee management
- add GRANT as a new multi-call DOS utility
- implement Client32 NCP87 trustee-add helper
- resolve USER and GROUP bindery objects before granting rights
- support Novell-style rights lists, including ALL and N
- support directory trustee grants
- support file trustee grants via /FILES
- implement recursive grants via /SUBDIRECTORIES
- accept /SUBDIRS as a compatibility alias
- format GRANT success output close to Novell GRANT
- add GRANT comparison scripts for normal and recursive test cases
2026-05-24 13:27:07 +02:00
Mario Fetka
9ab65e2f00 dosutils: add RIGHTS and finish Novell-style display fixes
- add RIGHTS as a new multi-call DOS utility
- implement Client32 NCP87 effective-rights query helper
- map NCP effective-rights bits to Novell RIGHTS display order
- keep legacy directory-handle based rights lookup as fallback
- match Novell RIGHTS output for directories and files more closely
- remove hardcoded MARS/SYS and SYS display fallbacks from RIGHTS/FLAGDIR
- derive display prefixes from the active network drive where available
- adjust FLAGDIR output formatting to match Novell field alignment
- keep FLAG and SLIST unchanged after checking for hardcoded prefixes
2026-05-24 11:20:07 +02:00
Mario Fetka
456349088e Split DOS utility install between legacy and new binaries
Keep the previous DOS utility binary as netold.exe and use it as the
default source for legacy command names.  Install the new net.exe only for
tools that are not available in the legacy binary, currently SLIST, FLAG
and FLAGDIR.

Add CMake selection logic so maintainers can opt into installing the new
binary for all command names with MARS_NWE_INSTALL_NEW_DOSUTILS, while the
default install remains conservative for older NETX/DOSX-style setups.

Update the staged net.exe to the current Client32-enabled build and add
netold.exe as the preserved legacy binary.
2026-05-24 02:34:17 +02:00
Mario Fetka
f62ca19c50 Add Readme 2026-05-24 02:13:02 +02:00
Mario Fetka
ff92f72583 Add FLAGDIR utility and clean DOS utility build files
Add a NetWare-style FLAGDIR implementation for directory attributes and
register it in the multi-call DOS utility dispatcher.  The new command
supports the 386-style directory flags Normal, System, Hidden,
DeleteInhibit, Purge and RenameInhibit, and formats output close to the
Novell FLAGDIR tool for simple mapped paths.

Update the DOS utilities install/build metadata so flagdir.exe is emitted
alongside the other public tools.  Adjust the Open Watcom CMake build to
compile C sources into the build directory instead of leaving object files
in the source tree.

Move the historical Borland/TASM build files into doc/ to keep the active
source directory focused on the modern Watcom/CMake build.
2026-05-24 02:09:59 +02:00
Mario Fetka
83f8947ece Add Client32 NCP support for FLAG and FLAGDIR
Implement a working DOS Client32 NCP87 path using the NIOS resolver,
CONNOpenByReference and COMPATNcpRequestReply.

Add an initial FLAGDIR implementation for NetWare 386-style directory
attributes.  Support Normal, System, Hidden, Delete Inhibit, Purge and
Rename Inhibit, using the same Client32 NCP87 modify/read helpers.  Match
the Novell FLAGDIR display style more closely for simple mapped paths.

Also add/keep minimal TESTS coverage for the verified Client32 NCP87
attribute path.
2026-05-24 01:47:22 +02:00
Mario Fetka
87c1e50cf9 feat: add Client32 NCP support for FLAG 2026-05-24 00:33:28 +02:00
Mario Fetka
7f98d73738 test: add DOS interrupt and kernel test helpers 2026-05-24 00:33:17 +02:00
Mario Fetka
3a5b08a4bf feat: implement FLAG command handling 2026-05-24 00:33:03 +02:00
Mario Fetka
8b6685c501 fix: clean up MAP warnings 2026-05-24 00:32:52 +02:00
Mario Fetka
cfb58237da feat: add initial FLAG command 2026-05-24 00:32:28 +02:00
Mario Fetka
aaf29ed535 feat: add MAP delete support 2026-05-24 00:32:17 +02:00
Mario Fetka
6f998a497d feat: implement SLIST command 2026-05-24 00:32:17 +02:00
Mario Fetka
dbf7be5104 feat: add LOGIN variable support 2026-05-24 00:31:53 +02:00
Mario Fetka
4a4026e6dd fix: improve PATH insert handling 2026-05-24 00:31:53 +02:00
Mario Fetka
20343b497a feat: rework LOGIN command handling 2026-05-24 00:31:42 +02:00
Mario Fetka
e4227bfda8 feat: register initial SLIST command support 2026-05-24 00:31:31 +02:00
Mario Fetka
bb868613d9 feat: add password handling helpers 2026-05-24 00:31:17 +02:00
Mario Fetka
e4d67917bd feat: improve MAP redirection handling 2026-05-24 00:31:06 +02:00
Mario Fetka
b8a701b8fe build: switch DOS helper calls to cdecl 2026-05-24 00:30:40 +02:00
Mario Fetka
dd5e4e9a3b fix: adjust login password handling 2026-05-24 00:30:40 +02:00
Mario Fetka
82b0f918dd build: add Open Watcom build support 2026-05-24 00:30:28 +02:00
Mario Fetka
b16fc3a64b docs: reorganize project files and README 2026-05-24 00:30:15 +02:00
Mario Fetka
f375f79cce mars_dosutils-0.10 2026-05-24 00:29:46 +02:00
116 changed files with 25225 additions and 726 deletions

View File

@@ -1,17 +1,26 @@
# DOS utilities for mars-nwe. # DOS utilities for mars-nwe.
# #
# Default mode: install a prebuilt net.exe from this source tree. This keeps the # Default install mode uses a split:
# normal mars-nwe build independent from Open Watcom. # - legacy command names are installed from netold.exe
# - new command names that netold.exe does not contain are installed from net.exe
# #
# Maintainer mode: configure with -DMARS_NWE_BUILD_DOSUTILS=ON to rebuild # Maintainer mode can rebuild the new net.exe with Open Watcom. The freshly
# net.exe with Open Watcom v2 on Linux. # 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.
set(MARS_DOSUTILS_NET_EXE option(MAINTAINER_BUILD "Enable maintainer-only DOS tool helpers and diagnostics" OFF)
"${CMAKE_CURRENT_SOURCE_DIR}/net.exe"
CACHE FILEPATH "Prebuilt DOS net.exe used for installation when MARS_NWE_BUILD_DOSUTILS is 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"
) )
set(MARS_DOSUTILS_PUBLIC_TOOLS set(MARS_DOSUTILS_NEW_NET_EXE
"${CMAKE_CURRENT_SOURCE_DIR}/net.exe"
CACHE FILEPATH "New/experimental DOS net.exe used for new-only tools or when MARS_NWE_INSTALL_NEW_DOSUTILS is ON"
)
set(MARS_DOSUTILS_LEGACY_TOOLS
net net
login login
profile profile
@@ -23,13 +32,25 @@ set(MARS_DOSUTILS_PUBLIC_TOOLS
map map
mapdel mapdel
logout logout
slist
capture capture
endcap endcap
) )
# Do not install slist.exe yet: func_slist() is empty and SLIST is disabled in net.c. # Tools not present in netold.exe. These are installed from the new binary
# Do not install tests/debug by default either; they are developer-only helpers. # even in the default split mode.
set(MARS_DOSUTILS_NEW_ONLY_TOOLS
slist
flag
flagdir
rights
grant
revoke
remove
ndir
creator
whoami
ncopy
)
if(MARS_NWE_BUILD_DOSUTILS) if(MARS_NWE_BUILD_DOSUTILS)
find_package(OpenWatcom REQUIRED) find_package(OpenWatcom REQUIRED)
@@ -42,25 +63,86 @@ if(MARS_NWE_BUILD_DOSUTILS)
login.c login.c
map.c map.c
slist.c slist.c
ndir.c
flag.c
flagdir.c
rights.c
grant.c
revoke.c
remove.c
trustee.c
ncpapi.c
nwcrypt.c nwcrypt.c
nwdebug.c nwdebug.c
nwtests.c nwtests.c
capture.c capture.c
creator.c
whoami.c
ncopy.c
) )
add_custom_command( add_custom_command(
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/kern.obj" OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/ipx.obj"
COMMAND "${CMAKE_COMMAND}" -E env ${OPENWATCOM_ENV} COMMAND "${CMAKE_COMMAND}" -E env ${OPENWATCOM_ENV}
"${OPENWATCOM_WASM}" "${OPENWATCOM_WASM}"
-q -q
-zq -zq
-fo="${CMAKE_CURRENT_BINARY_DIR}/kern.obj" -fo="${CMAKE_CURRENT_BINARY_DIR}/ipx.obj"
"${CMAKE_CURRENT_SOURCE_DIR}/kern_wasm.asm" "${CMAKE_CURRENT_SOURCE_DIR}/ipx.asm"
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/kern_wasm.asm" DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/ipx.asm"
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
VERBATIM VERBATIM
) )
add_custom_command(
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/ncp.obj"
COMMAND "${CMAKE_COMMAND}" -E env ${OPENWATCOM_ENV}
"${OPENWATCOM_WASM}"
-q
-zq
-fo="${CMAKE_CURRENT_BINARY_DIR}/ncp.obj"
"${CMAKE_CURRENT_SOURCE_DIR}/ncp.asm"
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/ncp.asm"
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
VERBATIM
)
set(DOSUTILS_OBJECTS)
foreach(src IN LISTS DOSUTILS_C_SOURCES)
get_filename_component(obj_name "${src}" NAME_WE)
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}
"${OPENWATCOM_WCL}"
-q
-zq
-bt=dos
-ml
-0
${DOSUTILS_WCL_DEFS}
-c
-fo="${obj}"
"${CMAKE_CURRENT_SOURCE_DIR}/${src}"
DEPENDS
"${CMAKE_CURRENT_SOURCE_DIR}/${src}"
"${CMAKE_CURRENT_SOURCE_DIR}/net.h"
"${CMAKE_CURRENT_SOURCE_DIR}/ipx.h"
"${CMAKE_CURRENT_SOURCE_DIR}/ncp.h"
"${CMAKE_CURRENT_SOURCE_DIR}/ncpapi.h"
"${CMAKE_CURRENT_SOURCE_DIR}/nwcrypt.h"
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
VERBATIM
)
endforeach()
add_custom_command( add_custom_command(
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/net.exe" OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/net.exe"
COMMAND "${CMAKE_COMMAND}" -E env ${OPENWATCOM_ENV} COMMAND "${CMAKE_COMMAND}" -E env ${OPENWATCOM_ENV}
@@ -72,15 +154,14 @@ if(MARS_NWE_BUILD_DOSUTILS)
-0 -0
-k32768 -k32768
-fe="${CMAKE_CURRENT_BINARY_DIR}/net.exe" -fe="${CMAKE_CURRENT_BINARY_DIR}/net.exe"
${DOSUTILS_C_SOURCES} ${DOSUTILS_OBJECTS}
"${CMAKE_CURRENT_BINARY_DIR}/kern.obj" "${CMAKE_CURRENT_BINARY_DIR}/ipx.obj"
"${CMAKE_CURRENT_BINARY_DIR}/ncp.obj"
DEPENDS DEPENDS
${DOSUTILS_C_SOURCES} ${DOSUTILS_OBJECTS}
"${CMAKE_CURRENT_BINARY_DIR}/kern.obj" "${CMAKE_CURRENT_BINARY_DIR}/ipx.obj"
net.h "${CMAKE_CURRENT_BINARY_DIR}/ncp.obj"
kern.h WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
nwcrypt.h
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
VERBATIM VERBATIM
) )
@@ -88,32 +169,109 @@ if(MARS_NWE_BUILD_DOSUTILS)
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/net.exe" DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/net.exe"
) )
set(MARS_DOSUTILS_NET_EXE "${CMAKE_CURRENT_BINARY_DIR}/net.exe") set(MARS_DOSUTILS_BUILT_NET_EXE "${CMAKE_CURRENT_BINARY_DIR}/net.exe")
else()
if(NOT EXISTS "${MARS_DOSUTILS_NET_EXE}") if(MAINTAINER_BUILD)
message(FATAL_ERROR add_custom_command(
"Prebuilt DOS utility missing: ${MARS_DOSUTILS_NET_EXE}. " OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/dlystrt.exe"
"Either commit net.exe into dosutils or configure with " COMMAND "${CMAKE_COMMAND}" -E env ${OPENWATCOM_ENV}
"-DMARS_NWE_BUILD_DOSUTILS=ON and Open Watcom installed." "${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()
if(MARS_NWE_BUILD_DOSUTILS)
set(MARS_DOSUTILS_SELECTED_NEW_EXE "${MARS_DOSUTILS_BUILT_NET_EXE}")
else()
set(MARS_DOSUTILS_SELECTED_NEW_EXE "${MARS_DOSUTILS_NEW_NET_EXE}")
endif()
if(MARS_NWE_INSTALL_NEW_DOSUTILS)
set(MARS_DOSUTILS_SELECTED_LEGACY_EXE "${MARS_DOSUTILS_SELECTED_NEW_EXE}")
else()
set(MARS_DOSUTILS_SELECTED_LEGACY_EXE "${MARS_DOSUTILS_LEGACY_NET_EXE}")
endif()
set(MARS_DOSUTILS_SELECTED_LEGACY_IS_BUILT FALSE)
set(MARS_DOSUTILS_SELECTED_NEW_IS_BUILT FALSE)
if(MARS_NWE_BUILD_DOSUTILS)
if(MARS_DOSUTILS_SELECTED_LEGACY_EXE STREQUAL MARS_DOSUTILS_BUILT_NET_EXE)
set(MARS_DOSUTILS_SELECTED_LEGACY_IS_BUILT TRUE)
endif()
if(MARS_DOSUTILS_SELECTED_NEW_EXE STREQUAL MARS_DOSUTILS_BUILT_NET_EXE)
set(MARS_DOSUTILS_SELECTED_NEW_IS_BUILT TRUE)
endif() endif()
endif() endif()
foreach(tool IN LISTS MARS_DOSUTILS_PUBLIC_TOOLS) if(MARS_NWE_INSTALL_DOSUTILS)
if(NOT MARS_DOSUTILS_SELECTED_LEGACY_IS_BUILT AND NOT EXISTS "${MARS_DOSUTILS_SELECTED_LEGACY_EXE}")
message(FATAL_ERROR
"Selected legacy/default DOS utility missing: ${MARS_DOSUTILS_SELECTED_LEGACY_EXE}. "
"Commit dosutils/netold.exe, enable MARS_NWE_INSTALL_NEW_DOSUTILS, "
"or enable MARS_NWE_BUILD_DOSUTILS."
)
endif()
if(NOT MARS_DOSUTILS_SELECTED_NEW_IS_BUILT AND NOT EXISTS "${MARS_DOSUTILS_SELECTED_NEW_EXE}")
message(FATAL_ERROR
"Selected new DOS utility missing: ${MARS_DOSUTILS_SELECTED_NEW_EXE}. "
"Commit dosutils/net.exe or enable MARS_NWE_BUILD_DOSUTILS."
)
endif()
message(STATUS "DOS legacy/default utility binary: ${MARS_DOSUTILS_SELECTED_LEGACY_EXE}")
message(STATUS "DOS new-only utility binary: ${MARS_DOSUTILS_SELECTED_NEW_EXE}")
foreach(tool IN LISTS MARS_DOSUTILS_LEGACY_TOOLS)
if(tool STREQUAL "net") if(tool STREQUAL "net")
install(FILES "${MARS_DOSUTILS_NET_EXE}" install(FILES "${MARS_DOSUTILS_SELECTED_LEGACY_EXE}"
DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public") DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public"
RENAME net.exe)
else() else()
install(FILES "${MARS_DOSUTILS_NET_EXE}" install(FILES "${MARS_DOSUTILS_SELECTED_LEGACY_EXE}"
DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public" DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public"
RENAME "${tool}.exe") RENAME "${tool}.exe")
endif() endif()
endforeach() endforeach()
install(FILES "${MARS_DOSUTILS_NET_EXE}" foreach(tool IN LISTS MARS_DOSUTILS_NEW_ONLY_TOOLS)
install(FILES "${MARS_DOSUTILS_SELECTED_NEW_EXE}"
DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public"
RENAME "${tool}.exe")
endforeach()
install(FILES "${MARS_DOSUTILS_SELECTED_LEGACY_EXE}"
DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/login" DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/login"
RENAME login.exe) RENAME login.exe)
install(FILES "${MARS_DOSUTILS_NET_EXE}" install(FILES "${MARS_DOSUTILS_SELECTED_LEGACY_EXE}"
DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/login" DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/login"
RENAME map.exe) RENAME map.exe)
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()

338
COPYING Normal file
View File

@@ -0,0 +1,338 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
<https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
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 <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Moe Ghoul>, 1 April 1989
Moe Ghoul, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

474
README.md
View File

@@ -5,9 +5,43 @@ DOS client-side utilities for **mars_nwe** and compatible NetWare-style NCP envi
This repository contains the source for a small DOS utility suite built around a **single multi-call executable**, `net.exe`. The program can be used either as: This repository contains the source for a small DOS utility suite built around a **single multi-call executable**, `net.exe`. The program can be used either as:
- `net <command> [args...]`, or - `net <command> [args...]`, or
- a renamed executable such as `login.exe`, `map.exe`, `capture.exe`, or `logout.exe` - a renamed executable such as `login.exe`, `map.exe`, `flag.exe`, `flagdir.exe`, `rights.exe`, `grant.exe`, `revoke.exe`, `remove.exe`, `capture.exe`, or `logout.exe`.
That design is explicit in the command table in `net.c`, and the install rules also deploy the same binary under multiple command names. The original project documentation describes it as a “simple DOS-client program to allow standard NCP network actions, mainly for mars_nwe,” and also notes that it was still incomplete at the time of writing. The command dispatcher lives in `net.c`, and the install rules deploy the same binary under multiple command names in `SYS:PUBLIC` and selected names in `SYS:LOGIN`.
## Current status
The tree is a modernization of the historical mars_nwe DOS utilities. It still
keeps the original Borland-era style and APIs where useful, but now also has an
Open Watcom/CMake build path and working DOS Client32 support for the
Novell-compatible comparison tests.
Recently validated with byte-for-byte Novell comparison tests or equivalent
readback tests:
- `CREATOR` metadata/xattr readback, including readable attribute and rights-mask output
- `FLAG` file attribute display and modification, including high NetWare bits such as DI/RI
- `FLAGDIR` directory attribute display and modification
- `GRANT` trustee assignment matrix and normal-user rights readback
- `NDIR` directory listing, filters, `/DATES`, `/RIGHTS`, `/SUB`, DI/RI display and user-context readback
- `REMOVE` trustee deletion matrix and normal-user rights readback
- `REVOKE` trustee-right removal matrix and normal-user rights readback
- `RIGHTS` effective-rights display
- `SLIST` server listing while logged in and while logged out from `SYS:LOGIN`
- `WHOAMI` option/output comparison
- maintainer baseline for `LOGIN`/`LOGOUT`
The DOS test suite is documented in [`test/README.md`](test/README.md). Each
feature directory also contains its own README with run instructions and result
layout.
Still to validate or continue:
- full `PUBLIC\MAP` comparison against Novell `MAP` beyond the current MAP baseline/semantics test
- DOSX/VLM/NETX fallback behavior where relevant
- OS/2 requester/tool behavior
- additional Novell-like utilities such as `PURGE` and `SALVAGE`
- further MARS-NWE server-side NCP endpoint coverage where newer tests expose gaps
## Features ## Features
@@ -18,7 +52,16 @@ That design is explicit in the command table in `net.c`, and the install rules a
- Printer capture and release (`CAPTURE`, `ENDCAP`) - Printer capture and release (`CAPTURE`, `ENDCAP`)
- Scripted session setup through command files - Scripted session setup through command files
- External program execution via `SPAWN` and `EXEC` - External program execution via `SPAWN` and `EXEC`
- Server listing through `SLIST`
- Directory listing through `NDIR`
- File attribute management through `FLAG`
- Directory attribute management through `FLAGDIR`
- Effective rights display through `RIGHTS`
- Trustee rights assignment through `GRANT`
- Trustee rights removal through `REVOKE`
- Trustee assignment deletion through `REMOVE`
- Optional mars_nwe debug control hooks - Optional mars_nwe debug control hooks
- Developer diagnostics through `TESTS`
## Available commands ## Available commands
@@ -37,31 +80,73 @@ The current command dispatcher includes these built-ins:
- `PATHDEL` - `PATHDEL`
- `CAPTURE` - `CAPTURE`
- `ENDCAP` - `ENDCAP`
- `SLIST`
- `NDIR`
- `FLAG`
- `FLAGDIR`
- `RIGHTS`
- `GRANT`
- `REVOKE`
- `REMOVE`
- `DEBUG` - `DEBUG`
- `ECHO` - `ECHO`
- `CD` - `CD`
- `TESTS` (developer/testing only) - `TESTS` developer/testing only
`SLIST` is present in the historical build/install metadata, but the command is disabled in the dispatcher and the provided `slist.c` is only a stub in this source snapshot. The CMake install rules also install the multi-call `net.exe` under several of those command names.
## How it works ## How it works
The program resolves the command from either: The program resolves the command from either:
1. the executable name itself, or 1. the executable name itself, or
2. the first command-line argument 2. the first command-line argument.
That means all of the following styles are valid: That means all of the following styles are valid:
```text ```text
NET LOGIN alice secret NET LOGIN alice secret
NET MAP F:=SYS: NET MAP F:=SYS:
NET FLAG LOGIN.EXE
LOGIN.EXE alice secret LOGIN.EXE alice secret
MAP.EXE F:=SYS: MAP.EXE F:=SYS:
FLAG.EXE LOGIN.EXE A
CAPTURE.EXE LPT1 Q1 CAPTURE.EXE LPT1 Q1
``` ```
This is one of the key design ideas of the project, and the original README specifically recommends copying or linking `net.exe` to `login.exe` for convenience. ## NCP requester and API layers
The modern NCP support is split into small layers so protocol code and
requester transport code stay separate:
- `ncpapi.c` / `ncpapi.h` contain the named `ncpXX_YY_*` protocol API wrappers.
- `ncpcall.c` contains lower-level requester and Client32 transport helpers.
- `ncp.asm` / `ncp.h` provide the INT 21h `Net_Call` and Client32 requester entry points.
- `ipx.asm` / `ipx.h` provide the remaining IPX socket and far-memory assembly glue.
The validated Client32 sequence is:
```text
ncp_mapvar_request(4,0)
-> obtains the active connection reference
ncp_openref_request()
-> opens that reference and returns a Client32 handle
ncp_raw_request()
-> sends NCP 87 requests through COMPATNcpRequestReply
```
This path is currently used by:
- `FLAG`
- `FLAGDIR`
- `RIGHTS`
- `GRANT`
- `REVOKE`
- `REMOVE`
The old `Net_Call` / INT 21h requester path is kept as a fallback where appropriate, but Client32-backed raw NCP requests are now preferred for the validated FLAG-family and trustee operations.
## Command reference ## Command reference
@@ -92,10 +177,7 @@ Change a user password.
PASSWD [user] PASSWD [user]
``` ```
Notes: If no username is supplied, the tool attempts to resolve the currently logged-in user. The password-change code prefers the encrypted/keyed flow where available and keeps older unencrypted calls as fallback.
- If no username is supplied, the tool attempts to resolve the currently logged-in user. fileciteturn1file2L162-L190
- The source comments note that password changes currently use the older unencrypted password-change call.
### `PROFILE` ### `PROFILE`
@@ -105,7 +187,7 @@ Execute a command script.
PROFILE <filename> PROFILE <filename>
``` ```
This is a central part of the workflow. The command reader parses non-empty lines, ignores `#` comments, uppercases the command token, and dispatches it through the same internal command table used for direct invocation. `ECHO` is treated specially so the rest of the line is preserved as a single string. The command reader parses non-empty lines, ignores `#` comments, uppercases the command token, and dispatches it through the same internal command table used for direct invocation. `ECHO` is treated specially so the rest of the line is preserved as a single string.
### `SPAWN` ### `SPAWN`
@@ -157,7 +239,7 @@ List or set a search-path entry.
PATH sn:[=[path]] PATH sn:[=[path]]
``` ```
Where `sn` is `s1` through `s16`. The original documentation notes that this updates the path environment rather than directly creating a drive mapping. Where `sn` is `s1` through `s16`.
### `PATHINS` ### `PATHINS`
@@ -211,6 +293,265 @@ Example:
ENDCAP LPT1 ENDCAP LPT1
``` ```
### `SLIST`
List known NetWare file servers.
Typical usage:
```text
SLIST [server] [/Continue]
```
The current `slist.c` implementation scans bindery file server objects and prints known servers.
### `FLAG`
Display or modify NetWare DOS file attributes.
Typical usage:
```text
FLAG file [option...]
```
Examples:
```text
FLAG LOGIN.EXE
FLAG LOGIN.EXE A
FLAG LOGIN.EXE -A
FLAG LOGIN.EXE P T DI RI CI RA WA
FLAG LOGIN.EXE N
FLAG LOGIN.EXE ALL
FLAG LOGIN.EXE RO
FLAG LOGIN.EXE RW
```
Supported attributes and aliases include:
- `RO`
- `RW`
- `S`
- `A`
- `H`
- `SY`, `SYS`, `SYSTEM`
- `T`
- `P`
- `RA`
- `WA`
- `CI`
- `DI`
- `RI`
- `ALL`
- `N` / `NORMAL`
The output is intentionally close to Novell FLAG formatting:
```text
Ro/Rw S/- A/- - H/- Sy/-- T/- P/- Ra/-- Wa/-- CI/-- DI/-- RI/--
```
The Client32 path handles both low and high NetWare attribute bits. High bits such as `P`, `DI`, `RI`, `CI`, `RA`, and `WA` must be handled as 32-bit values in 16-bit DOS builds.
### `FLAGDIR`
Display or modify NetWare directory attributes.
Typical usage:
```text
FLAGDIR [path [option...]]
```
Supported 386-style options:
- `Normal`
- `System`
- `Hidden`
- `DeleteInhibit`
- `Purge`
- `RenameInhibit`
Examples:
```text
FLAGDIR UDIR
FLAGDIR UDIR SYSTEM
FLAGDIR UDIR HIDDEN
FLAGDIR UDIR DELETEINHIBIT
FLAGDIR UDIR PURGE
FLAGDIR UDIR RENAMEINHIBIT
FLAGDIR UDIR NORMAL
```
For simple mapped paths, the display is kept close to Novell FLAGDIR style:
```text
MARS/SYS:UDIR
UDIR System Hidden DeleteInhibit Purge RenameInhibit
```
`Private` is intentionally rejected for the current NetWare 386-style path.
### `RIGHTS`
Display effective NetWare rights for a file or directory.
Typical usage:
```text
RIGHTS [path]
```
Supported:
- directory paths
- file paths
- Novell-like display of the effective rights mask
Rights are shown in the traditional order:
```text
S R W C E M F A
Supervisor, Read, Write, Create, Erase, Modify, File scan, Access Control
```
### `GRANT`
Assign explicit trustee rights to a user or group.
Typical usage:
```text
GRANT rightslist* [FOR path] TO [USER | GROUP] name [options]
Options: /SubDirectories | /Files
```
Examples:
```text
GRANT R W C FOR UDIR TO USER MARIO
GRANT ALL FOR UDIR TO GROUP EVERYONE /SUBDIRECTORIES
GRANT R F FOR UDIR\*.TST TO USER MARIO /FILES
```
Supported 386-style rights:
- `ALL`
- `N` / `NONE`
- `S` / `SUPERVISOR`
- `R` / `READ`
- `W` / `WRITE`
- `C` / `CREATE`
- `E` / `ERASE`
- `M` / `MODIFY`
- `F` / `FILESCAN`
- `A` / `ACCESS CONTROL`
For Novell compatibility, `ALL` grants the normal trustee rights (`RWCEMFA`) and does not imply Supervisor; use `S` explicitly when Supervisor rights are intended.
### `REVOKE`
Remove selected rights from an explicit trustee assignment.
Typical usage:
```text
REVOKE rightslist* [FOR path] FROM [USER|GROUP] name [options]
Options: /SubDirectories | /Files
```
Examples:
```text
REVOKE W M FOR UDIR FROM USER MARIO
REVOKE R W FOR UDIR\*.TST FROM GROUP EVERYONE /FILES
REVOKE W C FOR UDIR FROM USER MARIO /SUBDIRECTORIES
```
`REVOKE` scans the explicit trustee assignment first, subtracts the requested rights, and deletes the trustee entry when no rights remain. Missing trustee entries are reported in Novell style:
```text
No trustee for the specified directory.
No trustee for the specified file.
```
### `REMOVE`
Delete an explicit trustee assignment for a user or group.
Typical usage:
```text
REMOVE [USER | GROUP] name [FROM path] [option]
Options: /Subdirs | /Files
```
Examples:
```text
REMOVE USER MARIO FROM UDIR
REMOVE GROUP EVERYONE FROM UDIR /SUBDIRS
REMOVE USER MARIO FROM UDIR\*.TST /FILES
```
If `USER` or `GROUP` is omitted, the tool tries to resolve the name as a user first and then as a group. Successful multi-object operations print Novell-style summaries such as:
```text
Trustee "MARIO" removed from 4 directories.
Trustee "MARIO" removed from 2 files.
```
### `NDIR`
List files and directories in a NetWare-style format.
Typical usage:
```text
NDIR [path] [/option...]
```
The implementation supports basic DOS namespace listings, wildcards,
paging, first rights and dates displays, and these options:
- `/FO` or `FO` for files only
- `/DO` or `DO` for directories only
- `/CONTINUOUS`, `/CONTINUE`, or `/C` for continuous output
- `/RIGHTS` for a first effective-rights display
- `/DATES` for Novell-style date columns with current DOS timestamp data
- `/SUB` or `/SUBDIRECTORIES` for recursive directory listings
- `/SHORT` or `/BRIEF` for compact output, useful with `/SUB`
- `/HELP` for Novell-style usage text
Examples:
```text
NDIR
NDIR *.EXE
NDIR PUBLIC\*.EXE
NDIR PUBLIC /DO
NDIR PUBLIC\*.EXE /FO /CONTINUOUS
NDIR PUBLIC /RIGHTS
NDIR PUBLIC /DATES
NDIR PUBLIC /SUB
NDIR PUBLIC /SUB /SHORT
NDIR PUBLIC /DO
```
The first version intentionally focuses on the common listing path. More
advanced Novell NDIR features such as sorting and restrictions are accepted
only as future compatibility points or will be implemented in later revisions. The `/RIGHTS` display uses NCP87 information for inherited rights and
Client32 effective-rights calls for effective rights. The `/DATES` display
uses NCP87 DOS info fields when available and falls back to DOS findfirst
timestamps otherwise.
### `DEBUG` ### `DEBUG`
Set mars_nwe debug levels for selected server-side modules. Set mars_nwe debug levels for selected server-side modules.
@@ -220,7 +561,7 @@ DEBUG NCPSERV|NWCONN|NWBIND level
``` ```
- `level` must be between `0` and `99`. - `level` must be between `0` and `99`.
- The original docs say this requires `FUNC_17_02_IS_DEBUG` to be enabled in `mars_nwe/config.h`. - This requires the matching mars_nwe server-side debug call to be enabled.
### `ECHO` ### `ECHO`
@@ -234,9 +575,19 @@ Change the current DOS directory. It also adjusts the active drive if a drive-qu
Internal developer test routines. Not intended as a regular end-user command. Internal developer test routines. Not intended as a regular end-user command.
The currently useful Client32 test is:
```text
TESTS NCP87C32ATTR
```
It verifies the working Client32 NCP87 attribute path.
## Login script workflow ## Login script workflow
A particularly important feature is the automatic execution of a file named `login` located beside the executable after a successful login. The historical README gives this example: A particularly important feature is the automatic execution of a file named `login` located beside the executable after a successful login.
Example:
```text ```text
map f:=SYS: map f:=SYS:
@@ -253,7 +604,7 @@ This makes the tool suite useful not just for authentication, but for setting up
### Historical DOS build ### Historical DOS build
The included `makefile.bcc` is the primary historical build file and targets **Borland C / Borland tools** on DOS. The included `makefile.bcc` is the primary historical build file and targets Borland C / Borland tools on DOS.
Key settings from the makefile: Key settings from the makefile:
@@ -264,29 +615,42 @@ Key settings from the makefile:
- define: `-Dmsdos` - define: `-Dmsdos`
- output: `net.exe` - output: `net.exe`
The object list includes: The historical object list includes the original C sources plus `kern.asm`.
- `net.c` ### CMake / Open Watcom maintainer build
- `tools.c`
- `netcall.c`
- `ncpcall.c`
- `login.c`
- `map.c`
- `slist.c`
- `nwcrypt.c`
- `nwdebug.c`
- `nwtests.c`
- `capture.c`
- `kern.asm`
The modern CMake build can rebuild `net.exe` with Open Watcom v2 on Linux.
### CMake status Configure with:
A `CMakeLists.txt` is present, but in this snapshot it is only a **partial modern build description**. It defines include paths, version-related macros, and install rules, while the actual `add_executable(...)` line is still commented out. That means it is better understood as packaging metadata than a ready-to-use complete build system. ```bash
cmake -S . -B build -DMARS_NWE_BUILD_DOSUTILS=ON
cmake --build build
```
The CMake build:
- assembles `ipx.asm` and `ncp.asm` with `wasm`
- compiles each C file to a binary-directory `.obj`
- links `net.exe` from those binary-directory objects
- keeps `.obj`/`.o` intermediate files out of the source directory
If old object files were produced in the source tree by an earlier build, remove them once:
```bash
cd dosutils
rm -f *.o *.obj
```
### Default install behavior
When `MARS_NWE_BUILD_DOSUTILS` is disabled, CMake installs a prebuilt `net.exe` from the source tree.
That keeps the normal mars_nwe build independent from Open Watcom. Maintainers can enable the Open Watcom build only when they want to regenerate the DOS binary.
## Installation layout ## Installation layout
The CMake install rules deploy the same binary multiple times into `SYS/public`: The install rules deploy the same binary multiple times into `SYS/public`, including:
- `net.exe` - `net.exe`
- `login.exe` - `login.exe`
@@ -300,19 +664,41 @@ The CMake install rules deploy the same binary multiple times into `SYS/public`:
- `mapdel.exe` - `mapdel.exe`
- `logout.exe` - `logout.exe`
- `slist.exe` - `slist.exe`
- `ndir.exe`
- `flag.exe`
- `flagdir.exe`
- `rights.exe`
- `grant.exe`
- `revoke.exe`
- `remove.exe`
- `capture.exe` - `capture.exe`
- `endcap.exe` - `endcap.exe`
They also install minimal `login.exe` and `map.exe` copies into `SYS/login`. They also install selected copies such as `login.exe`, `map.exe`, and `slist.exe` into `SYS/login` where appropriate.
## Development notes
- `ipx.asm`/`ipx.h` provide the split 16-bit Open Watcom IPX and far-memory assembly glue.
- `ncp.asm`/`ncp.h` provide the split 16-bit Open Watcom requester assembly entry points.
- `ncpcall.c` contains low-level NCP requester/transport helpers.
- `ncpapi.c`/`ncpapi.h` contain reusable `ncpXX_YY_*` protocol API wrappers for DOS tools.
- `trustee.c` and `trustee.h` contain shared Rights/Trustee code for `GRANT`, `REVOKE`, and `REMOVE`.
- `tools.c` contains shared command/frontend helpers so future smaller multicall binaries can reuse common parsing and path code.
- The verified Client32 path uses NCP 87 subfunction 6 for obtaining DOS information, subfunction 7 for modifying DOS information, subfunction 29 for effective rights, and trustee scan/add/delete calls for the trustee tools.
- For modify operations, use the modify information mask `DM_ATTRIBUTES` (`0x00000002`) rather than the read-side `RIM_ATTRIBUTES` mask.
- High NetWare attributes must be stored and displayed as 32-bit values even in 16-bit DOS builds.
## Project status and limitations ## Project status and limitations
This is legacy DOS networking code from the mid-1990s, and a few caveats are worth keeping in mind: This is legacy DOS networking code from the mid-1990s, and a few caveats are worth keeping in mind:
- The original README explicitly says the program was still incomplete. - The code is tightly coupled to DOS, IPX/NCP behavior, and mars_nwe/NetWare requester semantics.
- `SLIST` is not implemented in the provided source snapshot. - Client32 support has been validated for the FLAG-family and trustee/right tools, but not yet generalized to every command.
- Parts of the authentication and password-change path still rely on older unencrypted operations when the newer keyed flow is unavailable or disabled. - DOSX/VLM/NETX fallback testing is still pending.
- The code is tightly coupled to DOS, IPX/NCP behavior, and mars_nwe-specific expectations. - `FLAGDIR` currently focuses on the NetWare 386-style attributes and simple mapped directory paths.
- OS/2 requester behavior is still future work.
- Some authentication and password-change paths still keep older calls as compatibility fallbacks.
- `NCOPY` is still built so it stays compile-tested, but it is intentionally not registered in the `NET` multicall dispatcher while the NCP87/OpenCreate -> NCP74 server-side copy path remains under investigation.
## Historical metadata ## Historical metadata
@@ -325,7 +711,19 @@ From the included project metadata:
- platforms: `DOS`, `DOSEMU` - platforms: `DOS`, `DOSEMU`
- author/maintainer: Martin Stover - author/maintainer: Martin Stover
## License ## License
No standalone license file is included in the provided snapshot. The source files do contain copyright notices naming **Martin Stover**. Anyone planning to redistribute or modernize the project should verify licensing status before publishing derivative releases. The source tree includes a root-level `COPYING` file with the GPL-2 license text. Source files carry GPL-2-or-later headers and preserve the original Martin Stover attribution for the historical mars_nwe utility code, with current maintenance attribution where appropriate.
Debug/test helpers:
```
TESTS EFFRIGHT path
```
Prints the effective-rights values returned by several Client32/NCP paths for comparison with Novell RIGHTS.
`TESTS EFFRIGHT path` also prints exploratory old NCP22 effective-rights call variants for comparing with Novell RIGHTS.
`TESTS EFFRIGHT path` additionally tests NCP22 subfunction 50 object effective rights using the current login object id.

View File

@@ -1,8 +1,27 @@
/* capture.c 05-Apr-96 */ /*
* 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/>.
*/
/**************************************************************** /*
* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany * * Purpose: CAPTURE-compatible DOS utility entry point for printer capture handling.
****************************************************************/ * Depends on: net.h, net.c multicall dispatch, netcall.c requester helpers, tools.c shared utility routines.
*/
#include "net.h" #include "net.h"

580
creator.c Normal file
View File

@@ -0,0 +1,580 @@
/*
* mars-nwe-dosutils - NetWare/DOS utility tools.
*
* Copyright (C) 2026 Mario Fetka
*
* 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: CREATOR utility for showing and changing NetWare file creator/owner metadata.
* Depends on: net.h, ncpapi.h, netcall.c requester helpers, ncpapi.c namespace/NCP helpers, tools.c shared utility routines.
*/
/* creator.c - friendly creator/modifier/archiver metadata test tool
*
* Uses the same NCP 22/25 Set Directory/File Information path as Novell
* FILER for the special fileinfo/archive metadata fields. This is intended
* for testing mars_nwe xattr-backed metadata without using the FILER GUI.
*/
#include "net.h"
#include "ncpapi.h"
#define DM_CREATE_DATE 0x00000004UL
#define DM_CREATE_TIME 0x00000008UL
#define DM_CREATOR_ID 0x00000010UL
#define DM_ARCHIVE_DATE 0x00000020UL
#define DM_ARCHIVE_TIME 0x00000040UL
#define DM_ARCHIVER_ID 0x00000080UL
#define DM_MODIFY_DATE 0x00000100UL
#define DM_MODIFY_TIME 0x00000200UL
#define DM_MODIFIER_ID 0x00000400UL
#define BINDERY_USER 0x0001
#define BINDERY_GROUP 0x0002
#ifndef _A_RDONLY
#define _A_RDONLY 0x01
#endif
#ifndef _A_HIDDEN
#define _A_HIDDEN 0x02
#endif
#ifndef _A_SYSTEM
#define _A_SYSTEM 0x04
#endif
#ifndef _A_SUBDIR
#define _A_SUBDIR 0x10
#endif
#ifndef _A_ARCH
#define _A_ARCH 0x20
#endif
#define CREATOR_ATTR_RENAME_INHIBIT 0x00020000UL
#define CREATOR_ATTR_DELETE_INHIBIT 0x00040000UL
#define CREATOR_RIGHT_S 0x01
#define CREATOR_RIGHT_R 0x02
#define CREATOR_RIGHT_W 0x04
#define CREATOR_RIGHT_C 0x08
#define CREATOR_RIGHT_E 0x10
#define CREATOR_RIGHT_M 0x20
#define CREATOR_RIGHT_F 0x40
#define CREATOR_RIGHT_A 0x80
static void creator_usage(void)
{
fprintf(stdout, "Usage:\n");
fprintf(stdout, " CREATOR file /SHOW\n");
fprintf(stdout, " CREATOR file /CREATOR user-or-hexid\n");
fprintf(stdout, " CREATOR file /MODIFIER user-or-hexid\n");
fprintf(stdout, " CREATOR file /ARCHIVER user-or-hexid\n");
fprintf(stdout, " CREATOR file /CREATE user-or-hexid [yyyy-mm-dd [hh:mm:ss]]\n");
fprintf(stdout, " CREATOR file /MODIFY user-or-hexid [yyyy-mm-dd [hh:mm:ss]]\n");
fprintf(stdout, " CREATOR file /ARCHIVE user-or-hexid [yyyy-mm-dd [hh:mm:ss]]\n");
fprintf(stdout, " CREATOR file /ALL user-or-hexid [yyyy-mm-dd [hh:mm:ss]]\n");
fprintf(stdout, "\n");
fprintf(stdout, "Examples:\n");
fprintf(stdout, " CREATOR F:\\CIXTEST\\SUP\\S_SUP.TXT /SHOW\n");
fprintf(stdout, " CREATOR F:\\CIXTEST\\SUP\\S_SUP.TXT /CREATOR MARIO\n");
fprintf(stdout, " CREATOR F:\\CIXTEST\\SUP\\S_SUP.TXT /ARCHIVE MARIO\n");
}
static int hex_value(int c)
{
if (c >= '0' && c <= '9') return(c - '0');
if (c >= 'a' && c <= 'f') return(c - 'a' + 10);
if (c >= 'A' && c <= 'F') return(c - 'A' + 10);
return(-1);
}
static int parse_hex32(char *s, uint32 *out)
{
uint32 value = 0;
int i;
int v;
if (!s || !*s || !out)
return(-1);
if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) {
s += 2;
if (!*s) return(-1);
}
for (i = 0; s[i]; i++) {
v = hex_value(s[i]);
if (v < 0) return(-1);
value = (value << 4) | (uint32)v;
}
*out = value;
return(0);
}
static uint32 lookup_object_id(char *name)
{
uint32 id;
uint8 namebuf[48];
if (!name || !*name)
return(0);
if (!parse_hex32(name, &id))
return(id);
strmaxcpy(namebuf, name, sizeof(namebuf) - 1);
upstr(namebuf);
id = ncp17_35_get_bindery_object_id(namebuf, BINDERY_USER);
if (id)
return(id);
id = ncp17_35_get_bindery_object_id(namebuf, BINDERY_GROUP);
return(id);
}
static int parse_uint(char *s, int *out)
{
int v = 0;
int i;
if (!s || !*s || !out)
return(-1);
for (i = 0; s[i]; i++) {
if (s[i] < '0' || s[i] > '9') return(-1);
v = v * 10 + (s[i] - '0');
}
*out = v;
return(0);
}
static uint16 make_dos_date(int year, int month, int day)
{
if (year < 80)
year += 2000;
if (year < 1980)
year = 1980;
return((uint16)(((year - 1980) << 9) | (month << 5) | day));
}
static uint16 make_dos_time(int hour, int min, int sec)
{
return((uint16)((hour << 11) | (min << 5) | (sec / 2)));
}
static void current_dos_datetime(uint16 *date_out, uint16 *time_out)
{
REGS regs;
int year;
int month;
int day;
int hour;
int min;
int sec;
regs.h.ah = 0x2a;
int86(0x21, &regs, &regs);
year = regs.x.cx;
month = regs.h.dh;
day = regs.h.dl;
regs.h.ah = 0x2c;
int86(0x21, &regs, &regs);
hour = regs.h.ch;
min = regs.h.cl;
sec = regs.h.dh;
if (date_out) *date_out = make_dos_date(year, month, day);
if (time_out) *time_out = make_dos_time(hour, min, sec);
}
static int parse_date_arg(char *s, uint16 *date_out)
{
char buf[32];
char *p1;
char *p2;
int y;
int m;
int d;
uint32 hex;
if (!s || !date_out)
return(-1);
if (!parse_hex32(s, &hex) && (s[0] == '0' || strlen(s) <= 4)) {
*date_out = (uint16)hex;
return(0);
}
strmaxcpy(buf, s, sizeof(buf)-1);
p1 = strchr(buf, '-');
if (!p1) p1 = strchr(buf, '.');
if (!p1) return(-1);
*p1++ = '\0';
p2 = strchr(p1, '-');
if (!p2) p2 = strchr(p1, '.');
if (!p2) return(-1);
*p2++ = '\0';
if (parse_uint(buf, &y) || parse_uint(p1, &m) || parse_uint(p2, &d))
return(-1);
/* Support both yyyy-mm-dd and dd.mm.yy. */
if (y < 100 && d > 100) {
int tmp = y;
y = d;
d = tmp;
}
if (y < 100) y += 2000;
if (m < 1 || m > 12 || d < 1 || d > 31)
return(-1);
*date_out = make_dos_date(y, m, d);
return(0);
}
static int parse_time_arg(char *s, uint16 *time_out)
{
char buf[32];
char *p1;
char *p2;
int h;
int m;
int sec = 0;
uint32 hex;
if (!s || !time_out)
return(-1);
if (!parse_hex32(s, &hex) && (s[0] == '0' || strlen(s) <= 4)) {
*time_out = (uint16)hex;
return(0);
}
strmaxcpy(buf, s, sizeof(buf)-1);
p1 = strchr(buf, ':');
if (!p1) return(-1);
*p1++ = '\0';
p2 = strchr(p1, ':');
if (p2) *p2++ = '\0';
if (parse_uint(buf, &h) || parse_uint(p1, &m))
return(-1);
if (p2 && parse_uint(p2, &sec))
return(-1);
if (h < 0 || h > 23 || m < 0 || m > 59 || sec < 0 || sec > 59)
return(-1);
*time_out = make_dos_time(h, m, sec);
return(0);
}
static void print_dos_date(uint16 date)
{
int year = ((date >> 9) & 0x7f) + 1980;
int month = (date >> 5) & 0x0f;
int day = date & 0x1f;
fprintf(stdout, "%04d-%02d-%02d", year, month, day);
}
static void print_dos_time(uint16 time)
{
int hour = (time >> 11) & 0x1f;
int min = (time >> 5) & 0x3f;
int sec = (time & 0x1f) * 2;
fprintf(stdout, "%02d:%02d:%02d", hour, min, sec);
}
static int split_path(char *path, char *parent, int parent_size, char *name, int name_size)
{
char tmp[260];
char *p;
if (!path || !*path || !parent || !name)
return(-1);
strmaxcpy(tmp, path, sizeof(tmp)-1);
korrpath(tmp);
p = strrchr(tmp, '\\');
if (!p) p = strrchr(tmp, '/');
if (p) {
*p++ = '\0';
strmaxcpy(parent, tmp, parent_size-1);
strmaxcpy(name, p, name_size-1);
} else {
parent[0] = '\0';
strmaxcpy(name, tmp, name_size-1);
}
if (!name[0]) return(-1);
return(0);
}
static int set_info(uint8 dhandle, char *name, uint32 bits,
uint16 cdate, uint16 ctime, uint32 cid,
uint16 adate, uint16 atime, uint32 aid,
uint16 mdate, uint16 mtime, uint32 mid)
{
struct {
uint16 len;
uint8 func;
uint8 dirhandle;
uint8 search_attributes;
uint8 searchsequence[4];
uint8 change_bits[4];
uint8 subdir[4];
uint8 attributes[4];
uint8 uniqueid;
uint8 flags;
uint8 namespace;
uint8 namlen;
uint8 name[12];
uint8 created_time[2];
uint8 created_date[2];
uint8 created_id[4];
uint8 archived_time[2];
uint8 archived_date[2];
uint8 archived_id[4];
uint8 updated_time[2];
uint8 updated_date[2];
uint8 updated_id[4];
uint8 rest[80];
} req;
struct { uint16 len; } repl;
memset(&req, 0, sizeof(req));
memset(&repl, 0, sizeof(repl));
req.func = 0x25;
req.dirhandle = dhandle;
req.search_attributes = 0x06;
U32_TO_BE32(0xffffffffUL, req.searchsequence);
U32_TO_32(bits, req.change_bits);
U16_TO_16(ctime, req.created_time);
U16_TO_16(cdate, req.created_date);
U32_TO_BE32(cid, req.created_id);
U16_TO_16(atime, req.archived_time);
U16_TO_16(adate, req.archived_date);
U32_TO_BE32(aid, req.archived_id);
U16_TO_16(mtime, req.updated_time);
U16_TO_16(mdate, req.updated_date);
U32_TO_BE32(mid, req.updated_id);
if (tool_copy_ncp22_name(req.name, name, &req.namlen))
return(-1);
req.len = sizeof(req) - sizeof(req.len);
neterrno = Net_Call(0xE200, &req, &repl);
if (neterrno)
return(-neterrno);
return(0);
}
static void creator_attr_string(uint32 attr, char *out)
{
out[0] = '[';
out[1] = 'R';
out[2] = (attr & _A_RDONLY) ? 'o' : 'w';
out[3] = '-';
out[4] = (attr & _A_ARCH) ? 'A' : '-';
out[5] = '-';
out[6] = (attr & _A_HIDDEN) ? 'H' : '-';
if (attr & _A_SYSTEM) {
out[7] = 'S';
out[8] = 'y';
} else {
out[7] = '-';
out[8] = '-';
}
memset(out + 9, '-', 8);
out[17] = (attr & CREATOR_ATTR_DELETE_INHIBIT) ? 'D' : '-';
out[18] = (attr & CREATOR_ATTR_RENAME_INHIBIT) ? 'R' : '-';
out[19] = ']';
out[20] = '\0';
}
static void creator_rights_string(uint16 rights, char *out)
{
uint8 old = (uint8)rights;
out[0] = '[';
out[1] = (old & CREATOR_RIGHT_S) ? 'S' : '-';
out[2] = (old & CREATOR_RIGHT_R) ? 'R' : '-';
out[3] = (old & CREATOR_RIGHT_W) ? 'W' : '-';
out[4] = (old & CREATOR_RIGHT_C) ? 'C' : '-';
out[5] = (old & CREATOR_RIGHT_E) ? 'E' : '-';
out[6] = (old & CREATOR_RIGHT_M) ? 'M' : '-';
out[7] = (old & CREATOR_RIGHT_F) ? 'F' : '-';
out[8] = (old & CREATOR_RIGHT_A) ? 'A' : '-';
out[9] = ']';
out[10] = '\0';
}
static int show_info(char *name, uint8 dhandle)
{
NCP_NDIR_INFO info;
int rc;
char attr_text[24];
char rights_text[12];
memset(&info, 0, sizeof(info));
rc = ncp87_06_obtain_ndir_info(tool_is_current_path(name) ? "" : name,
(uint16)dhandle,
&info,
NULL, NULL, NULL);
if (rc) {
fprintf(stdout, "CREATOR: obtain info failed for %s, rc=%d\n", name, rc);
return(rc);
}
creator_attr_string(info.attributes, attr_text);
creator_rights_string(info.inherited_rights, rights_text);
fprintf(stdout, "File: %s\n", name);
fprintf(stdout, "Attributes: %s (0x%08lX)\n", attr_text, (unsigned long)info.attributes);
fprintf(stdout, "Create: "); print_dos_date(info.creation_date);
fprintf(stdout, " "); print_dos_time(info.creation_time);
fprintf(stdout, " creator=0x%08lX\n", (unsigned long)info.creator_id);
fprintf(stdout, "Modify: "); print_dos_date(info.modify_date);
fprintf(stdout, " "); print_dos_time(info.modify_time);
fprintf(stdout, " modifier=0x%08lX\n", (unsigned long)info.modifier_id);
fprintf(stdout, "Archive: "); print_dos_date(info.archive_date);
fprintf(stdout, " "); print_dos_time(info.archive_time);
fprintf(stdout, " archiver=0x%08lX\n", (unsigned long)info.archiver_id);
fprintf(stdout, "Access date: "); print_dos_date(info.last_access_date);
fprintf(stdout, "\nRights mask: %s (0x%04X)\n", rights_text, (unsigned)info.inherited_rights);
return(0);
}
int func_creator(int argc, char *argv[], int mode)
{
char oldcwd[260];
char parent[260];
char name[64];
char *path;
char *cmd;
char *id_arg;
uint8 dhandle = 0;
uint32 id = 0;
uint16 date;
uint16 time;
uint32 bits = 0;
int rc = 0;
int need_id = 0;
(void)mode;
if (argc < 3) {
creator_usage();
return(1);
}
path = argv[1];
cmd = argv[2];
upstr(cmd);
if (split_path(path, parent, sizeof(parent), name, sizeof(name))) {
fprintf(stdout, "CREATOR: bad path %s\n", path);
return(1);
}
if (!getcwd(oldcwd, sizeof(oldcwd)))
oldcwd[0] = '\0';
if (parent[0] && chdir(parent)) {
fprintf(stdout, "CREATOR: cannot change to parent %s\n", parent);
return(1);
}
if (tool_current_dhandle_only(&dhandle)) {
fprintf(stdout, "CREATOR: current drive is not a network drive\n");
if (oldcwd[0]) chdir(oldcwd);
return(1);
}
if (!strcmp(cmd, "/SHOW") || !strcmp(cmd, "SHOW")) {
rc = show_info(name, dhandle);
if (oldcwd[0]) chdir(oldcwd);
return(rc);
}
need_id = 1;
if (argc < 4) {
creator_usage();
if (oldcwd[0]) chdir(oldcwd);
return(1);
}
id_arg = argv[3];
id = lookup_object_id(id_arg);
if (!id) {
fprintf(stdout, "CREATOR: object not found: %s\n", id_arg);
if (oldcwd[0]) chdir(oldcwd);
return(1);
}
current_dos_datetime(&date, &time);
if (argc >= 5 && parse_date_arg(argv[4], &date)) {
fprintf(stdout, "CREATOR: bad date '%s'\n", argv[4]);
if (oldcwd[0]) chdir(oldcwd);
return(1);
}
if (argc >= 6 && parse_time_arg(argv[5], &time)) {
fprintf(stdout, "CREATOR: bad time '%s'\n", argv[5]);
if (oldcwd[0]) chdir(oldcwd);
return(1);
}
if (!strcmp(cmd, "/CREATOR") || !strcmp(cmd, "CREATOR")) {
bits = DM_CREATOR_ID;
rc = set_info(dhandle, name, bits, 0, 0, id, 0, 0, 0, 0, 0, 0);
} else if (!strcmp(cmd, "/MODIFIER") || !strcmp(cmd, "MODIFIER")) {
bits = DM_MODIFIER_ID;
rc = set_info(dhandle, name, bits, 0, 0, 0, 0, 0, 0, 0, 0, id);
} else if (!strcmp(cmd, "/ARCHIVER") || !strcmp(cmd, "ARCHIVER")) {
bits = DM_ARCHIVER_ID;
rc = set_info(dhandle, name, bits, 0, 0, 0, 0, 0, id, 0, 0, 0);
} else if (!strcmp(cmd, "/CREATE") || !strcmp(cmd, "CREATE")) {
bits = DM_CREATE_DATE | DM_CREATE_TIME | DM_CREATOR_ID;
rc = set_info(dhandle, name, bits, date, time, id, 0, 0, 0, 0, 0, 0);
} else if (!strcmp(cmd, "/MODIFY") || !strcmp(cmd, "MODIFY")) {
bits = DM_MODIFY_DATE | DM_MODIFY_TIME | DM_MODIFIER_ID;
rc = set_info(dhandle, name, bits, 0, 0, 0, 0, 0, 0, date, time, id);
} else if (!strcmp(cmd, "/ARCHIVE") || !strcmp(cmd, "ARCHIVE")) {
bits = DM_ARCHIVE_DATE | DM_ARCHIVE_TIME | DM_ARCHIVER_ID;
rc = set_info(dhandle, name, bits, 0, 0, 0, date, time, id, 0, 0, 0);
} else if (!strcmp(cmd, "/ALL") || !strcmp(cmd, "ALL")) {
bits = DM_CREATE_DATE | DM_CREATE_TIME | DM_CREATOR_ID |
DM_ARCHIVE_DATE | DM_ARCHIVE_TIME | DM_ARCHIVER_ID |
DM_MODIFY_DATE | DM_MODIFY_TIME | DM_MODIFIER_ID;
rc = set_info(dhandle, name, bits, date, time, id, date, time, id, date, time, id);
} else {
creator_usage();
if (oldcwd[0]) chdir(oldcwd);
return(1);
}
if (rc) {
fprintf(stdout, "CREATOR: NCP22/25 set info failed for %s, rc=%d neterrno=0x%02X\n",
path, rc, (unsigned)(rc < 0 ? -rc : 0));
} else {
fprintf(stdout, "CREATOR: set %s on %s to 0x%08lX OK\n",
cmd, path, (unsigned long)id);
if (bits & (DM_CREATE_DATE | DM_MODIFY_DATE | DM_ARCHIVE_DATE)) {
fprintf(stdout, "CREATOR: date/time "); print_dos_date(date);
fprintf(stdout, " "); print_dos_time(time); fprintf(stdout, "\n");
}
}
if (!rc)
show_info(name, dhandle);
if (oldcwd[0]) chdir(oldcwd);
return(rc ? rc : 0);
}

196
dlystrt.c Normal file
View File

@@ -0,0 +1,196 @@
/*
* mars-nwe-dosutils - NetWare/DOS utility tools.
*
* Copyright (C) 2026 Mario Fetka
*
* 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: Small DOS delayed-start helper used by the utility set.
* Depends on: DOS/Open Watcom runtime headers only; it is independent from the NetWare helper modules.
*/
/* 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

View File

@@ -1,3 +1,25 @@
;
; mars-nwe-dosutils - NetWare/DOS utility tools.
;
; 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: Historical TASM/IDEAL low-level DOS, IPX and NetWare requester glue.
; Depends on: historical Borland/TASM build context; modern Open Watcom builds use ipx.asm and ncp.asm instead.
;
;
; kern.asm: 20-Nov-93, 21:52 ; kern.asm: 20-Nov-93, 21:52
IDEAL IDEAL
P286 P286

690
flag.c Normal file
View File

@@ -0,0 +1,690 @@
/*
* mars-nwe-dosutils - NetWare/DOS utility tools.
*
* Copyright (C) 2026 Mario Fetka
*
* 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: FLAG utility for displaying and changing NetWare DOS file attributes.
* Depends on: net.h, ncpapi.h, netcall.c requester helpers, ncpapi.c namespace/NCP helpers, tools.c shared utility routines.
*/
/* flag.c - Novell FLAG-like DOS utility, stage 1 */
#include "net.h"
#include "ncpapi.h"
#include <dos.h>
/*
* FLAG v4b: NCP 87 namespace DOS info.
*
* ncpfs reference:
* ncp_ns_modify_entry_dos_info():
* subfunction 7, namespace DOS, search attrs SA_ALL,
* ModifyInformationMask, struct ncp_dos_info, handle/path.
*
* We use dirstyle=0 (short directory handle) against the current DOS
* directory handle and a one-component DOS filename.
*/
#define FLAG_NW_NS_DOS 0x00
#define FLAG_SA_ALL 0x0006
#define FLAG_RIM_ATTRIBUTES 0x00000004UL
#define FLAG_DM_ATTRIBUTES 0x00000002UL
#define NWFA_RO 0x00000001UL
#define NWFA_H 0x00000002UL
#define NWFA_SY 0x00000004UL
#define NWFA_A 0x00000020UL
#define NWFA_S 0x00000080UL
#define NWFA_T 0x00001000UL
#define NWFA_RA 0x00004000UL
#define NWFA_WA 0x00008000UL
#define NWFA_P 0x00010000UL
#define NWFA_RI 0x00020000UL
#define NWFA_DI 0x00040000UL
#define NWFA_CI 0x00080000UL
static int flag_add_handle_path(uint8 *p, uint8 dhandle, char *name)
{
int nlen;
nlen = strlen(name);
if (nlen > 255) nlen = 255;
/*
* handle/path:
* volume/handle byte
* dir base dword
* dirstyle byte (0 = short dir handle)
* path components: 1 component, length, bytes
*/
*p++ = dhandle;
tool_put_dword_lh(p, 0L); p += 4;
*p++ = 0; /* dirstyle = handle */
*p++ = 1; /* one path component */
*p++ = (uint8)nlen;
memcpy(p, name, nlen);
p += nlen;
return(1 + 4 + 1 + 1 + 1 + nlen);
}
static int flag_ncp87_obtain_attrs(char *name, uint32 *attrs)
{
struct {
uint16 len;
uint8 data[320];
} req;
struct {
uint16 len;
uint8 data[128];
} repl;
uint8 connid = 0;
uint8 dhandle = 0;
uint8 *p;
int hlen;
if (tool_current_dhandle(&connid, &dhandle))
return(-1);
/*
* Prefer the verified Client32 NCP87 path. If it is not available,
* fall back to the historical INT 21h/Net_Call path below.
*/
if (ncp87_06_obtain_rim_attributes(name, (uint16)dhandle,
attrs, NULL, NULL, NULL) == 0)
return(0);
memset(&req, 0, sizeof(req));
memset(&repl, 0, sizeof(repl));
p = req.data;
*p++ = 6; /* subfunction: obtain file/subdir info */
*p++ = FLAG_NW_NS_DOS; /* source namespace */
*p++ = FLAG_NW_NS_DOS; /* target namespace */
tool_put_word_lh(p, FLAG_SA_ALL); p += 2;
tool_put_dword_lh(p, FLAG_RIM_ATTRIBUTES); p += 4;
hlen = flag_add_handle_path(p, dhandle, name);
p += hlen;
req.len = (uint16)(p - req.data);
repl.len = sizeof(repl.data);
neterrno = Net_Call(0xF257, &req, &repl);
if (neterrno)
return(-1);
/*
* With RIM_ATTRIBUTES only, ncpfs expects NSI_Attributes first.
* First dword is the 32-bit Attributes field.
*/
if (attrs)
*attrs = tool_get_dword_lh(repl.data);
return(0);
}
static int flag_ncp22_1e_obtain_attrs(char *name, uint32 *attrs)
{
struct {
uint16 len;
uint8 func;
uint8 dirhandle;
uint8 search_attributes;
uint8 searchsequence[4];
uint8 namlen;
uint8 name[12];
} req;
struct {
uint16 len;
uint8 data[128];
} repl;
uint8 connid = 0;
uint8 dhandle = 0;
uint8 namlen = 0;
if (tool_current_dhandle(&connid, &dhandle))
return(-1);
memset(&req, 0, sizeof(req));
memset(&repl, 0, sizeof(repl));
if (tool_copy_ncp22_name(req.name, name, &namlen))
return(-1);
req.func = 0x1e; /* Scan directory */
req.dirhandle = dhandle;
req.search_attributes = 0x06; /* hidden/system */
U32_TO_BE32(0xffffffffUL, req.searchsequence);
req.namlen = namlen;
req.len = (uint16)(1 + 1 + 1 + 4 + 1 + namlen);
repl.len = sizeof(repl.data);
neterrno = Net_Call(0xE200, &req, &repl);
if (neterrno)
return(-1);
/*
* NCP22/30 Scan Directory returns:
* dword searchsequence
* dword subdir
* dword attributes
* ...
*/
if (attrs)
*attrs = tool_get_dword_lh(repl.data + 8);
return(0);
}
static int flag_ncp22_25_modify_attrs(char *name, uint32 attrs)
{
struct {
uint16 len;
uint8 func;
uint8 dirhandle;
uint8 search_attributes;
uint8 searchsequence[4];
uint8 change_bits[4];
uint8 subdir[4];
uint8 attributes[4];
uint8 uniqueid;
uint8 flags;
uint8 namespace;
uint8 namlen;
uint8 name[12];
uint8 rest[104];
} req;
struct {
uint16 len;
} repl;
uint8 connid = 0;
uint8 dhandle = 0;
if (tool_current_dhandle(&connid, &dhandle))
return(-1);
memset(&req, 0, sizeof(req));
memset(&repl, 0, sizeof(repl));
req.func = 0x25; /* Set directory/file information */
req.dirhandle = dhandle;
req.search_attributes = 0x06; /* hidden/system */
U32_TO_BE32(0xffffffffUL, req.searchsequence);
U32_TO_32(FLAG_DM_ATTRIBUTES, req.change_bits);
U32_TO_32(attrs, req.attributes);
if (tool_copy_ncp22_name(req.name, name, &req.namlen))
return(-1);
req.len = sizeof(req) - sizeof(req.len);
neterrno = Net_Call(0xE200, &req, &repl);
if (neterrno)
return(-1);
return(0);
}
static int flag_obtain_attrs(char *name, uint32 *attrs)
{
if (!flag_ncp22_1e_obtain_attrs(name, attrs))
return(0);
return(flag_ncp87_obtain_attrs(name, attrs));
}
static int flag_ncp87_modify_attrs(char *name, uint32 attrs)
{
struct {
uint16 len;
uint8 data[384];
} req;
struct {
uint16 len;
uint8 data[8];
} repl;
uint8 connid = 0;
uint8 dhandle = 0;
uint8 *p;
int hlen;
if (tool_current_dhandle(&connid, &dhandle))
return(-1);
/*
* Prefer verified Client32 modify path. The old INT 21h/F257 modify path
* can hang under DOS Client32 for high FLAG bits such as T/P/DI/RI.
*/
{
uint16 actual = 0;
uint16 hlo = 0;
uint16 hhi = 0;
if (!ncp87_07_modify_dos_attributes(name, (uint16)dhandle, attrs,
&actual, &hlo, &hhi))
return(0);
}
memset(&req, 0, sizeof(req));
memset(&repl, 0, sizeof(repl));
p = req.data;
*p++ = 7; /* subfunction: modify DOS info */
*p++ = FLAG_NW_NS_DOS;
*p++ = 0; /* reserved */
tool_put_word_lh(p, FLAG_SA_ALL); p += 2;
tool_put_dword_lh(p, FLAG_DM_ATTRIBUTES); p += 4; /* modify mask: DM_ATTRIBUTES */
tool_put_dword_lh(p, attrs); p += 4; /* Attributes */
/*
* Remaining ncp_dos_info fields. Mask says only Attributes is valid,
* so these should be ignored, but ncpfs still sends the full structure.
*/
memset(p, 0, 34);
p += 34;
hlen = flag_add_handle_path(p, dhandle, name);
p += hlen;
req.len = (uint16)(p - req.data);
repl.len = sizeof(repl.data);
neterrno = Net_Call(0xF257, &req, &repl);
if (neterrno)
return(-1);
return(0);
}
#ifndef _A_NORMAL
#define _A_NORMAL 0x00
#endif
#ifndef _A_RDONLY
#define _A_RDONLY 0x01
#endif
#ifndef _A_HIDDEN
#define _A_HIDDEN 0x02
#endif
#ifndef _A_SYSTEM
#define _A_SYSTEM 0x04
#endif
#ifndef _A_SUBDIR
#define _A_SUBDIR 0x10
#endif
#ifndef _A_ARCH
#define _A_ARCH 0x20
#endif
static void flag_help(void)
{
fprintf(stdout, "USAGE: FLAG [path [ option | [+|-] attribute(s) ] [SUB]]\n");
fprintf(stdout, "\n");
fprintf(stdout, "386 Attributes:\n");
fprintf(stdout, "--------------\n");
fprintf(stdout, "\n");
fprintf(stdout, "RO Read Only\n");
fprintf(stdout, "RW Read Write\n");
fprintf(stdout, "S Sharable\n");
fprintf(stdout, "H Hidden\n");
fprintf(stdout, "Sy System\n");
fprintf(stdout, "T Transactional\n");
fprintf(stdout, "P Purge\n");
fprintf(stdout, "A Archive Needed\n");
fprintf(stdout, "RA Read Audit\n");
fprintf(stdout, "WA Write Audit\n");
fprintf(stdout, "CI Copy Inhibit\n");
fprintf(stdout, "DI Delete Inhibit\n");
fprintf(stdout, "RI Rename Inhibit\n");
fprintf(stdout, "\n");
fprintf(stdout, "All All\n");
fprintf(stdout, "N Normal\n");
fprintf(stdout, "SUB\n");
}
static int flag_attr_mask(char *s, uint32 *setbits, uint32 *clearbits)
{
int set = 1;
char *p = s;
if (*p == '+') {
set = 1;
p++;
} else if (*p == '-') {
set = 0;
p++;
}
if (!*p) return(-1);
if (tool_strsame(p, "RO")) {
if (set) {
*setbits |= (NWFA_RO | NWFA_DI | NWFA_RI);
} else {
*clearbits |= (NWFA_RO | NWFA_DI | NWFA_RI);
}
} else if (tool_strsame(p, "RW")) {
*clearbits |= (NWFA_RO | NWFA_DI | NWFA_RI);
} else if (tool_strsame(p, "S")) {
if (set) *setbits |= NWFA_S;
else *clearbits |= NWFA_S;
} else if (tool_strsame(p, "H")) {
if (set) *setbits |= NWFA_H;
else *clearbits |= NWFA_H;
} else if (tool_strsame(p, "SY") || tool_strsame(p, "SYS") || tool_strsame(p, "SYSTEM")) {
if (set) *setbits |= NWFA_SY;
else *clearbits |= NWFA_SY;
} else if (tool_strsame(p, "T")) {
if (set) *setbits |= NWFA_T;
else *clearbits |= NWFA_T;
} else if (tool_strsame(p, "P")) {
if (set) *setbits |= NWFA_P;
else *clearbits |= NWFA_P;
} else if (tool_strsame(p, "A")) {
if (set) *setbits |= NWFA_A;
else *clearbits |= NWFA_A;
} else if (tool_strsame(p, "RA")) {
if (set) *setbits |= NWFA_RA;
else *clearbits |= NWFA_RA;
} else if (tool_strsame(p, "WA")) {
if (set) *setbits |= NWFA_WA;
else *clearbits |= NWFA_WA;
} else if (tool_strsame(p, "CI")) {
if (set) *setbits |= NWFA_CI;
else *clearbits |= NWFA_CI;
} else if (tool_strsame(p, "DI")) {
if (set) *setbits |= NWFA_DI;
else *clearbits |= NWFA_DI;
} else if (tool_strsame(p, "RI")) {
if (set) *setbits |= NWFA_RI;
else *clearbits |= NWFA_RI;
} else if (tool_strsame(p, "N") || tool_strsame(p, "NORMAL")) {
*clearbits |= (NWFA_RO | NWFA_H | NWFA_SY | NWFA_A |
NWFA_S | NWFA_T | NWFA_P |
NWFA_RA | NWFA_WA | NWFA_CI | NWFA_DI | NWFA_RI);
} else if (tool_strsame(p, "ALL")) {
*setbits |= (NWFA_RO | NWFA_H | NWFA_SY | NWFA_A |
NWFA_S | NWFA_T | NWFA_P |
NWFA_RA | NWFA_WA | NWFA_CI | NWFA_DI | NWFA_RI);
} else {
fprintf(stderr, "Unknown attribute encountered in command line.\n");
return(-1);
}
return(0);
}
static void flag_print_attrs(uint32 attr)
{
/*
* Novell order:
* Ro/Rw S A - H Sy T P Ra Wa CI DI RI
*/
fprintf(stdout, "[ ");
fprintf(stdout, "%s ", (attr & NWFA_RO) ? "Ro" : "Rw");
fprintf(stdout, "%c ", (attr & NWFA_S) ? 'S' : '-');
fprintf(stdout, "%c ", (attr & NWFA_A) ? 'A' : '-');
fprintf(stdout, "- ");
fprintf(stdout, "%c ", (attr & NWFA_H) ? 'H' : '-');
fprintf(stdout, "%s ", (attr & NWFA_SY) ? "Sy" : "--");
fprintf(stdout, "%c ", (attr & NWFA_T) ? 'T' : '-');
fprintf(stdout, "%c ", (attr & NWFA_P) ? 'P' : '-');
fprintf(stdout, "%s ", (attr & NWFA_RA) ? "Ra" : "--");
fprintf(stdout, "%s ", (attr & NWFA_WA) ? "Wa" : "--");
fprintf(stdout, "%s ", (attr & NWFA_CI) ? "CI" : "--");
fprintf(stdout, "%s ", (attr & NWFA_DI) ? "DI" : "--");
fprintf(stdout, "%s ", (attr & NWFA_RI) ? "RI" : "--");
fprintf(stdout, "]");
}
static void flag_display_one(char *name, uint32 attr)
{
fprintf(stdout, " %-23s ", name);
flag_print_attrs(attr);
fprintf(stdout, " \n");
}
static void flag_display_one_paged(char *name, uint32 attr,
int *line_count, int *continuous)
{
flag_display_one(name, attr);
tool_page_line(line_count, continuous);
}
static char *flag_last_sep(char *s)
{
char *last = NULL;
char *p;
for (p = s; *p; p++) {
if (*p == '\\' || *p == '/' || *p == ':')
last = p;
}
return(last);
}
static void flag_split_pattern(char *pattern, char *parent, int parent_size,
char *leaf, int leaf_size)
{
char temp[260];
char *sep;
int plen;
parent[0] = '\0';
leaf[0] = '\0';
strmaxcpy(temp, pattern, sizeof(temp) - 1);
sep = flag_last_sep(temp);
if (!sep) {
strmaxcpy(leaf, temp, leaf_size - 1);
return;
}
if (*(sep + 1)) {
strmaxcpy(leaf, sep + 1, leaf_size - 1);
} else {
strmaxcpy(leaf, "*.*", leaf_size - 1);
}
plen = (int)(sep - temp);
/*
* Keep drive-root paths as "F:\" rather than "F:".
*/
if (*sep == ':' && (*(sep + 1) == '\\' || *(sep + 1) == '/'))
plen += 2;
else if (*sep == ':' || *sep == '\\' || *sep == '/')
plen += 1;
if (plen >= parent_size)
plen = parent_size - 1;
memcpy(parent, temp, plen);
parent[plen] = '\0';
}
static int flag_enter_parent(char *pattern, char *leaf, int leaf_size,
char *oldcwd, int oldcwd_size)
{
char parent[260];
oldcwd[0] = '\0';
flag_split_pattern(pattern, parent, sizeof(parent), leaf, leaf_size);
if (!leaf[0])
strmaxcpy(leaf, "*.*", leaf_size - 1);
if (!parent[0])
return(0);
if (!getcwd(oldcwd, oldcwd_size))
oldcwd[0] = '\0';
if (chdir(parent)) {
if (oldcwd[0])
chdir(oldcwd);
return(-1);
}
return(0);
}
static void flag_leave_parent(char *oldcwd)
{
if (oldcwd[0])
chdir(oldcwd);
}
static int flag_list(char *pattern)
{
struct find_t ff;
unsigned findattr = _A_RDONLY | _A_HIDDEN | _A_SYSTEM | _A_ARCH;
int found = 0;
int line_count = 0;
int continuous = 0;
if (_dos_findfirst(pattern, findattr, &ff))
return(-1);
do {
if (!(ff.attrib & _A_SUBDIR)) {
uint32 nwattrs;
if (flag_obtain_attrs(ff.name, &nwattrs))
nwattrs = (uint32)ff.attrib;
flag_display_one_paged(ff.name, nwattrs, &line_count, &continuous);
found++;
}
} while (!_dos_findnext(&ff));
return(found);
}
static int flag_apply(char *pattern, uint32 setbits, uint32 clearbits)
{
struct find_t ff;
unsigned findattr = _A_RDONLY | _A_HIDDEN | _A_SYSTEM | _A_ARCH;
int shown = 0;
if (_dos_findfirst(pattern, findattr, &ff))
return(-1);
do {
uint32 attrs;
uint32 newattrs;
char fname[260];
if (ff.attrib & _A_SUBDIR) continue;
strmaxcpy(fname, ff.name, sizeof(fname) - 1);
if (flag_obtain_attrs(fname, &attrs))
attrs = (uint32)ff.attrib;
newattrs = (attrs | (uint32)setbits) & ~((uint32)clearbits);
if (newattrs != attrs) {
if (flag_ncp22_25_modify_attrs(fname, newattrs) &&
flag_ncp87_modify_attrs(fname, newattrs)) {
unsigned dosattr = (newattrs & (_A_RDONLY|_A_HIDDEN|_A_SYSTEM|_A_ARCH));
if (_dos_setfileattr(fname, dosattr)) {
fprintf(stdout, "You don't have rights to change : %s\n", fname);
continue;
}
}
}
if (flag_obtain_attrs(fname, &attrs))
attrs = newattrs;
flag_display_one(fname, newattrs);
shown++;
} while (!_dos_findnext(&ff));
return(shown);
}
int func_flag(int argc, char *argv[], int mode)
{
char *path = "*.*";
int i;
uint32 setbits = 0;
uint32 clearbits = 0;
int have_change = 0;
int rc;
(void)mode;
if (argc > 1 && (tool_strsame(argv[1], "/?") || tool_strsame(argv[1], "-?") ||
tool_strsame(argv[1], "?"))) {
flag_help();
return(0);
}
if (argc > 1) {
path = argv[1];
if (tool_strsame(path, "SUB")) path = "*.*";
}
for (i = 2; i < argc; i++) {
if (tool_strsame(argv[i], "SUB")) continue;
rc = flag_attr_mask(argv[i], &setbits, &clearbits);
if (rc < 0) return(1);
if (rc > 0) continue;
have_change = 1;
}
{
char leaf[260];
char oldcwd[260];
if (flag_enter_parent(path, leaf, sizeof(leaf), oldcwd, sizeof(oldcwd))) {
flag_split_pattern(path, oldcwd, sizeof(oldcwd), leaf, sizeof(leaf));
fprintf(stdout, "Files could not be found with pattern \"%s\"\a", leaf);
return(1);
}
if (have_change) {
rc = flag_apply(leaf, setbits, clearbits);
flag_leave_parent(oldcwd);
if (rc < 0) {
fprintf(stdout, "Files could not be found with pattern \"%s\"\a", leaf);
return(1);
}
return(0);
}
rc = flag_list(leaf);
flag_leave_parent(oldcwd);
if (rc < 0) {
fprintf(stdout, "Files could not be found with pattern \"%s\"\a", leaf);
return(1);
}
}
return(0);
}

584
flagdir.c Normal file
View File

@@ -0,0 +1,584 @@
/*
* mars-nwe-dosutils - NetWare/DOS utility tools.
*
* Copyright (C) 2026 Mario Fetka
*
* 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: FLAGDIR utility for displaying and changing NetWare directory attributes.
* Depends on: net.h, ncpapi.h, netcall.c requester helpers, ncpapi.c namespace/NCP helpers, tools.c shared utility routines.
*/
/* flagdir.c - Novell FLAGDIR-like DOS utility, Client32 version */
#include "net.h"
#include "ncpapi.h"
#include <dos.h>
#include <direct.h>
#define FD_NWFA_H 0x00000002UL
#define FD_NWFA_SY 0x00000004UL
#define FD_NWFA_P 0x00010000UL
#define FD_NWFA_RI 0x00020000UL
#define FD_NWFA_DI 0x00040000UL
#define FD_DIR_BITS (FD_NWFA_H | FD_NWFA_SY | FD_NWFA_P | FD_NWFA_RI | FD_NWFA_DI)
#define FD_DM_ATTRIBUTES 0x00000002UL
#ifndef _A_RDONLY
#define _A_RDONLY 0x01
#endif
#ifndef _A_HIDDEN
#define _A_HIDDEN 0x02
#endif
#ifndef _A_SYSTEM
#define _A_SYSTEM 0x04
#endif
#ifndef _A_SUBDIR
#define _A_SUBDIR 0x10
#endif
#ifndef _A_ARCH
#define _A_ARCH 0x20
#endif
static int fd_ncp22_1e_obtain_attrs(char *name, uint32 *attrs)
{
struct {
uint16 len;
uint8 func;
uint8 dirhandle;
uint8 search_attributes;
uint8 searchsequence[4];
uint8 namlen;
uint8 name[12];
} req;
struct {
uint16 len;
uint8 data[128];
} repl;
uint8 connid = 0;
uint8 dhandle = 0;
uint8 namlen = 0;
if (tool_current_dhandle(&connid, &dhandle))
return(-1);
memset(&req, 0, sizeof(req));
memset(&repl, 0, sizeof(repl));
if (tool_copy_ncp22_name(req.name, name, &namlen))
return(-1);
req.func = 0x1e; /* Scan directory */
req.dirhandle = dhandle;
req.search_attributes = 0x16; /* hidden/system/subdir */
U32_TO_BE32(0xffffffffUL, req.searchsequence);
req.namlen = namlen;
req.len = (uint16)(1 + 1 + 1 + 4 + 1 + namlen);
repl.len = sizeof(repl.data);
neterrno = Net_Call(0xE200, &req, &repl);
if (neterrno)
return(-1);
/* NCP22/30 Scan Directory returns attributes at offset 8. */
if (attrs)
*attrs = tool_get_dword_lh(repl.data + 8);
return(0);
}
static int fd_ncp22_25_modify_attrs(char *name, uint32 attrs)
{
struct {
uint16 len;
uint8 func;
uint8 dirhandle;
uint8 search_attributes;
uint8 searchsequence[4];
uint8 change_bits[4];
uint8 subdir[4];
uint8 attributes[4];
uint8 uniqueid;
uint8 flags;
uint8 namespace;
uint8 namlen;
uint8 name[12];
uint8 rest[104];
} req;
struct {
uint16 len;
} repl;
uint8 connid = 0;
uint8 dhandle = 0;
if (tool_current_dhandle(&connid, &dhandle))
return(-1);
memset(&req, 0, sizeof(req));
memset(&repl, 0, sizeof(repl));
req.func = 0x25; /* Set directory/file information */
req.dirhandle = dhandle;
req.search_attributes = 0x16; /* hidden/system/subdir */
U32_TO_BE32(0xffffffffUL, req.searchsequence);
U32_TO_32(FD_DM_ATTRIBUTES, req.change_bits);
tool_put_dword_lh(req.attributes, attrs);
if (tool_copy_ncp22_name(req.name, name, &req.namlen))
return(-1);
req.len = sizeof(req) - sizeof(req.len);
neterrno = Net_Call(0xE200, &req, &repl);
if (neterrno)
return(-1);
return(0);
}
static char *fd_last_sep(char *s)
{
char *last = NULL;
char *p;
for (p = s; *p; p++) {
if (*p == '\\' || *p == '/' || *p == ':')
last = p;
}
return(last);
}
static void fd_split_pattern(char *pattern, char *parent, int parent_size,
char *leaf, int leaf_size)
{
char temp[260];
char *sep;
int plen;
parent[0] = '\0';
leaf[0] = '\0';
strmaxcpy(temp, pattern, sizeof(temp) - 1);
sep = fd_last_sep(temp);
if (!sep) {
strmaxcpy(leaf, temp, leaf_size - 1);
return;
}
if (*(sep + 1))
strmaxcpy(leaf, sep + 1, leaf_size - 1);
else
strmaxcpy(leaf, "*.*", leaf_size - 1);
plen = (int)(sep - temp);
if (*sep == ':' && (*(sep + 1) == '\\' || *(sep + 1) == '/'))
plen += 2;
else if (*sep == ':' || *sep == '\\' || *sep == '/')
plen += 1;
if (plen >= parent_size)
plen = parent_size - 1;
memcpy(parent, temp, plen);
parent[plen] = '\0';
}
static int fd_enter_parent(char *pattern, char *leaf, int leaf_size,
char *oldcwd, int oldcwd_size)
{
char parent[260];
oldcwd[0] = '\0';
fd_split_pattern(pattern, parent, sizeof(parent), leaf, leaf_size);
if (!leaf[0])
strmaxcpy(leaf, "*.*", leaf_size - 1);
if (!parent[0])
return(0);
if (!getcwd(oldcwd, oldcwd_size))
oldcwd[0] = '\0';
if (chdir(parent)) {
if (oldcwd[0])
chdir(oldcwd);
return(-1);
}
return(0);
}
static void fd_leave_parent(char *oldcwd)
{
if (oldcwd[0])
chdir(oldcwd);
}
static int fd_current_display_path(uint8 dhandle, char *out, int max)
{
char path[260];
char *p;
if (!out || max < 2)
return(-1);
out[0] = '\0';
path[0] = '\0';
if (get_dir_path(dhandle, path) || !path[0])
return(-1);
p = strchr(path, ':');
if (p)
p++;
else
p = path;
if (!*p)
out[0] = '\0';
else
strmaxcpy(out, p, max - 1);
return(0);
}
static void fd_help(void)
{
fprintf(stdout, "386 Usage: Flagdir [path [option...]]\n");
fprintf(stdout, "Options: Normal\n");
fprintf(stdout, " System\n");
fprintf(stdout, " Hidden\n");
fprintf(stdout, " Deleteinhibit\n");
fprintf(stdout, " Purge\n");
fprintf(stdout, " Renameinhibit\n");
}
static int fd_attr_mask(char *s, uint32 *setbits, uint32 *clearbits)
{
if (tool_strsame(s, "N") || tool_strsame(s, "NORMAL")) {
*clearbits |= FD_DIR_BITS;
} else if (tool_strsame(s, "S") || tool_strsame(s, "SY") ||
tool_strsame(s, "SYS") || tool_strsame(s, "SYSTEM")) {
*setbits |= FD_NWFA_SY;
} else if (tool_strsame(s, "H") || tool_strsame(s, "HIDDEN")) {
*setbits |= FD_NWFA_H;
} else if (tool_strsame(s, "DI") || tool_strsame(s, "DELETEINHIBIT")) {
*setbits |= FD_NWFA_DI;
} else if (tool_strsame(s, "P") || tool_strsame(s, "PURGE")) {
*setbits |= FD_NWFA_P;
} else if (tool_strsame(s, "RI") || tool_strsame(s, "RENAMEINHIBIT")) {
*setbits |= FD_NWFA_RI;
} else if (tool_strsame(s, "PRIVATE") || tool_strsame(s, "PR")) {
fprintf(stderr, "Private is valid on NetWare 2.15 and above, except NetWare 386.\n");
return(-1);
} else {
fprintf(stderr, "Unknown attribute: %s.\n", s);
return(-1);
}
return(0);
}
static void fd_print_attrs(uint32 attrs)
{
int any = 0;
if (!(attrs & FD_DIR_BITS)) {
fprintf(stdout, "Normal \n");
return;
}
if (attrs & FD_NWFA_SY) {
fprintf(stdout, "System");
any = 1;
}
if (attrs & FD_NWFA_H) {
fprintf(stdout, "%sHidden", any ? " " : "");
any = 1;
}
if (attrs & FD_NWFA_DI) {
fprintf(stdout, "%sDeleteInhibit", any ? " " : "");
any = 1;
}
if (attrs & FD_NWFA_P) {
fprintf(stdout, "%sPurge", any ? " " : "");
any = 1;
}
if (attrs & FD_NWFA_RI) {
fprintf(stdout, "%sRenameInhibit", any ? " " : "");
any = 1;
}
fprintf(stdout, " \n");
}
static void fd_display_header(char *path)
{
char up[260];
char prefix[260];
char header[300];
int len;
char *p;
if (tool_current_prefix(prefix, sizeof(prefix)))
prefix[0] = '\0';
tool_upcopy(up, path, sizeof(up));
/* fd_process_one() enters the parent directory before displaying the
* entry. Use the current NetWare prefix plus the leaf/relative name,
* not the original F:\... argument, otherwise the drive-qualified path is
* appended to the already changed current directory.
*/
strmaxcpy(header, prefix, sizeof(header) - 1);
if (!tool_is_current_path(up) && up[0]) {
len = strlen(header);
if (len > 0 && header[len - 1] != ':' &&
header[len - 1] != '\\' && header[len - 1] != '/') {
if (len < (int)sizeof(header) - 1) {
header[len++] = '\\';
header[len] = '\0';
}
}
if ((int)(strlen(header) + strlen(up)) < (int)sizeof(header) - 1)
strcat(header, up);
}
/* Novell FLAGDIR displays SERVER/SYS: and uses / as path separator in
* the header line.
*/
for (p = header; *p; p++) {
if (*p == '\\')
*p = '/';
}
fprintf(stdout, "%s \n", header);
}
static void fd_display_row(char *name, uint32 attrs)
{
char base[260];
tool_basename(base, name, sizeof(base));
fprintf(stdout, " %-12.12s ", base);
fd_print_attrs(attrs);
}
static void fd_display(char *path, uint32 attrs)
{
fd_display_header(path);
fd_display_row(path, attrs);
}
static int fd_is_directory(char *path)
{
struct find_t ff;
unsigned attr = _A_RDONLY | _A_HIDDEN | _A_SYSTEM | _A_SUBDIR | _A_ARCH;
if (tool_is_current_path(path))
return(1);
if (_dos_findfirst(path, attr, &ff))
return(0);
return((ff.attrib & _A_SUBDIR) != 0);
}
static int fd_obtain(char *path, uint8 dhandle, uint32 *attrs)
{
if (!fd_ncp22_1e_obtain_attrs(path, attrs))
return(0);
if (ncp87_06_obtain_rim_attributes(path, (uint16)dhandle,
attrs, NULL, NULL, NULL) == 0)
return(0);
return(-1);
}
static int fd_modify(char *path, uint8 dhandle, uint32 attrs)
{
if (!fd_ncp22_25_modify_attrs(path, attrs))
return(0);
if (ncp87_07_modify_dos_attributes(path, (uint16)dhandle, attrs,
NULL, NULL, NULL) == 0)
return(0);
return(-1);
}
static int fd_process_one(char *path, char *display_path, uint8 dhandle,
uint32 setbits, uint32 clearbits,
int have_change, int show_header)
{
char leaf[260];
char oldcwd[260];
char *ncp_path;
char *check_path;
uint32 attrs;
uint32 newattrs;
int rc = 0;
oldcwd[0] = '\0';
leaf[0] = '\0';
if (!tool_is_current_path(path)) {
if (fd_enter_parent(path, leaf, sizeof(leaf), oldcwd, sizeof(oldcwd))) {
fprintf(stderr, "Directory %s not found.\n", path);
return(1);
}
check_path = leaf;
ncp_path = leaf;
} else {
check_path = path;
ncp_path = "";
}
if (!fd_is_directory(check_path)) {
fd_display_header(ncp_path[0] ? ncp_path : path);
fprintf(stdout, "Directory %s not found.", ncp_path[0] ? ncp_path : path);
fd_leave_parent(oldcwd);
return(1);
}
if (fd_obtain(ncp_path, dhandle, &attrs)) {
if (tool_is_current_path(path) && display_path && !display_path[0] &&
!have_change) {
attrs = 0;
} else {
fprintf(stderr, "Unable to get directory attributes.\n");
fd_leave_parent(oldcwd);
return(1);
}
}
if (have_change) {
newattrs = (attrs | setbits) & ~clearbits;
if (newattrs != attrs) {
if (fd_modify(ncp_path, dhandle, newattrs)) {
fprintf(stderr, "Unable to change attributes.\n");
fd_leave_parent(oldcwd);
return(1);
}
attrs = newattrs;
fd_obtain(ncp_path, dhandle, &attrs);
}
}
if (show_header)
fd_display(ncp_path[0] ? ncp_path : display_path, attrs);
else
fd_display_row(ncp_path[0] ? ncp_path : display_path, attrs);
fd_leave_parent(oldcwd);
return(rc);
}
static int fd_process_wild(char *spec, uint8 dhandle,
uint32 setbits, uint32 clearbits,
int have_change)
{
struct find_t ff;
char dir[260];
char pat[260];
char search[260];
char full[260];
int found = 0;
int rc = 0;
int lines = 0;
int continuous = 0;
unsigned attr = _A_RDONLY | _A_HIDDEN | _A_SYSTEM | _A_SUBDIR | _A_ARCH;
tool_parent_pattern(dir, pat, spec, sizeof(dir), sizeof(pat));
tool_join_path(search, dir, pat, sizeof(search));
if (_dos_findfirst(search, attr, &ff) != 0) {
fprintf(stderr, "Directory %s not found.\n", spec);
return(1);
}
fd_display_header(spec);
do {
if ((ff.attrib & _A_SUBDIR) && strcmp(ff.name, ".") &&
strcmp(ff.name, "..")) {
tool_join_path(full, dir, ff.name, sizeof(full));
if (fd_process_one(full, ff.name, dhandle, setbits, clearbits,
have_change, 0))
rc = 1;
found++;
tool_page_line(&lines, &continuous);
}
} while (_dos_findnext(&ff) == 0);
if (!found) {
fprintf(stderr, "Directory %s not found.\n", spec);
return(1);
}
return(rc);
}
int func_flagdir(int argc, char *argv[], int mode)
{
char *path = ".";
char display_path[260];
uint8 connid = 0;
uint8 dhandle = 0;
uint32 setbits = 0;
uint32 clearbits = 0;
int have_change = 0;
int i;
(void)mode;
if (argc > 1 && (tool_strsame(argv[1], "/?") || tool_strsame(argv[1], "-?") ||
tool_strsame(argv[1], "?"))) {
fd_help();
return(0);
}
if (argc > 1)
path = argv[1];
if (tool_current_dhandle(&connid, &dhandle)) {
fprintf(stderr, "FlagDir only works on network directories.\n");
return(1);
}
for (i = 2; i < argc; i++) {
if (fd_attr_mask(argv[i], &setbits, &clearbits))
return(1);
have_change = 1;
}
if (tool_has_wildcards(path))
return(fd_process_wild(path, dhandle, setbits, clearbits, have_change));
if (tool_is_current_path(path)) {
if (fd_current_display_path(dhandle, display_path, sizeof(display_path)))
strcpy(display_path, ".");
} else {
strmaxcpy(display_path, path, sizeof(display_path) - 1);
}
return(fd_process_one(path, display_path, dhandle,
setbits, clearbits, have_change, 1));
}

447
grant.c Normal file
View File

@@ -0,0 +1,447 @@
/*
* mars-nwe-dosutils - NetWare/DOS utility tools.
*
* Copyright (C) 2026 Mario Fetka
*
* 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: GRANT utility for assigning trustee rights on NetWare directories and files.
* Depends on: net.h, ncpapi.h, netcall.c requester helpers, ncpapi.c namespace/NCP helpers, tools.c shared utility routines.
*/
/* grant.c - Novell GRANT-like DOS utility, first Client32 implementation */
#include "net.h"
#include "ncpapi.h"
#include "trustee.h"
#define GRANT_BINDERY_USER 0x0001
#define GRANT_BINDERY_GROUP 0x0002
#define NCP_RIGHT_READ 0x0001
#define NCP_RIGHT_WRITE 0x0002
#define NCP_RIGHT_OPEN 0x0004
#define NCP_RIGHT_CREATE 0x0008
#define NCP_RIGHT_DELETE 0x0010
#define NCP_RIGHT_OWNER 0x0020
#define NCP_RIGHT_SEARCH 0x0040
#define NCP_RIGHT_MODIFY 0x0080
#define NCP_RIGHT_SUPER 0x0100
/* Novell GRANT ALL assigns all normal trustee rights, not Supervisor. */
#define NCP_RIGHT_ALL_386 (NCP_RIGHT_READ | NCP_RIGHT_WRITE | \
NCP_RIGHT_CREATE | NCP_RIGHT_DELETE | \
NCP_RIGHT_MODIFY | NCP_RIGHT_SEARCH | \
NCP_RIGHT_OWNER)
static void grant_usage_error(void)
{
fprintf(stdout, "Command line arguments violate grammar defined for GRANT.\n\n");
}
static void grant_invalid_right_error(void)
{
fprintf(stdout, "Specified rights unreadable or invalid. Spaces required between each right.\n\n");
}
static void grant_usage_ex(int leading_blanks, int bell_after_options,
int trailing_blanks)
{
int i;
for (i = 0; i < leading_blanks; i++)
fprintf(stdout, "\n");
fprintf(stdout, "Usage: GRANT rightslist* [FOR path] TO [USER | GROUP] name [options]\n");
fprintf(stdout, "Options: /SubDirectories | /Files\n");
if (bell_after_options)
fprintf(stdout, "\a");
fprintf(stdout, "\n");
fprintf(stdout, "386 Rights:\n");
fprintf(stdout, "--------------------\n");
fprintf(stdout, "ALL = All\n");
fprintf(stdout, "N = No Rights\n");
fprintf(stdout, "S = Supervisor\n");
fprintf(stdout, "R = Read\n");
fprintf(stdout, "W = Write\n");
fprintf(stdout, "C = Create\n");
fprintf(stdout, "E = Erase\n");
fprintf(stdout, "M = Modify\n");
fprintf(stdout, "F = File Scan\n");
fprintf(stdout, "A = Access Control\n");
for (i = 0; i < trailing_blanks; i++)
fprintf(stdout, "\n");
}
static void grant_usage(void)
{
grant_usage_ex(0, 0, 0);
}
static void grant_usage_help(void)
{
grant_usage_ex(2, 0, 1);
}
static void grant_usage_after_error(void)
{
grant_usage_ex(0, 1, 2);
}
static void grant_rights_bracket(uint16 rights, char *out)
{
/* Novell displays Supervisor as the full effective right mask. */
if (rights & NCP_RIGHT_SUPER)
rights |= NCP_RIGHT_ALL_386;
out[0] = (rights & NCP_RIGHT_SUPER) ? 'S' : ' ';
out[1] = (rights & NCP_RIGHT_READ) ? 'R' : ' ';
out[2] = (rights & NCP_RIGHT_WRITE) ? 'W' : ' ';
out[3] = (rights & NCP_RIGHT_CREATE) ? 'C' : ' ';
out[4] = (rights & NCP_RIGHT_DELETE) ? 'E' : ' ';
out[5] = (rights & NCP_RIGHT_MODIFY) ? 'M' : ' ';
out[6] = (rights & NCP_RIGHT_SEARCH) ? 'F' : ' ';
out[7] = (rights & NCP_RIGHT_OWNER) ? 'A' : ' ';
out[8] = '\0';
}
static uint16 grant_expand_supervisor_rights(uint16 rights)
{
/* Novell GRANT expands Supervisor to the full trustee mask before
* storing it. This keeps the wire value and the printed result in
* sync with Novell: GRANT S reports and sends [SRWCEMFA], not just
* [S ]. */
if (rights & NCP_RIGHT_SUPER)
rights |= NCP_RIGHT_ALL_386;
return(rights);
}
static void grant_rights_string(uint16 rights, char *out)
{
char *p = out;
if (rights == 0) {
strcpy(out, "N");
return;
}
if ((rights & NCP_RIGHT_ALL_386) == NCP_RIGHT_ALL_386) {
strcpy(out, "ALL");
return;
}
if (rights & NCP_RIGHT_SUPER) *p++ = 'S';
if (rights & NCP_RIGHT_READ) *p++ = 'R';
if (rights & NCP_RIGHT_WRITE) *p++ = 'W';
if (rights & NCP_RIGHT_CREATE) *p++ = 'C';
if (rights & NCP_RIGHT_DELETE) *p++ = 'E';
if (rights & NCP_RIGHT_MODIFY) *p++ = 'M';
if (rights & NCP_RIGHT_SEARCH) *p++ = 'F';
if (rights & NCP_RIGHT_OWNER) *p++ = 'A';
*p = '\0';
}
static int grant_add_right_word(char *s, uint16 *rights)
{
if (tool_strsame(s, "ALL")) {
*rights = NCP_RIGHT_ALL_386;
return(0);
}
if (tool_strsame(s, "N") || tool_strsame(s, "NONE")) {
*rights = 0;
return(0);
}
if (tool_strsame(s, "S") || tool_strsame(s, "SUPERVISOR")) {
*rights |= NCP_RIGHT_SUPER;
return(0);
}
if (tool_strsame(s, "R") || tool_strsame(s, "READ")) {
*rights |= NCP_RIGHT_READ;
return(0);
}
if (tool_strsame(s, "W") || tool_strsame(s, "WRITE")) {
*rights |= NCP_RIGHT_WRITE;
return(0);
}
if (tool_strsame(s, "C") || tool_strsame(s, "CREATE")) {
*rights |= NCP_RIGHT_CREATE;
return(0);
}
if (tool_strsame(s, "E") || tool_strsame(s, "ERASE")) {
*rights |= NCP_RIGHT_DELETE;
return(0);
}
if (tool_strsame(s, "M") || tool_strsame(s, "MODIFY")) {
*rights |= NCP_RIGHT_MODIFY;
return(0);
}
if (tool_strsame(s, "F") || tool_strsame(s, "FILESCAN") ||
tool_strsame(s, "FILE") || tool_strsame(s, "SCAN")) {
*rights |= NCP_RIGHT_SEARCH;
return(0);
}
if (tool_strsame(s, "A") || tool_strsame(s, "ACCESS") ||
tool_strsame(s, "CONTROL") || tool_strsame(s, "ACCESSCONTROL")) {
*rights |= NCP_RIGHT_OWNER;
return(0);
}
return(-1);
}
static int grant_last_rc = 0;
static int grant_set_one(char *path, uint16 dhandle,
uint32 object_id, uint16 rights)
{
int rc;
/* Novell GRANT uses the old NCP22/27 SetTrustee path. Prefer that
* path and keep the NCP87 add-trustee call only as a compatibility
* fallback for clients/servers that do not accept the old call. */
rc = ncp22_27_set_trustee_rights(path, dhandle, object_id, rights);
if (rc) {
rc = ncp87_0a_add_trustee_rights(path,
dhandle,
object_id,
rights,
0xffff,
NULL, NULL, NULL);
}
grant_last_rc = rc;
return(rc);
}
/*
* Apply the grant to PATH and every directory below it.
*
* This intentionally walks through the DOS redirector, not through another
* NCP search helper, so it works with the same mapped-drive view that the
* user passed to GRANT.
*/
static int grant_set_subdirs(char *path, uint16 dhandle,
uint32 object_id, uint16 rights)
{
struct find_t ff;
char pattern[260];
char child[260];
int rc = 0;
if (grant_set_one(path, dhandle, object_id, rights))
rc = 1;
tool_join_path(pattern, path, "*.*", sizeof(pattern));
if (_dos_findfirst(pattern, _A_SUBDIR, &ff) == 0) {
do {
if ((ff.attrib & _A_SUBDIR) && !tool_is_dot_dir(ff.name)) {
tool_join_path(child, path, ff.name, sizeof(child));
if (grant_set_subdirs(child, dhandle, object_id, rights))
rc = 1;
}
} while (_dos_findnext(&ff) == 0);
}
return(rc);
}
int func_grant(int argc, char *argv[], int mode)
{
uint16 rights = 0;
char *path = ".";
char *objname = NULL;
uint16 objtype = GRANT_BINDERY_USER;
uint8 connid = 0;
uint8 dhandle = 0;
uint8 namebuf[48];
uint32 object_id;
int recurse_subdirs = 0;
int i = 1;
int have_rights = 0;
int rc;
(void)mode;
if (argc < 2 || tool_is_help_arg(argv[1])) {
if (argc < 2) {
fprintf(stdout, "\n");
grant_usage_error();
grant_usage_after_error();
return(1);
}
grant_usage_help();
return(0);
}
/*
* GRANT rightslist* [FOR path] TO [USER|GROUP] name [options]
*/
while (i < argc) {
if (tool_strsame(argv[i], "FOR") || tool_strsame(argv[i], "TO"))
break;
if (tool_is_option(argv[i]))
break;
if (grant_add_right_word(argv[i], &rights)) {
fprintf(stdout, "\n");
grant_invalid_right_error();
grant_usage_after_error();
return(1);
}
have_rights = 1;
i++;
}
if (!have_rights || i >= argc) {
fprintf(stdout, "\n");
grant_usage_error();
grant_usage_after_error();
return(1);
}
if (tool_strsame(argv[i], "FOR")) {
i++;
if (i >= argc) {
fprintf(stdout, "\n");
grant_usage_error();
grant_usage_after_error();
return(1);
}
path = argv[i++];
}
if (i >= argc || !tool_strsame(argv[i], "TO")) {
fprintf(stdout, "\n");
grant_usage_error();
grant_usage_after_error();
return(1);
}
i++;
if (i < argc && tool_strsame(argv[i], "USER")) {
objtype = GRANT_BINDERY_USER;
i++;
} else if (i < argc && tool_strsame(argv[i], "GROUP")) {
objtype = GRANT_BINDERY_GROUP;
i++;
}
if (i >= argc) {
fprintf(stdout, "\n");
grant_usage_error();
grant_usage_after_error();
return(1);
}
objname = argv[i++];
while (i < argc) {
if (!tool_is_option(argv[i])) {
fprintf(stdout, "\n");
grant_usage_error();
grant_usage_after_error();
return(1);
}
/*
* /FILES is harmless because the explicit path is passed to the
* NCP87 trustee-add call. /SUBDIRECTORIES recursively applies the
* same grant to all subdirectories below the given path.
*/
if (tool_strsame(argv[i], "/FILES") || tool_strsame(argv[i], "-FILES") ||
tool_strsame(argv[i], "/F") || tool_strsame(argv[i], "-F")) {
i++;
continue;
}
if (tool_strsame(argv[i], "/SUBDIRECTORIES") ||
tool_strsame(argv[i], "-SUBDIRECTORIES") ||
tool_strsame(argv[i], "/S") || tool_strsame(argv[i], "-S")) {
recurse_subdirs = 1;
i++;
continue;
}
fprintf(stdout, "\n");
grant_usage_error();
grant_usage_after_error();
return(1);
}
rights = grant_expand_supervisor_rights(rights);
if (tool_current_dhandle(&connid, &dhandle)) {
fprintf(stdout, "Specified path not locatable.\n");
return(1);
}
strmaxcpy(namebuf, objname, sizeof(namebuf) - 1);
upstr(namebuf);
object_id = ncp17_35_get_bindery_object_id(namebuf, objtype);
if (!object_id) {
char header[300];
trustee_header_path(header, path, sizeof(header));
fprintf(stdout, "\n%s\n", header);
if (objtype == GRANT_BINDERY_GROUP)
fprintf(stdout, "\aGroup \"%s\" not found.\n", objname);
else
fprintf(stdout, "\aUser \"%s\" not found.\n", objname);
return(1);
}
if (recurse_subdirs)
rc = grant_set_subdirs(path, (uint16)dhandle, object_id, rights);
else
rc = grant_set_one(path, (uint16)dhandle, object_id, rights);
if (rc) {
char header[300];
trustee_header_path(header, path, sizeof(header));
fprintf(stdout, "\n%s\n", header);
fprintf(stdout, "Invalid path or no match for pattern specified.\n\n");
return(grant_last_rc ? grant_last_rc : 1);
}
{
char header[300];
char base[80];
char bracket[10];
trustee_header_path(header, path, sizeof(header));
tool_basename(base, path, sizeof(base));
grant_rights_bracket(rights, bracket);
fprintf(stdout, "\n%s\n", header);
fprintf(stdout, "%-33.33sRights set to [%s]\n\n", base, bracket);
}
return(0);
}

View File

@@ -1,10 +1,35 @@
; kern_wasm.asm
; ;
; Open Watcom WASM/MASM-syntax port of the old TASM IDEAL kern.asm. ; mars-nwe-dosutils - NetWare/DOS utility tools.
;
; 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: Open Watcom WASM/MASM-syntax IPX and far-memory helper glue.
; Depends on: ipx.h declarations, netcall.c callers and net.h shared types.
;
; ipx.asm
;
; Open Watcom WASM/MASM-syntax port of the IPX and xmemmove parts of
; the old TASM IDEAL kern.asm.
; Intended for 16-bit DOS large memory model builds on Linux with Open Watcom v2. ; Intended for 16-bit DOS large memory model builds on Linux with Open Watcom v2.
; ;
; Keep kern.asm as the historical TASM source and use this file for the ; Keep doc/kern.asm as the historical TASM source and use this split file for
; reproducible Open Watcom build. ; the reproducible Open Watcom build.
.286 .286
.model large .model large
@@ -19,8 +44,6 @@ public _IPXopen_socket
public _IPXclose_socket public _IPXclose_socket
public _IPXlisten public _IPXlisten
public _xmemmove public _xmemmove
public _Net_Call
_IPXinit proc far _IPXinit proc far
push bp push bp
mov bp, sp mov bp, sp
@@ -183,34 +206,4 @@ _IPXlisten proc far
ret ret
_IPXlisten endp _IPXlisten endp
_Net_Call proc far
push bp
mov bp, sp
; int Net_Call(UI func, void *req, void *repl)
; [bp+6] func
; [bp+8] req offset
; [bp+10] req segment
; [bp+12] repl offset
; [bp+14] repl segment
mov ax, [bp+6]
push ds
push si
push di
pushf
lds si, dword ptr [bp+8]
les di, dword ptr [bp+12]
int 21h
popf
pop di
pop si
pop ds
pop bp
mov ah, 0
ret
_Net_Call endp
end end

73
ipx.h Normal file
View File

@@ -0,0 +1,73 @@
/*
* 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: C declarations for IPX packet structures and low-level IPX/far-memory assembly glue.
* Depends on: ipx.asm for Open Watcom builds, doc/kern.asm for the historical TASM source, and net.h for shared types.
*/
#ifndef IPX_H
#define IPX_H
#if defined(__WATCOMC__)
#define IPX_CALL _Cdecl
#else
#define IPX_CALL
#endif
typedef struct {
uint8 checksum[2];
uint16 packetlen;
uint8 tcontrol;
uint8 ptype;
uint8 dest_net[4];
uint8 dest_node[6];
uint16 dest_sock; /* HI LOW */
uint8 source_net[4];
uint8 source_node[6];
uint16 source_sock; /* HI LOW */
} IPX_HEADER;
typedef struct {
uint8 *link_address;
FUNC_VOID esr_routine;
uint8 in_use_flag;
uint8 completition_code;
uint16 socket; /* HI LOW */
uint8 ipx_workspace[4]; /* interner Gebrauch */
uint8 drv_workspace[4]; /* interner Gebrauch */
uint8 immediate_address[6]; /* HI LOW Node Address */
uint16 fragment_count; /* Anzahl Fragment Buffers */
uint8 *fragment_1;
uint16 fragment_1_size;
/* Können auch mehr sein */
} ECB;
extern int IPX_CALL IPXinit(void);
extern int IPX_CALL IPXopen_socket(UI sock, int live);
extern void IPX_CALL IPXclose_socket(UI sock);
extern int IPX_CALL IPXlisten(ECB *ecb);
extern void asm_esr_routine(void);
extern void esr_routine(ECB *ecb);
extern void IPX_CALL xmemmove(void *ziel, void *quelle, UI anz);
#undef IPX_CALL
#endif /* IPX_H */

20
kern.h
View File

@@ -1,20 +0,0 @@
/* kern.h Assembler Routinen 20-Nov-93 */
#if defined(__WATCOMC__)
#define KERN_CALL _Cdecl
#else
#define KERN_CALL
#endif
extern int KERN_CALL IPXinit(void);
extern int KERN_CALL IPXopen_socket(UI sock, int live);
extern void KERN_CALL IPXclose_socket(UI sock);
extern int KERN_CALL IPXlisten(ECB *ecb);
extern void asm_esr_routine(void);
extern void esr_routine(ECB *ecb);
extern void KERN_CALL xmemmove(void *ziel, void *quelle, UI anz);
extern int KERN_CALL Net_Call(UI func, void *req, void *repl);
#undef KERN_CALL

487
login.c
View File

@@ -1,11 +1,31 @@
/* login.c 21-May-96 */ /*
* 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/>.
*/
/**************************************************************** /*
* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany * * Purpose: LOGIN, LOGOUT, PASSWD and PROFILE command implementation for NetWare servers.
****************************************************************/ * Depends on: net.h, nwcrypt.h/nwcrypt.c password encryption helpers, netcall.c requester helpers, tools.c shared utility routines.
*/
#include "net.h" #include "net.h"
#include "nwcrypt.h" #include "nwcrypt.h"
#include <time.h>
#ifndef BLACK #ifndef BLACK
#define BLACK 0 #define BLACK 0
@@ -23,17 +43,100 @@
static uint8 script_login_name[64]; static uint8 script_login_name[64];
static uint8 script_file_server[52]; static uint8 script_file_server[52];
#if defined(__WATCOMC__) static char **build_argv(char *buf, int bufsize, char *str);
extern void textbackground(int color);
extern void textcolor(int color);
extern void clrscr(void);
extern void gotoxy(int x, int y);
#endif
extern char **build_argv(char *buf, int bufsize, char *str);
extern int read_command_file(char *fstr); extern int read_command_file(char *fstr);
extern int get_fs_name(int connid, char *name); extern int get_fs_name(int connid, char *name);
static int login_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) {
if (server) server[0] = '\0';
return(-1);
}
if (server)
strmaxcpy(server, repl.data, 47);
return(0);
}
static uint8 login_video_attr = 0x07;
static void login_gotoxy(int x, int y)
{
REGS regs;
regs.h.ah = 0x02;
regs.h.bh = 0x00;
regs.h.dh = (uint8)(y - 1);
regs.h.dl = (uint8)(x - 1);
int86(0x10, &regs, &regs);
}
static void login_cls_attr(uint8 attr)
{
REGS regs;
regs.h.ah = 0x06;
regs.h.al = 0x00;
regs.h.bh = attr;
regs.h.ch = 0;
regs.h.cl = 0;
regs.h.dh = 24;
regs.h.dl = 79;
int86(0x10, &regs, &regs);
login_gotoxy(1, 1);
}
static void login_write_attr(int x, int y, const char *s, uint8 attr)
{
REGS regs;
int col = x;
while (*s) {
login_gotoxy(col++, y);
regs.h.ah = 0x09;
regs.h.al = (uint8)*s++;
regs.h.bh = 0;
regs.h.bl = attr;
regs.x.cx = 1;
int86(0x10, &regs, &regs);
}
login_gotoxy(col, y);
}
static void login_fill_line(int y, uint8 attr)
{
REGS regs;
login_gotoxy(1, y);
regs.h.ah = 0x09;
regs.h.al = ' ';
regs.h.bh = 0;
regs.h.bl = attr;
regs.x.cx = 80;
int86(0x10, &regs, &regs);
}
static void login_screen_normal(void)
{
login_video_attr = 0x07;
}
static int login_help(void) static int login_help(void)
{ {
@@ -51,27 +154,29 @@ static int login_help(void)
fprintf(stdout, "\n"); fprintf(stdout, "\n");
fprintf(stdout, " Examples:\n"); fprintf(stdout, " Examples:\n");
fprintf(stdout, " LOGIN SUPERVISOR\n"); fprintf(stdout, " LOGIN SUPERVISOR\n");
fprintf(stdout, " LOGIN MARS/SUPERVISOR\n"); fprintf(stdout, " LOGIN SERVER/SUPERVISOR\n");
fprintf(stdout, "\n"); fprintf(stdout, "\n");
return(0); return(0);
} }
static void login_banner(void) static void login_banner(void)
{ {
int i; login_cls_attr(0x07); /* normal black background */
textbackground(BLUE); /*
textcolor(WHITE); * NetWare-like header, but blue for Mars NWE:
clrscr(); * blue separator
* blue title line
* blue separator
* then normal black prompt area.
*/
login_fill_line(1, 0x1f); /* white on blue */
login_fill_line(2, 0x1f); /* white on blue */
login_write_attr(36, 2, "Mars NWE", 0x1f);
login_fill_line(3, 0x1f); /* white on blue */
gotoxy(1, 1); login_screen_normal();
for (i = 0; i < 80; i++) putch(' '); login_gotoxy(1, 4);
gotoxy(36, 1);
cputs("Mars NWE");
textbackground(BLACK);
textcolor(LIGHTGRAY);
gotoxy(1, 3);
} }
static char *skip_spaces(char *p) static char *skip_spaces(char *p)
@@ -100,18 +205,100 @@ static void strip_quotes(char *s)
*d = '\0'; *d = '\0';
} }
static void script_get_timevar(char *name, char *out, int outlen)
{
time_t now;
struct tm *tmv;
int hour;
static char *months[] = {
"JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE",
"JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER"
};
static char *days[] = {
"SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY",
"THURSDAY", "FRIDAY", "SATURDAY"
};
*out = '\0';
time(&now);
tmv = localtime(&now);
if (!tmv) return;
upstr(name);
if (!strcmp(name, "GREETING_TIME")) {
if (tmv->tm_hour < 12) strcpy(out, "MORNING");
else if (tmv->tm_hour < 18) strcpy(out, "AFTERNOON");
else strcpy(out, "EVENING");
} else if (!strcmp(name, "MONTH_NAME")) {
strmaxcpy(out, months[tmv->tm_mon], outlen - 1);
} else if (!strcmp(name, "MONTH")) {
sprintf(out, "%02d", tmv->tm_mon + 1);
} else if (!strcmp(name, "DAY")) {
sprintf(out, "%02d", tmv->tm_mday);
} else if (!strcmp(name, "YEAR")) {
sprintf(out, "%04d", tmv->tm_year + 1900);
} else if (!strcmp(name, "DAY_OF_WEEK")) {
strmaxcpy(out, days[tmv->tm_wday], outlen - 1);
} else if (!strcmp(name, "HOUR")) {
hour = tmv->tm_hour % 12;
if (!hour) hour = 12;
sprintf(out, "%d", hour);
} else if (!strcmp(name, "MINUTE")) {
sprintf(out, "%02d", tmv->tm_min);
} else if (!strcmp(name, "SECOND")) {
sprintf(out, "%02d", tmv->tm_sec);
} else if (!strcmp(name, "AM_PM")) {
strcpy(out, tmv->tm_hour >= 12 ? "PM" : "AM");
}
}
static void script_expand_var(char *name, char *out, int outlen)
{
upstr(name);
*out = '\0';
if (!strcmp(name, "LOGIN_NAME")) {
strmaxcpy(out, script_login_name, outlen - 1);
} else if (!strcmp(name, "FILE_SERVER")) {
strmaxcpy(out, script_file_server, outlen - 1);
} else if (!strcmp(name, "P_STATION") || !strcmp(name, "STATION")) {
strcpy(out, "000000000000");
} else {
script_get_timevar(name, out, outlen);
if (!*out) {
strcpy(out, "%");
strncat(out, name, outlen - strlen(out) - 1);
}
}
}
static void script_put_expanded(char *s) static void script_put_expanded(char *s)
{ {
while (s && *s) { while (s && *s) {
if (!strncmp(s, "%LOGIN_NAME", 11) || !strncmp(s, "%login_name", 11)) { if (*s == '%') {
fprintf(stdout, "%s", script_login_name); char name[64];
s += 11; char value[128];
} else if (!strncmp(s, "%FILE_SERVER", 12) || !strncmp(s, "%file_server", 12)) { int i = 0;
fprintf(stdout, "%s", script_file_server);
s += 12; s++;
} else if (!strncmp(s, "%P_STATION", 10) || !strncmp(s, "%p_station", 10)) { while ((*s == '_' ||
fprintf(stdout, "000000000000"); (*s >= 'A' && *s <= 'Z') ||
s += 10; (*s >= 'a' && *s <= 'z') ||
(*s >= '0' && *s <= '9')) &&
i < (int)sizeof(name) - 1) {
name[i++] = *s++;
}
name[i] = '\0';
if (i) {
script_expand_var(name, value, sizeof(value));
fprintf(stdout, "%s", value);
} else {
fputc('%', stdout);
}
} else { } else {
fputc(*s++, stdout); fputc(*s++, stdout);
} }
@@ -182,30 +369,52 @@ static int script_eval_if(char *line)
if (q != NULL) { if (q != NULL) {
char want[64]; char want[64];
char *v; char have[64];
int i = 0; int i = 0;
q += neg ? 2 : 1; q += neg ? 2 : 1;
q = skip_spaces(q); q = skip_spaces(q);
if (*q == '"' || *q == '\'') q++; if (*q == '"' || *q == '\'') q++;
while (*q && *q != '"' && *q != '\'' && *q != 32 && *q != '\t' && i < 63) { while (*q && *q != '"' && *q != '\'' && *q != 32 && *q != '\t' && i < 63)
want[i++] = *q++; want[i++] = *q++;
}
want[i] = '\0'; want[i] = '\0';
strmaxcpy(tmp, script_login_name, sizeof(tmp) - 1); strmaxcpy(have, script_login_name, sizeof(have) - 1);
upstr(tmp); upstr(have);
if (neg) return(strcmp(tmp, want) != 0); if (neg) return(strcmp(have, want) != 0);
else return(strcmp(tmp, want) == 0); return(strcmp(have, want) == 0);
}
}
p = strstr(tmp, "DAY_OF_WEEK");
if (p != NULL) {
q = strchr(p, '=');
if (q != NULL) {
char want[64];
char have[64];
int i = 0;
q++;
q = skip_spaces(q);
if (*q == '"' || *q == '\'') q++;
while (*q && *q != '"' && *q != '\'' && *q != 32 && *q != '\t' && i < 63)
want[i++] = *q++;
want[i] = '\0';
strcpy(have, "DAY_OF_WEEK");
script_get_timevar(have, have, sizeof(have));
upstr(have);
return(strcmp(have, want) == 0);
} }
} }
return(0); return(0);
} }
static int login_strnicmp(char *a, char *b, int n) static int login_strnicmp(char *a, char *b, int n)
{ {
while (n-- > 0) { while (n-- > 0) {
@@ -230,7 +439,7 @@ static int script_execute_line(char *line)
strmaxcpy(work, line, sizeof(work) - 1); strmaxcpy(work, line, sizeof(work) - 1);
p = skip_spaces(work); p = skip_spaces(work);
if (!*p) return(0); if (!*p || *p == ';') return(0);
i = 0; i = 0;
while (p[i] && p[i] != 32 && p[i] != '\t' && i < 31) { while (p[i] && p[i] != 32 && p[i] != '\t' && i < 31) {
@@ -256,7 +465,7 @@ static int script_execute_line(char *line)
} }
if (!strcmp(cmd, "CLS")) { if (!strcmp(cmd, "CLS")) {
clrscr(); login_cls_attr(0x07);
return(0); return(0);
} }
@@ -288,6 +497,13 @@ static int script_execute_line(char *line)
return(0); return(0);
} }
if (!strncmp(up, "ROOT ", 5)) {
char callbuf[512];
sprintf(callbuf, "MAP %s", skip_spaces(arg + 5));
script_call_line(callbuf);
return(0);
}
if (!strncmp(up, "INS ", 4) || !strncmp(up, "INSERT ", 7)) { if (!strncmp(up, "INS ", 4) || !strncmp(up, "INSERT ", 7)) {
char callbuf[512]; char callbuf[512];
char *a = arg; char *a = arg;
@@ -309,6 +525,10 @@ static int script_execute_line(char *line)
} }
} }
if (!strcmp(cmd, "ATTACH")) {
return(0);
}
if (!strcmp(cmd, "EXIT")) { if (!strcmp(cmd, "EXIT")) {
return(1); return(1);
} }
@@ -317,20 +537,87 @@ static int script_execute_line(char *line)
return(0); return(0);
} }
static int try_login_script_file(char *name)
{
return(read_command_file(name));
}
static int run_login_script(void) static int run_login_script(void)
{ {
char profile[200]; char profile[200];
char drive;
/*
* Novell LOGIN looks for the system login script using server based paths,
* for example \\SERVER\SYS\PUBLIC\NET$LOG.DAT. Try that first.
*/
if (*script_file_server) {
sprintf(profile, "\\\\%s\\SYS\\PUBLIC\\NET$LOG.DAT", script_file_server);
if (try_login_script_file(profile) != -2) return(0);
sprintf(profile, "\\\\%s\\SYS\\PUBLIC\\net$log.dat", script_file_server);
if (try_login_script_file(profile) != -2) return(0);
sprintf(profile, "\\\\%s\\SYS\\LOGIN\\LOGIN", script_file_server);
if (try_login_script_file(profile) != -2) return(0);
sprintf(profile, "\\\\%s\\SYS\\LOGIN\\NET$LOG.DAT", script_file_server);
if (try_login_script_file(profile) != -2) return(0);
}
/*
* Then try current directory and the executable path. LOGIN.EXE is often
* executed from PUBLIC, so this covers SYS:PUBLIC\NET$LOG.DAT without
* relying on an absolute drive path.
*/
if (try_login_script_file("NET$LOG.DAT") != -2) return(0);
if (try_login_script_file("net$log.dat") != -2) return(0);
if (try_login_script_file("LOGIN") != -2) return(0);
if (try_login_script_file("login") != -2) return(0);
if (*prgpath) {
sprintf(profile, "%sNET$LOG.DAT", prgpath);
if (try_login_script_file(profile) != -2) return(0);
sprintf(profile, "%snet$log.dat", prgpath); sprintf(profile, "%snet$log.dat", prgpath);
if (read_command_file(profile) != -2) return(0); if (try_login_script_file(profile) != -2) return(0);
sprintf(profile, "%sLOGIN", prgpath);
if (try_login_script_file(profile) != -2) return(0);
sprintf(profile, "%slogin", prgpath); sprintf(profile, "%slogin", prgpath);
if (read_command_file(profile) != -2) return(0); if (try_login_script_file(profile) != -2) return(0);
}
if (read_command_file("net$log.dat") != -2) return(0); /*
if (read_command_file("login") != -2) return(0); * Fallbacks for requesters/runtimes that cannot open UNC from C fopen().
if (read_command_file("\\login\\login") != -2) return(0); */
if (read_command_file("\\login\\net$log.dat") != -2) return(0); if (try_login_script_file("\\PUBLIC\\NET$LOG.DAT") != -2) return(0);
if (try_login_script_file("\\public\\net$log.dat") != -2) return(0);
if (try_login_script_file("\\PUBLIC\\LOGIN") != -2) return(0);
if (try_login_script_file("\\public\\login") != -2) return(0);
if (try_login_script_file("\\LOGIN\\LOGIN") != -2) return(0);
if (try_login_script_file("\\login\\login") != -2) return(0);
if (try_login_script_file("\\LOGIN\\NET$LOG.DAT") != -2) return(0);
if (try_login_script_file("\\login\\net$log.dat") != -2) return(0);
for (drive = 'C'; drive <= 'Z'; drive++) {
sprintf(profile, "%c:\\PUBLIC\\NET$LOG.DAT", drive);
if (try_login_script_file(profile) != -2) return(0);
sprintf(profile, "%c:\\public\\net$log.dat", drive);
if (try_login_script_file(profile) != -2) return(0);
sprintf(profile, "%c:\\PUBLIC\\LOGIN", drive);
if (try_login_script_file(profile) != -2) return(0);
sprintf(profile, "%c:\\LOGIN\\LOGIN", drive);
if (try_login_script_file(profile) != -2) return(0);
sprintf(profile, "%c:\\LOGIN\\NET$LOG.DAT", drive);
if (try_login_script_file(profile) != -2) return(0);
}
return(-2); return(-2);
} }
@@ -344,8 +631,8 @@ static int do_change_object_passwd(char *name,
{ {
uint8 key[8]; uint8 key[8];
if (!ncp_17_17(key)) { if (!ncp17_17_get_encryption_key(key)) {
uint32 objid = ncp_17_35(name, objtyp); uint32 objid = ncp17_35_get_bindery_object_id(name, objtyp);
if (objid) { if (objid) {
uint8 oldpwd[16]; /* old passwd as stored by server */ uint8 oldpwd[16]; /* old passwd as stored by server */
uint8 newpwd[16]; /* new passwd as stored by server */ uint8 newpwd[16]; /* new passwd as stored by server */
@@ -376,7 +663,7 @@ static int do_change_object_passwd(char *name,
if (newlen > 63) newlen = 63; if (newlen > 63) newlen = 63;
passwdx = (uint8)(((newlen ^ oldpwd[0] ^ oldpwd[1]) & 0x7f) | 0x40); passwdx = (uint8)(((newlen ^ oldpwd[0] ^ oldpwd[1]) & 0x7f) | 0x40);
if (!ncp_17_4b(cryptkey, name, objtyp, passwdx, newpwd)) { if (!ncp17_4b_keyed_change_password(cryptkey, name, objtyp, passwdx, newpwd)) {
;; ;;
return(0); return(0);
} }
@@ -387,7 +674,7 @@ static int do_change_object_passwd(char *name,
* Fallback for old servers/requesters where Get Encryption Key is not * Fallback for old servers/requesters where Get Encryption Key is not
* available. Keep the original unencrypted behavior as fallback only. * available. Keep the original unencrypted behavior as fallback only.
*/ */
if (!ncp_17_40(name, objtyp, oldpassword, newpassword)) { if (!ncp17_40_change_password_unencrypted(name, objtyp, oldpassword, newpassword)) {
;; ;;
return(0); return(0);
} }
@@ -398,8 +685,8 @@ static int do_change_object_passwd(char *name,
static int do_object_login(char *name, uint16 objtyp, char *password, int option) static int do_object_login(char *name, uint16 objtyp, char *password, int option)
{ {
uint8 key[8]; uint8 key[8];
if (!(option & 1) && !ncp_17_17(key)) { if (!(option & 1) && !ncp17_17_get_encryption_key(key)) {
uint32 objid = ncp_17_35(name, objtyp); uint32 objid = ncp17_35_get_bindery_object_id(name, objtyp);
if (objid) { if (objid) {
uint8 buff[128]; uint8 buff[128];
uint8 encrypted[8]; uint8 encrypted[8];
@@ -407,13 +694,13 @@ static int do_object_login(char *name, uint16 objtyp, char *password, int option
U32_TO_BE32(objid, tmpid); U32_TO_BE32(objid, tmpid);
shuffle(tmpid, password, strlen(password), buff); shuffle(tmpid, password, strlen(password), buff);
nw_encrypt(key, buff, encrypted); nw_encrypt(key, buff, encrypted);
if (!ncp_17_18(encrypted, name, objtyp)) { if (!ncp17_18_keyed_object_login(encrypted, name, objtyp)) {
;; ;;
return(0); return(0);
} }
} }
} else { /* now we use old unencrypted algorithmus */ } else { /* now we use old unencrypted algorithmus */
if (!ncp_17_14(name, objtyp, password)) { if (!ncp17_14_login_object_unencrypted(name, objtyp, password)) {
return(0); return(0);
} }
} }
@@ -472,12 +759,60 @@ static int login_usage(void)
return(login_help()); 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 func_login(int argc, char *argv[], int mode)
{ {
int result=-1; int result=-1;
int option=0; int option=0;
uint8 uname[200]; uint8 uname[200];
uint8 upasswd[200]; uint8 upasswd[200];
#ifdef MAINTAINER_BUILD
uint8 hidden_passwd[200];
int have_hidden_passwd = 0;
#endif
SEARCH_VECTOR save_drives; SEARCH_VECTOR save_drives;
int interactive_login = 0; int interactive_login = 0;
int no_script = 0; int no_script = 0;
@@ -491,11 +826,17 @@ 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 (argc > 1) {
if (argv[1][0] == '-' || argv[1][0] == '/') { if (argv[1][0] == '-' || argv[1][0] == '/') {
if (argv[1][1] == 'u' || argv[1][1] == 'U') option |= 1; if (argv[1][1] == 'u' || argv[1][1] == 'U') option |= 1;
else if (!strcmp(argv[1], "/NS") || !strcmp(argv[1], "-NS")) no_script = 1; else if (!strcmp(argv[1], "/NS") || !strcmp(argv[1], "-NS")) no_script = 1;
else if (!strcmp(argv[1], "/CLS") || !strcmp(argv[1], "-CLS")) clrscr(); else if (!strcmp(argv[1], "/CLS") || !strcmp(argv[1], "-CLS")) login_cls_attr(0x07);
else return(login_usage()); else return(login_usage());
argc--; argc--;
argv++; argv++;
@@ -505,6 +846,10 @@ int func_login(int argc, char *argv[], int mode)
remove_nwpathes(); remove_nwpathes();
if (argc > 1) strmaxcpy(uname, argv[1], sizeof(uname) -1); if (argc > 1) strmaxcpy(uname, argv[1], sizeof(uname) -1);
else uname[0]='\0'; 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); if (argc > 2) strmaxcpy(upasswd, argv[2], sizeof(upasswd) -1);
else upasswd[0]='\0'; else upasswd[0]='\0';
@@ -533,8 +878,18 @@ int func_login(int argc, char *argv[], int mode)
if (result > -1) { if (result > -1) {
strmaxcpy(script_login_name, uname, sizeof(script_login_name) - 1); strmaxcpy(script_login_name, uname, sizeof(script_login_name) - 1);
if (get_fs_name(1, script_file_server)) script_file_server[0] = '\0';
strcpy(script_file_server, "MARS"); if (get_fs_name(1, script_file_server) || !script_file_server[0])
login_ncp23_server_info(script_file_server);
if (!script_file_server[0]) {
fprintf(stdout, "No known file server.\n");
#ifdef MAINTAINER_BUILD
memset(hidden_passwd, 0, sizeof(hidden_passwd));
#endif
memset(upasswd, 0, sizeof(upasswd));
return(1);
}
if (interactive_login) if (interactive_login)
fprintf(stdout, "You are attached to server %s.\n", script_file_server); fprintf(stdout, "You are attached to server %s.\n", script_file_server);
@@ -546,6 +901,10 @@ int func_login(int argc, char *argv[], int mode)
} else { } else {
(void)set_search_drive_vektor(save_drives); (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); return(result);
} }
@@ -567,7 +926,7 @@ int func_passwd(int argc, char *argv[], int mode)
uint8 upasswd[130]; uint8 upasswd[130];
uint32 my_obj_id; uint32 my_obj_id;
if (ncp_14_46(&my_obj_id) < 0 || my_obj_id == MAX_U32 || !my_obj_id) { if (ncp14_46_get_bindery_access_level(&my_obj_id) < 0 || my_obj_id == MAX_U32 || !my_obj_id) {
fprintf(stderr, "Cannot get actual user id\n"); fprintf(stderr, "Cannot get actual user id\n");
result = -1; result = -1;
} }
@@ -576,14 +935,14 @@ int func_passwd(int argc, char *argv[], int mode)
uint32 obj_id; uint32 obj_id;
strmaxcpy(uname, argv[1], sizeof(uname) -1); strmaxcpy(uname, argv[1], sizeof(uname) -1);
upstr(uname); upstr(uname);
obj_id = ncp_17_35(uname, 1); obj_id = ncp17_35_get_bindery_object_id(uname, 1);
if (!obj_id) { if (!obj_id) {
fprintf(stderr, "Unkwown user: %s\n", uname); fprintf(stderr, "Unkwown user: %s\n", uname);
return(-1); return(-1);
} }
} else if (!result) { } else if (!result) {
uint16 obj_typ; uint16 obj_typ;
if (ncp_17_36(my_obj_id, uname, &obj_typ) || obj_typ != 1) { if (ncp17_36_get_bindery_object_name(my_obj_id, uname, &obj_typ) || obj_typ != 1) {
fprintf(stderr, "Cannot get actual username\n"); fprintf(stderr, "Cannot get actual username\n");
result=-1; result=-1;
} }

411
map.c
View File

@@ -1,8 +1,27 @@
/* map.c 05-Apr-96 */ /*
* 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/>.
*/
/**************************************************************** /*
* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany * * Purpose: MAP and PATH command implementation for NetWare drive/search-drive mappings.
****************************************************************/ * Depends on: net.h, netcall.c requester helpers, tools.c shared utility routines, ncp.asm/doc/kern.asm low-level Net_Call glue.
*/
#include "net.h" #include "net.h"
@@ -28,9 +47,9 @@ static void show_map(uint8 *drvstr)
if (flags & 0x80) { /* lokal DRIVE */ if (flags & 0x80) { /* lokal DRIVE */
path[0]= '\\'; path[0]= '\\';
if (j < 2){ if (j < 2){
strcpy(path, "DISK LW"); strcpy(path, "maps to a local disk.");
} else if (getcurdir(j+1, path+1)) { } else if (getcurdir(j+1, path+1)) {
strcpy(path, "LW !OK"); strcpy(path, "maps to a local disk.");
} }
} else { } else {
if (get_dir_path(dhandle, path)) { if (get_dir_path(dhandle, path)) {
@@ -41,7 +60,7 @@ static void show_map(uint8 *drvstr)
strcat(servern, "\\"); strcat(servern, "\\");
} else servern[0]='\0'; } else servern[0]='\0';
} }
printf("MAP %c: = %s%s\n", (char)j+'A', servern, path); if (flags & 0x80) printf("Drive %c: %s\n", (char)j+'A', path); else printf("Drive %c: = %s%s\n", (char)j+'A', servern, path);
} }
} }
} }
@@ -58,9 +77,9 @@ static void do_map(int drive, NWPATH *nwp)
if (flags & 0x80) { /* lokal DRIVE */ if (flags & 0x80) { /* lokal DRIVE */
path[0]= '\\'; path[0]= '\\';
if (drive < 2){ if (drive < 2){
strcpy(path, "DISK LW"); strcpy(path, "maps to a local disk.");
} else if (getcurdir(drive+1, path+1)) { } else if (getcurdir(drive+1, path+1)) {
strcpy(path, "LW !OK"); strcpy(path, "maps to a local disk.");
} }
} else { } else {
if (get_dir_path(dhandle, path)) { if (get_dir_path(dhandle, path)) {
@@ -188,11 +207,207 @@ static int parse_argv(uint8 *drvstr, NWPATH *nwpath,
return(0); return(0);
} }
static int parse_pathins_arg(uint8 *drvstr, NWPATH *nwp,
int argc, char *argv[], int mode);
static int set_search_native(uint8 *drvstr, NWPATH *nwp, int pathmode);
static int show_search(uint8 *drvstr);
static int map_is_drive_arg(char *s)
{
if (!s || !s[0] || s[1] != ':' || s[2]) return(0);
if (s[0] >= 'A' && s[0] <= 'Z') return(1);
if (s[0] >= 'a' && s[0] <= 'z') return(1);
return(0);
}
static int map_drive_index(char *s)
{
if (s[0] >= 'a' && s[0] <= 'z') return(s[0] - 'a');
return(s[0] - 'A');
}
static void map_drive_name(char *dst, char *src)
{
dst[0] = src[0];
if (dst[0] >= 'a' && dst[0] <= 'z') dst[0] -= 32;
dst[1] = ':';
dst[2] = '\0';
}
static int map_find_free_drive(int ordinal)
{
int drive;
if (ordinal < 1) ordinal = 1;
for (drive = 2; drive < 26; drive++) {
uint8 connid = 0;
uint8 dhandle = 0;
uint8 flags = 0;
if (!get_drive_info((uint8)drive, &connid, &dhandle, &flags)) {
if (flags) continue;
}
if (--ordinal == 0) return(drive);
}
return(-1);
}
static int parse_auto_map_arg(uint8 *drvstr, NWPATH *nwp, int argc, char *argv[])
{
char joined[512];
char *p;
char *q;
int ordinal = 0;
int drive;
int k;
*drvstr = '\0';
memset(nwp, 0, sizeof(NWPATH));
nwp->path = nwp->buff;
*(nwp->buff) = '\0';
if (argc < 2) return(1);
joined[0] = '\0';
for (k = 1; k < argc; k++) {
if (k > 1) strcat(joined, " ");
strncat(joined, argv[k], sizeof(joined) - strlen(joined) - 1);
}
p = joined;
while (*p == ' ' || *p == '\t') p++;
if (*p != '*') return(1);
p++;
while (*p >= '0' && *p <= '9') {
ordinal = ordinal * 10 + (*p - '0');
p++;
}
if (ordinal < 1) ordinal = 1;
if (*p != ':') return(-1);
p++;
while (*p == ' ' || *p == '\t') p++;
if (*p != '=') return(-1);
p++;
while (*p == ' ' || *p == '\t') p++;
if (!*p) return(-1);
drive = map_find_free_drive(ordinal);
if (drive < 0) return(-1);
drvstr[0] = (uint8)(drive + 'A');
drvstr[1] = '\0';
q = nwp->buff;
while (*p && (q - nwp->buff) < (int)sizeof(nwp->buff) - 1) {
if (*p >= 'a' && *p <= 'z') *q++ = *p++ - 0x20;
else *q++ = *p++;
}
*q = '\0';
nwp->path = nwp->buff;
return(0);
}
static int map_handle_path_command(int argc, char *argv[], int pathmode)
{
uint8 drvstr[22];
NWPATH nwpath;
int rc;
rc = parse_pathins_arg(drvstr, &nwpath, argc, argv, pathmode);
if (!rc) {
int result = 0;
if (*(nwpath.path) || pathmode == 1)
result = set_search_native(drvstr, &nwpath, pathmode);
if (result < 0)
fprintf(stderr, "Cannot interpret line. errcode=-1\n");
else if (pathmode != 1)
show_search(drvstr);
else
fprintf(stdout, "The search mapping for drive S%d: was deleted\n",
(int)drvstr[1]);
return(result);
}
fprintf(stderr, "Cannot interpret line. errcode=-1\n");
return(-1);
}
int func_map(int argc, char *argv[], int mode) int func_map(int argc, char *argv[], int mode)
{ {
uint8 drvstr[22]; uint8 drvstr[22];
NWPATH nwpath; NWPATH nwpath;
if (!ipx_init()) argc = 1; if (!ipx_init()) argc = 1;
/*
* Novell MAP accepts subcommands through MAP itself:
* MAP DEL H:
* MAP INS S1:=SYS:PUBLIC
* MAP DEL S1:
* The original mars-dosutils exposed those mainly as MAPDEL/PATHINS/PATHDEL,
* so handle the Novell syntax here and then reuse the existing primitives.
*/
if (argc > 1) {
if (tool_strsame(argv[1], "/?") || tool_strsame(argv[1], "-?") ||
tool_strsame(argv[1], "?")) {
fprintf(stderr, "Directory \"/?\" is not locatable.\n");
return(1);
}
if (tool_strsame(argv[1], "INS") || tool_strsame(argv[1], "INSERT")) {
if (argc < 3) {
fprintf(stderr, "Cannot interpret line. errcode=-1\n");
return(1);
}
return(map_handle_path_command(argc - 1, argv + 1, 2));
}
if (tool_strsame(argv[1], "DEL") || tool_strsame(argv[1], "DELETE")) {
if (argc < 3) {
fprintf(stderr, "Cannot interpret line. errcode=-1\n");
return(1);
}
if (map_is_drive_arg(argv[2])) {
char dname[3];
int drive = map_drive_index(argv[2]);
if (do_map(drive, &nwpath, 1) < 0) {
fprintf(stderr, "Cannot interpret line. errcode=-1\n");
return(1);
}
map_drive_name(dname, argv[2]);
fprintf(stdout, "The mapping for drive %s has been deleted.\n", dname);
return(0);
}
return(map_handle_path_command(argc - 1, argv + 1, 1));
}
}
if (!parse_auto_map_arg(drvstr, &nwpath, argc, argv)) {
if (*(nwpath.path)) {
if (do_map(*drvstr - 'A', &nwpath, mode)< 0)
fprintf(stderr, "MAP Error\n");
}
if (mode != 1)
show_map(drvstr);
return(0);
}
if (!parse_argv(drvstr, &nwpath, argc, argv, 0, mode)) { if (!parse_argv(drvstr, &nwpath, argc, argv, 0, mode)) {
if (*(nwpath.path) || mode==1) { if (*(nwpath.path) || mode==1) {
if (do_map(*drvstr - 'A', &nwpath, mode)< 0) if (do_map(*drvstr - 'A', &nwpath, mode)< 0)
@@ -297,18 +512,192 @@ static int set_search(uint8 *drvstr, NWPATH *nwp, int pathmode)
return(result); return(result);
} }
static int path_is_drive_path(uint8 *path)
{
if (!path || !path[0] || path[1] != ':') return(0);
if (path[0] >= 'A' && path[0] <= 'Z') return(1);
if (path[0] >= 'a' && path[0] <= 'z') return(1);
return(0);
}
static void upstr_local(uint8 *s)
{
while (*s) {
if (*s >= 'a' && *s <= 'z') *s -= 0x20;
s++;
}
}
static int parse_pathins_arg(uint8 *drvstr, NWPATH *nwp, int argc, char *argv[], int mode)
{
char joined[512];
char *p;
char *q;
int slot = 0;
int k;
*drvstr = '\0';
memset(nwp, 0, sizeof(NWPATH));
nwp->path = nwp->buff;
*(nwp->buff) = '\0';
if (argc < 2) return(1);
joined[0] = '\0';
for (k = 1; k < argc; k++) {
if (k > 1) strcat(joined, " ");
strncat(joined, argv[k], sizeof(joined) - strlen(joined) - 1);
}
p = joined;
while (*p == ' ' || *p == '\t') p++;
if (*p != 'S' && *p != 's') return(-1);
p++;
while (*p >= '0' && *p <= '9') {
slot = slot * 10 + (*p - '0');
p++;
}
if (slot < 1 || slot > 16) return(-1);
if (*p != ':') return(-1);
p++;
drvstr[0] = 's';
drvstr[1] = (uint8)slot;
drvstr[2] = '\0';
while (*p == ' ' || *p == '\t') p++;
if (mode == 1) {
/* PATHDEL S1: */
return(0);
}
if (*p == '=') p++;
while (*p == ' ' || *p == '\t') p++;
if (!*p) return(-1);
q = nwp->buff;
while (*p && (q - nwp->buff) < (int)sizeof(nwp->buff) - 1) {
*q++ = *p++;
}
*q = '\0';
upstr_local(nwp->buff);
nwp->path = nwp->buff;
return(0);
}
static int set_search_native(uint8 *drvstr, NWPATH *nwp, int pathmode)
{
int result=-1;
SEARCH_VECTOR drives;
SEARCH_VECTOR_ENTRY *p=drives;
int j=0;
int entry = (*drvstr=='s') ? *(drvstr+1) : 0;
get_search_drive_vektor(drives);
while (p->drivenummer != 0xff && j++ < 16) {
if (!entry && path_is_drive_path(nwp->path)
&& (p->drivenummer + 'A' == nwp->path[0])) entry=j;
if (path_is_drive_path(nwp->path)
&& p->drivenummer + 'A' == nwp->path[0]
&& !strcmp(nwp->path+2, p->dospath)) {
p->drivenummer=0xfe;
*(p->dospath) = '\0';
p->flags = 0;
}
p++;
}
if (entry > 0) {
if (entry > 16) entry = 16;
if (pathmode == 2 && entry <= j && entry < 16) { /* insert modus */
int k=j+1-entry;
if (j < 16) {
p++;
k++;
j++;
}
while (k--) {
memcpy(p, p-1, sizeof(SEARCH_VECTOR_ENTRY));
--p;
}
}
if (--entry < j)
p = drives+entry;
else
(p+1)->drivenummer = 0xff;
memset(p, 0, sizeof(SEARCH_VECTOR_ENTRY));
if (pathmode==1) {
p->drivenummer = 0xfe;
*(p->dospath) = '\0';
result = set_search_drive_vektor(drives);
} else if (path_is_drive_path(nwp->path)) {
p->flags = 0;
p->drivenummer = (uint8)(nwp->path[0] - 'A');
if (nwp->path[0] >= 'a' && nwp->path[0] <= 'z')
p->drivenummer = (uint8)(nwp->path[0] - 'a');
strmaxcpy(p->dospath, nwp->path+2, sizeof(p->dospath)-1);
result = set_search_drive_vektor(drives);
} else {
/*
* Search path entries are not drive mappings. The original code stores
* the NetWare path text directly in dospath with drivenummer=0xfe.
* Client32 keeps/prints these entries correctly; allocating a permanent
* directory handle here made set_search_drive_vektor() return success,
* but the entry did not actually replace SEARCH1.
*/
p->flags = 0;
p->drivenummer = 0xfe;
strmaxcpy(p->dospath, nwp->path, sizeof(p->dospath)-1);
result = set_search_drive_vektor(drives);
}
}
return(result);
}
int func_path(int argc, char *argv[], int mode) int func_path(int argc, char *argv[], int mode)
{ {
uint8 drvstr[22]; uint8 drvstr[22];
NWPATH nwpath; NWPATH nwpath;
if (!parse_argv(drvstr, &nwpath, argc, argv, 1, mode)) { int rc;
/*
* PATH/PATHINS/PATHDEL need their own parser. The old parse_argv()
* rejects common login-script syntax such as:
* PATHINS S1:=SYS:PUBLIC
* MAP INS S1:=SYS:PUBLIC
*/
if (argc < 2) {
show_search("");
return(0);
}
rc = parse_pathins_arg(drvstr, &nwpath, argc, argv, mode);
if (!rc) {
int result=0; int result=0;
if (*(nwpath.path) || mode==1) if (*(nwpath.path) || mode==1)
result=set_search(drvstr, &nwpath, mode); result=set_search_native(drvstr, &nwpath, mode);
if (mode != 1) if (mode != 1)
show_search(drvstr); show_search(drvstr);
return(result); return(result);
} }
fprintf(stderr, "Cannot interpret line. errcode=-1\n");
return(1); return(1);
} }

1685
ncopy.c Normal file

File diff suppressed because it is too large Load Diff

817
ncp.asm Normal file
View File

@@ -0,0 +1,817 @@
;
; 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: Open Watcom WASM/MASM-syntax NetWare requester and Client32 transport glue.
; Depends on: ncp.h declarations, ncpcall.c transport helpers and ncpapi.c API wrappers.
;
; ncp.asm
;
; Low-level INT 21h Net_Call and Client32 requester entry points used by the
; DOS NCP transport helpers. This file is split from the former combined
; Open Watcom assembly glue so IPX support can stay in ipx.asm.
.286
.model large
.code
public _Net_Call
public _ncp_raw_request
public _ncp_openref_request
public _ncp_mapvar_request
_Net_Call proc far
push bp
mov bp, sp
; int Net_Call(UI func, void *req, void *repl)
; [bp+6] func
; [bp+8] req offset
; [bp+10] req segment
; [bp+12] repl offset
; [bp+14] repl segment
mov ax, [bp+6]
push ds
push si
push di
pushf
lds si, dword ptr [bp+8]
les di, dword ptr [bp+12]
int 21h
popf
pop di
pop si
pop ds
pop bp
mov ah, 0
ret
_Net_Call endp
; int ncp_openref_request(UI refLo, UI refHi, void *outbuf)
;
; Opens a Client32 connection by connection reference using the same d32wrap
; convention as _CONNOpenByReference / w95ocref.o.
;
; Input:
; refLo/refHi = connection reference, e.g. C32PRIMREF returned 0028:0000.
;
; outbuf:
; +00 load AX from D8C1
; +02 resolver off
; +04 resolver seg
; +06 trampoline off
; +08 trampoline seg
; +0A function off
; +0C function seg
; +0E return AX
; +10 return DX
; +12 handle low
; +14 handle high
_ncp_openref_request proc far
push bp
mov bp, sp
sub sp, 80
push ds
push es
push si
push di
; clear ESI/ECX
db 66h, 33h, 0F6h
db 66h, 33h, 0C9h
mov ax, 0D8C1h
int 2Fh
mov [bp-4], ax ; load AX
; resolver ESI -> [bp-8]
db 66h, 89h, 76h, 0F8h
; trampoline ECX -> [bp-12]
db 66h, 89h, 4Eh, 0F4h
or ax, ax
jne c32openref_fail
; resolve "CONNOpenByReference"
push cs
push offset c32openref_name
push 0
push 0
call dword ptr [bp-8]
add sp, 8
mov [bp-16], ax
mov [bp-14], dx
or ax, dx
jne c32openref_have_func
jmp c32openref_fail
c32openref_have_func:
; local output handle dword at [bp-20]
mov word ptr [bp-20], 0
mov word ptr [bp-18], 0
; MapLockFlat(&handle, 4) -> flat [bp-24]
push 0
push 4
push ss
lea ax, -20[bp]
push ax
push 0
push 2
call dword ptr [bp-8]
add sp, 0cH
mov [bp-24], ax
mov [bp-22], dx
; Call NIOS trampoline command 5 / CONNOpenByReference.
; This matches d32wrap _CONNOpenByReference after w95ocref:
; flat handle ptr,
; refHi/refLo,
; 0,0,
; FEFE FEFE FEFE FEFE,
; command 5,
; function ptr.
push word ptr [bp-22] ; flat handle high
push word ptr [bp-24] ; flat handle low
push word ptr [bp+8] ; ref high
push word ptr [bp+6] ; ref low
push 0
push 0
push 0fefeH
push 0fefeH
push 0fefeH
push 0fefeH
push 0
push 5
push word ptr [bp-14] ; function seg
push word ptr [bp-16] ; function off
call dword ptr [bp-12]
add sp, 1cH
mov [bp-28], ax
mov [bp-26], dx
; UnlockFlat(handle flat, 4)
push 0
push 4
push word ptr [bp-22]
push word ptr [bp-24]
push 0
push 3
call dword ptr [bp-8]
add sp, 0cH
jmp short c32openref_store
c32openref_fail:
mov word ptr [bp-16], 0
mov word ptr [bp-14], 0
mov word ptr [bp-28], 0ffffH
mov word ptr [bp-26], 0ffffH
mov word ptr [bp-20], 0
mov word ptr [bp-18], 0
c32openref_store:
les di, dword ptr [bp+10]
mov ax, [bp-4]
mov es:[di+0], ax
mov ax, [bp-8]
mov es:[di+2], ax
mov ax, [bp-6]
mov es:[di+4], ax
mov ax, [bp-12]
mov es:[di+6], ax
mov ax, [bp-10]
mov es:[di+8], ax
mov ax, [bp-16]
mov es:[di+10], ax
mov ax, [bp-14]
mov es:[di+12], ax
mov ax, [bp-28]
mov es:[di+14], ax
mov ax, [bp-26]
mov es:[di+16], ax
mov ax, [bp-20]
mov es:[di+18], ax
mov ax, [bp-18]
mov es:[di+20], ax
pop di
pop si
pop es
pop ds
mov sp, bp
pop bp
xor ah, ah
ret
c32openref_name db 'CONNOpenByReference',0
_ncp_openref_request endp
; int ncp_mapvar_request(UI specLen, UI flag, void *outbuf)
;
; Exact-ish raw version of w95mconn.o::__C32MapConn16To32 second step.
;
; It emulates:
; C32MAPCONNONE 40 -> server name MARS
; NWCSCANCONNINFO(scanIterator/result ptr,
; scanInfoLevel=0A, scanConnInfo=NWCString/SPECTDATA "MARS",
; scanFlags=1, connInfoVersion=0,
; returnInfoLevel=0, returnConnInfo=NULL,
; connReference local)
;
; But calls Client32 CONNScanInfo directly through ECX/NIOS command 0A.
;
; outbuf:
; +00 load AX
; +02 resolver off
; +04 resolver seg
; +06 trampoline off
; +08 trampoline seg
; +0A function off
; +0C function seg
; +0E ret AX
; +10 ret DX
; +12 resultRef low ; corresponds to caller output ptr in w95mconn
; +14 resultRef high
; +16 connRefLocal low ; corresponds to d32conni local -1c
; +18 connRefLocal high
_ncp_mapvar_request proc far
push bp
mov bp, sp
sub sp, 140
push ds
push es
push si
push di
; clear ESI/ECX
db 66h, 33h, 0F6h
db 66h, 33h, 0C9h
mov ax, 0D8C1h
int 2Fh
mov [bp-4], ax ; load AX
; resolver ESI -> [bp-8]
db 66h, 89h, 76h, 0F8h
; trampoline ECX -> [bp-12]
db 66h, 89h, 4Eh, 0F4h
or ax, ax
jne c32mapvar_fail
; resolve "CONNScanInfo"
push cs
push offset c32mapvar_name
push 0
push 0
call dword ptr [bp-8]
add sp, 8
mov [bp-16], ax
mov [bp-14], dx
or ax, dx
jne c32mapvar_have_func
jmp c32mapvar_fail
c32mapvar_have_func:
; resultRef/output dword at [bp-20], init 0
mov word ptr [bp-20], 0
mov word ptr [bp-18], 0
; connReference local dword at [bp-24], init 0
mov word ptr [bp-24], 0
mov word ptr [bp-22], 0
; string buffer at [bp-80], copy "MARS", zero padded enough
lea di, -80[bp]
push ss
pop es
mov byte ptr es:[di+0], 'M'
mov byte ptr es:[di+1], 'A'
mov byte ptr es:[di+2], 'R'
mov byte ptr es:[di+3], 'S'
mov byte ptr es:[di+4], 0
; Map string buffer len 31h -> [bp-28]
push 0
push 31H
push ss
lea ax, -80[bp]
push ax
push 0
push 2
call dword ptr [bp-8]
add sp, 0cH
mov [bp-28], ax
mov [bp-26], dx
; Build SPECTDATA/NWCString transfer block at [bp-48], len 10h.
; Mirrors d32conni initialization for server-name scan.
mov ax, [bp+6]
mov word ptr [bp-48], ax
mov word ptr [bp-46], 0
mov ax, [bp-28]
mov word ptr [bp-44], ax
mov ax, [bp-26]
mov word ptr [bp-42], ax
mov word ptr [bp-40], 1
mov word ptr [bp-38], 0
mov word ptr [bp-36], 0
mov word ptr [bp-34], 0
; Map scanInfo spectdata block len 10h -> [bp-32]
push 0
push 10H
push ss
lea ax, -48[bp]
push ax
push 0
push 2
call dword ptr [bp-8]
add sp, 0cH
mov [bp-32], ax
mov [bp-30], dx
; Map resultRef/output len4 -> [bp-56] (this is w95mconn caller ptr)
push 0
push 4
push ss
lea ax, -20[bp]
push ax
push 0
push 2
call dword ptr [bp-8]
add sp, 0cH
mov [bp-56], ax
mov [bp-54], dx
; Map connReference local len4 -> [bp-60]
push 0
push 4
push ss
lea ax, -24[bp]
push ax
push 0
push 2
call dword ptr [bp-8]
add sp, 0cH
mov [bp-60], ax
mov [bp-58], dx
; Raw CONNScanInfo via NIOS, following d32wrap _CONNScanInfo
; argument order from d32conni L$115.
push word ptr [bp-58] ; connReference flat high
push word ptr [bp-60] ; connReference flat low
push 0 ; returnConnInfo flat high = NULL
push 0 ; returnConnInfo flat low = NULL
push 0 ; returnInfoLen high
push 0 ; returnInfoLen low
push 0 ; returnInfoLevel high
push 4 ; returnInfoLevel low, as d32conni L$115
push 0 ; scan flag high
push word ptr [bp+8] ; scan flag low
push word ptr [bp-30] ; scanInfo flat high
push word ptr [bp-32] ; scanInfo flat low
push 0 ; scanInfoLevel high
push 0aH ; scanInfoLevel low = SERVER_NAME
push word ptr [bp-54] ; scanIterator/result flat high
push word ptr [bp-56] ; scanIterator/result flat low
push 0fefeH
push 0fefeH
push 0fefeH
push 0fefeH
push 0
push 0aH
push word ptr [bp-14]
push word ptr [bp-16]
call dword ptr [bp-12]
add sp, 30H
mov [bp-64], ax
mov [bp-62], dx
; Unlock maps.
push 0
push 4
push word ptr [bp-58]
push word ptr [bp-60]
push 0
push 3
call dword ptr [bp-8]
add sp, 0cH
push 0
push 4
push word ptr [bp-54]
push word ptr [bp-56]
push 0
push 3
call dword ptr [bp-8]
add sp, 0cH
push 0
push 10H
push word ptr [bp-30]
push word ptr [bp-32]
push 0
push 3
call dword ptr [bp-8]
add sp, 0cH
push 0
push 31H
push word ptr [bp-26]
push word ptr [bp-28]
push 0
push 3
call dword ptr [bp-8]
add sp, 0cH
jmp short c32mapvar_store
c32mapvar_fail:
mov word ptr [bp-16], 0
mov word ptr [bp-14], 0
mov word ptr [bp-64], 0ffffH
mov word ptr [bp-62], 0ffffH
mov word ptr [bp-20], 0
mov word ptr [bp-18], 0
mov word ptr [bp-24], 0
mov word ptr [bp-22], 0
c32mapvar_store:
les di, dword ptr [bp+10]
mov ax, [bp-4]
mov es:[di+0], ax
mov ax, [bp-8]
mov es:[di+2], ax
mov ax, [bp-6]
mov es:[di+4], ax
mov ax, [bp-12]
mov es:[di+6], ax
mov ax, [bp-10]
mov es:[di+8], ax
mov ax, [bp-16]
mov es:[di+10], ax
mov ax, [bp-14]
mov es:[di+12], ax
mov ax, [bp-64]
mov es:[di+14], ax
mov ax, [bp-62]
mov es:[di+16], ax
mov ax, [bp-20]
mov es:[di+18], ax
mov ax, [bp-18]
mov es:[di+20], ax
mov ax, [bp-24]
mov es:[di+22], ax
mov ax, [bp-22]
mov es:[di+24], ax
pop di
pop si
pop es
pop ds
mov sp, bp
pop bp
xor ah, ah
ret
c32mapvar_name db 'CONNScanInfo',0
_ncp_mapvar_request endp
; int ncp_raw_request(UI connLo, UI connHi,
; void *hdr, UI hdrLen,
; void *path, UI pathLen,
; void *rep0, UI rep0Len,
; void *rep1, UI rep1Len,
; void *outbuf)
;
; Sends a raw NCP request through the d32wrap-compatible 5-slot
; fragment tables: 5 * 8 = 0x28 bytes for request and reply.
_ncp_raw_request proc far
push bp
mov bp, sp
sub sp, 180
push ds
push es
push si
push di
; clear ESI/ECX
db 66h, 33h, 0F6h
db 66h, 33h, 0C9h
mov ax, 0D8C1h
int 2Fh
mov [bp-2], ax
db 66h, 89h, 76h, 0FAh ; resolver at [bp-6]
db 66h, 89h, 4Eh, 0F6h ; trampoline at [bp-10]
or ax, ax
jne raw_fail
; resolve COMPATNcpRequestReply
push cs
push offset raw_name
push 0
push 0
call dword ptr [bp-6]
add sp, 8
mov [bp-14], ax
mov [bp-12], dx
or ax, dx
jne raw_have_func
jmp raw_fail
raw_have_func:
; actual reply len dword at [bp-36]
mov word ptr [bp-36], 0
mov word ptr [bp-34], 0
; map hdr -> [bp-20]
push 0
push word ptr [bp+0eH]
push word ptr [bp+0cH]
push word ptr [bp+0aH]
push 0
push 2
call dword ptr [bp-6]
add sp, 0cH
mov [bp-20], ax
mov [bp-18], dx
; map path -> [bp-24]
push 0
push word ptr [bp+14H]
push word ptr [bp+12H]
push word ptr [bp+10H]
push 0
push 2
call dword ptr [bp-6]
add sp, 0cH
mov [bp-24], ax
mov [bp-22], dx
; map rep0 -> [bp-28]
push 0
push word ptr [bp+1aH]
push word ptr [bp+18H]
push word ptr [bp+16H]
push 0
push 2
call dword ptr [bp-6]
add sp, 0cH
mov [bp-28], ax
mov [bp-26], dx
; map rep1 -> [bp-32]
push 0
push word ptr [bp+20H]
push word ptr [bp+1eH]
push word ptr [bp+1cH]
push 0
push 2
call dword ptr [bp-6]
add sp, 0cH
mov [bp-32], ax
mov [bp-30], dx
; zero req table [bp-160] len 40 and reply table [bp-120] len 40
push ss
pop es
cld
xor ax, ax
lea di, -160[bp]
mov cx, 20
rep stosw
lea di, -120[bp]
mov cx, 20
rep stosw
; req entry0 = hdr
mov ax, [bp-20]
mov [bp-160], ax
mov ax, [bp-18]
mov [bp-158], ax
mov ax, [bp+0eH]
mov [bp-156], ax
mov word ptr [bp-154], 0
; req entry1 = path
mov ax, [bp-24]
mov [bp-152], ax
mov ax, [bp-22]
mov [bp-150], ax
mov ax, [bp+14H]
mov [bp-148], ax
mov word ptr [bp-146], 0
; reply entry0 = rep0
mov ax, [bp-28]
mov [bp-120], ax
mov ax, [bp-26]
mov [bp-118], ax
mov ax, [bp+1aH]
mov [bp-116], ax
mov word ptr [bp-114], 0
; reply entry1 = rep1
mov ax, [bp-32]
mov [bp-112], ax
mov ax, [bp-30]
mov [bp-110], ax
mov ax, [bp+20H]
mov [bp-108], ax
mov word ptr [bp-106], 0
; map req table 0x28 -> [bp-40]
push 0
push 28H
push ss
lea ax, -160[bp]
push ax
push 0
push 2
call dword ptr [bp-6]
add sp, 0cH
mov [bp-40], ax
mov [bp-38], dx
; map reply table 0x28 -> [bp-44]
push 0
push 28H
push ss
lea ax, -120[bp]
push ax
push 0
push 2
call dword ptr [bp-6]
add sp, 0cH
mov [bp-44], ax
mov [bp-42], dx
; map actual reply len -> [bp-48]
push 0
push 4
push ss
lea ax, -36[bp]
push ax
push 0
push 2
call dword ptr [bp-6]
add sp, 0cH
mov [bp-48], ax
mov [bp-46], dx
; call COMPAT via NIOS command 8
push word ptr [bp-46]
push word ptr [bp-48]
push word ptr [bp-42]
push word ptr [bp-44]
push 0
push 2
push word ptr [bp-38]
push word ptr [bp-40]
push 0
push 2
push 0
push 57H
push 0
push 0
push word ptr [bp+8]
push word ptr [bp+6]
push 0
push 8
push word ptr [bp-12]
push word ptr [bp-14]
call dword ptr [bp-10]
add sp, 28H
mov [bp-52], ax
mov [bp-50], dx
; unlock important mappings only; ignore return
push 0
push 4
push word ptr [bp-46]
push word ptr [bp-48]
push 0
push 3
call dword ptr [bp-6]
add sp, 0cH
push 0
push 28H
push word ptr [bp-42]
push word ptr [bp-44]
push 0
push 3
call dword ptr [bp-6]
add sp, 0cH
push 0
push 28H
push word ptr [bp-38]
push word ptr [bp-40]
push 0
push 3
call dword ptr [bp-6]
add sp, 0cH
jmp short raw_store
raw_fail:
mov word ptr [bp-14], 0
mov word ptr [bp-12], 0
mov word ptr [bp-52], 0ffffH
mov word ptr [bp-50], 0ffffH
mov word ptr [bp-36], 0
mov word ptr [bp-34], 0
raw_store:
les di, dword ptr [bp+22H]
mov ax, [bp-2]
mov es:[di+0], ax
mov ax, [bp-6]
mov es:[di+2], ax
mov ax, [bp-4]
mov es:[di+4], ax
mov ax, [bp-10]
mov es:[di+6], ax
mov ax, [bp-8]
mov es:[di+8], ax
mov ax, [bp-14]
mov es:[di+10], ax
mov ax, [bp-12]
mov es:[di+12], ax
mov ax, [bp-52]
mov es:[di+14], ax
mov ax, [bp-50]
mov es:[di+16], ax
mov ax, [bp-36]
mov es:[di+18], ax
mov ax, [bp-34]
mov es:[di+20], ax
pop di
pop si
pop es
pop ds
mov sp, bp
pop bp
xor ah, ah
ret
raw_name db 'COMPATNcpRequestReply',0
_ncp_raw_request endp
end

47
ncp.h Normal file
View File

@@ -0,0 +1,47 @@
/*
* 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: C declarations for low-level NetWare requester and Client32 transport assembly glue.
* Depends on: ncp.asm for Open Watcom builds, ncpcall.c transport helpers, and net.h for shared types.
*/
#ifndef NCP_H
#define NCP_H
#if defined(__WATCOMC__)
#define NCP_CALL _Cdecl
#else
#define NCP_CALL
#endif
extern int NCP_CALL Net_Call(UI func, void *req, void *repl);
extern int NCP_CALL ncp_mapvar_request(UI specLen, UI flag, void *outbuf);
extern int NCP_CALL ncp_openref_request(UI refLo, UI refHi, void *outbuf);
extern int NCP_CALL ncp_raw_request(UI connLo, UI connHi,
void *hdr, UI hdrLen,
void *path, UI pathLen,
void *rep0, UI rep0Len,
void *rep1, UI rep1Len,
void *outbuf);
#undef NCP_CALL
#endif /* NCP_H */

1927
ncpapi.c Normal file

File diff suppressed because it is too large Load Diff

202
ncpapi.h Normal file
View File

@@ -0,0 +1,202 @@
/*
* mars-nwe-dosutils - NetWare/DOS utility tools.
*
* Copyright (C) 2026 Mario Fetka
*
* 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: Public declarations for namespace and file-system NCP API helpers.
* Depends on: net.h data types and ncpapi.c implementation.
*/
/* ncpapi.h - NetWare/NCP protocol API helpers for mars-dosutils */
#ifndef NCPAPI_H
#define NCPAPI_H
UI ncp_build_handle_path(uint8 *buf, uint8 dhandle,
uint16 dirbase, uint8 style,
int count,
const char *c1, const char *c2, const char *c3);
UI ncp_build_handle_path_from_dos_path(uint8 *buf, uint8 dhandle,
uint16 dirbase, uint8 style,
const char *dospath);
int ncp_get_requester_handle(uint16 *handle_lo, uint16 *handle_hi);
typedef struct ncp_file_handle6 {
uint8 h[6];
} NCP_FILE_HANDLE6;
#define NCP_OC_MODE_OPEN 0x01
#define NCP_OC_MODE_TRUNCATE 0x02
#define NCP_OC_MODE_CREATE 0x08
#define NCP_DAR_READ 0x0001
#define NCP_DAR_WRITE 0x0002
#define NCP_DAR_DENY_READ 0x0004
#define NCP_DAR_DENY_WRITE 0x0008
#define NCP_DAR_COMPAT 0x0010
int ncp87_01_open_create_entry(const char *path_name,
uint16 dir_handle,
uint8 open_create_mode,
uint32 create_attrs,
uint16 desired_access,
uint16 search_attrs,
NCP_FILE_HANDLE6 *handle_out,
uint32 *file_size_out,
uint8 *open_create_action_out,
uint16 *actual_out,
uint16 *handle_lo_out,
uint16 *handle_hi_out);
int ncp74_file_server_copy(const NCP_FILE_HANDLE6 *src,
const NCP_FILE_HANDLE6 *dst,
uint32 src_offset,
uint32 dst_offset,
uint32 count,
uint32 *copied_out);
int ncp66_close_file(const NCP_FILE_HANDLE6 *handle);
int ncp87_06_obtain_rim_attributes(const char *name,
uint16 dir_handle,
uint32 *attr_out,
uint16 *actual_out,
uint16 *handle_lo_out,
uint16 *handle_hi_out);
typedef struct ncp_dos_modify_info {
uint32 attributes;
uint16 creation_time;
uint16 creation_date;
uint32 creator_id;
uint16 modify_time;
uint16 modify_date;
uint32 modifier_id;
uint16 last_access_date;
uint16 archive_time;
uint16 archive_date;
uint32 archiver_id;
uint16 inherited_rights;
uint32 maximum_space;
} NCP_DOS_MODIFY_INFO;
typedef struct ncp_ndir_info {
uint32 space_allocated;
uint32 attributes;
uint16 flags;
uint32 data_size;
uint32 total_size;
uint16 number_of_streams;
uint16 creation_time;
uint16 creation_date;
uint32 creator_id;
uint16 modify_time;
uint16 modify_date;
uint32 modifier_id;
uint16 last_access_date;
uint16 archive_time;
uint16 archive_date;
uint32 archiver_id;
uint16 inherited_rights;
uint32 dir_ent_num;
uint32 dos_dir_num;
uint32 vol_number;
uint32 ea_data_size;
uint32 ea_key_count;
uint32 ea_key_size;
uint32 ns_creator;
uint8 name_len;
char name[256];
} NCP_NDIR_INFO;
int ncp87_06_obtain_ndir_info(const char *path_name,
uint16 dir_handle,
NCP_NDIR_INFO *info_out,
uint16 *actual_out,
uint16 *handle_lo_out,
uint16 *handle_hi_out);
int ncp87_07_modify_dos_attributes(char *name,
uint16 dir_handle,
uint32 attrs,
uint16 *actual_out,
uint16 *handle_lo_out,
uint16 *handle_hi_out);
int ncp87_07_modify_dos_info(const char *name,
uint16 dir_handle,
uint32 change_mask,
NCP_DOS_MODIFY_INFO *info,
uint16 *actual_out,
uint16 *handle_lo_out,
uint16 *handle_hi_out);
int ncp87_1d_get_effective_rights(const char *path,
uint16 dir_handle,
uint16 *rights_out,
uint16 *actual_out,
uint16 *handle_lo_out,
uint16 *handle_hi_out);
int ncp87_1d_get_effective_rights_by_dirent(uint8 vol_number,
uint32 dos_dir_number,
uint16 *rights_out,
uint16 *actual_out,
uint16 *handle_lo_out,
uint16 *handle_hi_out);
int ncp87_0a_add_trustee_rights(const char *path_name,
uint16 dir_handle,
uint32 object_id,
uint16 rights,
uint16 rights_mask,
uint16 *actual_out,
uint16 *handle_lo_out,
uint16 *handle_hi_out);
int ncp22_27_set_trustee_rights(const char *path_name,
uint16 dir_handle,
uint32 object_id,
uint16 rights);
int ncp22_2b_delete_trustee_rights(const char *path_name,
uint16 dir_handle,
uint32 object_id);
int ncp87_05_find_trustee_rights(const char *path_name,
uint16 dir_handle,
uint32 object_id,
uint16 *rights_out,
uint16 *actual_out,
uint16 *handle_lo_out,
uint16 *handle_hi_out);
int ncp87_0b_delete_trustee_rights(const char *path_name,
uint16 dir_handle,
uint32 object_id,
uint16 *actual_out,
uint16 *handle_lo_out,
uint16 *handle_hi_out);
#endif

609
ncpcall.c
View File

@@ -1,388 +1,269 @@
/* ncpcall.c 14-Mar-96 */ /*
* 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/>.
*/
/**************************************************************** /*
* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany * * Purpose: Low-level NCP requester and Client32 transport helpers for the NetWare DOS tools.
****************************************************************/ * Depends on: net.h, ncpapi.h, netcall.c requester glue, and ncp.asm/doc/kern.asm Net_Call/Client32 request entry points.
*
* The public ncpXX_YY_* protocol wrappers live in ncpapi.c. This file keeps
* the lower-level requester/transport helpers used by those API wrappers.
*/
#include "net.h" #include "net.h"
#include "ncpapi.h"
/* ---------------- 0x16 ----------------------------------- */ /* Client32 raw requester transport helpers used by the NCP API wrappers. */
int ncp_16_02(int dirhandle,
uint8 *path,
int *sub_dir,
uint8 *resultpath,
uint32 *creattime,
uint32 *owner_id)
/* returns max. rights or -1 if failed */ /*
* ncp_build_handle_path
*
* Purpose:
* Builds the Client32-compatible NWHandlePathStruct used by NCP87 request
* wrappers when the caller already has one to three path components.
*
* Parameters:
* dhandle/dirbase/style describe the starting directory context. c1..c3
* are written as length-prefixed path components.
*
* Returns:
* Number of bytes used by the path structure.
*/
UI ncp_build_handle_path(uint8 *buf, uint8 dhandle,
uint16 dirbase, uint8 style,
int count,
const char *c1, const char *c2, const char *c3)
{ {
struct { uint8 *p;
uint16 len; int l;
uint8 func; UI used;
uint8 dirhandle;
uint8 sub_dir[2]; /*
uint8 pathlen; * DeveloperNet/ncpdos16 path structure used by NCP87/S6 through
uint8 path[256]; * Client32 COMPATNcpRequestReply.
} req; *
struct { * This is the exact shape verified by TESTS NCP87C32AUTO:
uint16 len; * 00 02 00 00 00 00 01 09 4C 4F 47 49 4E 2E 45 58 45
uint8 sub_dir_name[16]; *
uint8 create_date_time[4]; * Meaning:
uint8 owner_id[4]; /* HI LOW */ * word[1] = short dir handle
uint8 max_right_mask; * word[3] = dir base
uint8 reserved; /* Reserved by Novell */ * byte[5] = dirstyle
uint8 sub_dir_nmbr[2]; /* HI LOW */ * byte[6] = component count
} repl = { sizeof(repl) - sizeof(uint16) }; * then len/name components
req.func = 0x02; *
U16_TO_BE16((sub_dir) ? *sub_dir : 1, req.sub_dir); * The old/simple struct used by the INT 21h F257 fallback is not accepted
req.dirhandle = (uint8) dirhandle; * by this Client32 path.
req.pathlen = (uint8) ((path) ? strlen(path) : 0); */
req.len = 5 + req.pathlen; memset(buf, 0, 0x140);
strmaxcpy(req.path, path, req.pathlen);
neterrno = Net_Call(0xE200, &req, &repl); if (dhandle) {
if (neterrno) return(-1); tool_put_word_lh(buf + 1, (uint16)dhandle);
if (resultpath) strmaxcpy(resultpath, repl.sub_dir_name, 16); tool_put_word_lh(buf + 3, dirbase);
if (sub_dir) *sub_dir = GET_BE16(repl.sub_dir_nmbr); buf[5] = style;
if (creattime) *creattime = GET_BE32(repl.create_date_time); } else {
if (owner_id) *owner_id = GET_BE32(repl.owner_id); buf[5] = 0xff;
return((int) repl.max_right_mask);
} }
/* ---------------- 0x17 ----------------------------------- */ p = buf + 6;
int ncp_17_02(int module, int debuglevel) *p++ = (uint8)count;
/* debuglevel fuer module setzen */
{ if (count > 0 && c1) {
struct { l = strlen(c1);
uint16 len; if (l > 255) l = 255;
uint8 func; *p++ = (uint8)l;
uint8 module; memcpy(p, c1, l);
uint8 debug; p += l;
} req = { sizeof(req) - sizeof(uint16) };
struct {
uint16 len;
uint8 olddebug;
} repl = { sizeof(repl) - sizeof(uint16) };
req.func = 0x2;
req.module = (uint8) module;
req.debug = (uint8) debuglevel;
neterrno = Net_Call(0xE300, &req, &repl);
if (neterrno) return(-1);
return((int) repl.olddebug);
} }
int ncp_17_14(uint8 *objname, uint16 objtyp, uint8 *password) if (count > 1 && c2) {
/* login unencreypted */ l = strlen(c2);
{ if (l > 255) l = 255;
struct { *p++ = (uint8)l;
uint16 len; memcpy(p, c2, l);
uint8 func; p += l;
uint8 typ[2];
uint8 namlen;
uint8 buff[48+1+128];
} req;
struct {
uint16 len;
} repl= { 0 };
uint8 *p=req.buff;
req.func = 0x14;
U16_TO_BE16(objtyp, req.typ);
req.namlen = min(47, strlen(objname));
memcpy(p, objname, req.namlen);
p += req.namlen;
*p = (uint8) min(128, strlen(password));
req.len = 4 + req.namlen + 1 + *p;
memcpy(p+1, password, (int) *p);
neterrno = Net_Call(0xE300, &req, &repl);
if (neterrno) return(-1);
return(0);
} }
int ncp_17_17(uint8 *key) if (count > 2 && c3) {
/* get crypt key */ l = strlen(c3);
{ if (l > 255) l = 255;
struct { *p++ = (uint8)l;
uint16 len; memcpy(p, c3, l);
uint8 func; p += l;
} req;
struct {
uint16 len;
uint8 key[8];
} repl;
req.len = 1;
req.func = 0x17;
repl.len = 8;
neterrno = Net_Call(0xE300, &req, &repl);
if (neterrno) return(-1);
else {
memcpy(key, repl.key, 8);
return(0);
}
} }
int ncp_17_18(uint8 *cryptkey, uint8 *objname, uint16 objtyp) used = (UI)(p - buf);
/* keyed login */ tool_put_word_lh(buf + 0x13c, used);
{ return(used);
struct {
uint16 len;
uint8 func;
uint8 key[8];
uint8 typ[2];
uint8 namlen;
uint8 name[48];
} req;
struct {
uint16 len;
} repl={ 0 };
req.len = sizeof(req) - sizeof(uint16);
req.func = 0x18;
U16_TO_BE16(objtyp, req.typ);
req.namlen = min(sizeof(req.name), strlen(objname));
memcpy(req.key, cryptkey, 8);
memcpy(req.name, objname, (int) req.namlen);
neterrno = Net_Call(0xE300, &req, &repl);
if (neterrno) return(-1);
return(0);
} }
uint32 ncp_17_35(uint8 *objname, uint16 objtyp)
/* get bindery object id */ /*
* ncp_build_handle_path_from_dos_path
*
* Purpose:
* Converts a DOS-style path string into the Client32-compatible
* NWHandlePathStruct used by the NCP87 wrappers.
*
* Notes:
* Drive prefixes, leading slashes and simple current-directory components
* are skipped so tool callers can pass ordinary DOS paths.
*/
UI ncp_build_handle_path_from_dos_path(uint8 *buf, uint8 dhandle,
uint16 dirbase, uint8 style,
const char *dospath)
{ {
struct { uint8 *p;
uint16 len; uint8 *countp;
uint8 func; int count = 0;
uint8 typ[2]; const char *s;
uint8 namlen; UI used;
uint8 name[48];
} req; memset(buf, 0, 0x140);
struct {
uint16 len; if (dhandle) {
uint8 object_id[4]; tool_put_word_lh(buf + 1, (uint16)dhandle);
uint8 object_type[2]; tool_put_word_lh(buf + 3, dirbase);
uint8 object_name[48]; buf[5] = style;
} repl; } else {
req.len = sizeof(req) - sizeof(uint16); buf[5] = 0xff;
repl.len = sizeof(repl) - sizeof(uint16);
req.func = 0x35;
U16_TO_BE16(objtyp, req.typ);
req.namlen = min(sizeof(req.name), strlen(objname));
memcpy(req.name, objname, (int) req.namlen);
neterrno = Net_Call(0xE300, &req, &repl);
if (neterrno) return(0L);
strmaxcpy(objname, repl.object_name, 47);
return(GET_BE32(repl.object_id));
} }
int ncp_17_36(uint32 obj_id, uint8 *objname, uint16 *objtyp) p = buf + 6;
/* get bindery object name */ countp = p++;
s = dospath;
if (!s) s = "";
/*
* DOS tools mostly pass relative paths against the current directory
* handle. Accept simple DOS decoration here so RIGHTS can pass "." or
* ".\\UDIR\\FILE" without constructing path components in the caller.
*/
if (s[0] && s[1] == ':')
s += 2;
while (*s == '\\' || *s == '/')
s++;
while (*s && p < buf + 0x138 && count < 32) {
const char *start;
int len;
while (*s == '\\' || *s == '/')
s++;
if (*s == '.'
&& (s[1] == '\0' || s[1] == '\\' || s[1] == '/')) {
s++;
continue;
}
start = s;
while (*s && *s != '\\' && *s != '/')
s++;
len = (int)(s - start);
if (len <= 0)
continue;
if (len > 255)
len = 255;
if (p + 1 + len >= buf + 0x138)
break;
*p++ = (uint8)len;
memcpy(p, start, len);
p += len;
count++;
}
*countp = (uint8)count;
used = (UI)(p - buf);
tool_put_word_lh(buf + 0x13c, used);
return(used);
}
/*
* Current verified Client32 path for mars-nwe DOS utilities:
*
* ncp_mapvar_request(4,0) -> connRefLocal FFFF:FFFE
* ncp_openref_request(connRefLocal) -> Client32 handle, e.g. 0101:0001
*
* ncp_mapvar_request currently contains the confirmed Mars server-name scan
* shape. It is intentionally kept small and isolated here so FLAG and later
* tools do not carry the old exploratory tests.
*/
/*
* ncp_get_requester_handle
*
* Purpose:
* Resolves the active MARS/NetWare connection into the Client32 NCP handle
* used by the raw requester path.
*
* Requester path:
* ncp_mapvar_request followed by ncp_openref_request.
*
* Returns:
* 0 on success. Non-zero values indicate that the connection reference or
* Client32 NCP handle could not be obtained.
*/
int ncp_get_requester_handle(uint16 *handle_lo, uint16 *handle_hi)
{ {
struct { uint8 mapout[32];
uint16 len; uint8 openout[32];
uint8 func; uint16 map_ret_ax, map_ret_dx;
uint8 id[4]; uint16 cref_lo, cref_hi;
} req; uint16 open_ret_ax, open_ret_dx;
struct {
uint16 len; if (!handle_lo || !handle_hi)
uint8 object_id[4]; return(1);
uint8 object_type[2];
uint8 object_name[48]; *handle_lo = 0;
} repl; *handle_hi = 0;
req.len = sizeof(req) - sizeof(uint16);
repl.len = sizeof(repl) - sizeof(uint16); memset(mapout, 0, sizeof(mapout));
req.func = 0x36; ncp_mapvar_request(4, 0, mapout);
U32_TO_BE32(obj_id, req.id);
neterrno = Net_Call(0xE300, &req, &repl); map_ret_ax = tool_get_word_lh(mapout + 14);
if (neterrno) return(-1); map_ret_dx = tool_get_word_lh(mapout + 16);
if (objname) strmaxcpy(objname, repl.object_name, 47); cref_lo = tool_get_word_lh(mapout + 22);
if (objtyp) *objtyp = GET_BE16(repl.object_type); cref_hi = tool_get_word_lh(mapout + 24);
if (map_ret_ax != 0 || map_ret_dx != 0 || (cref_lo == 0 && cref_hi == 0))
return(2);
memset(openout, 0, sizeof(openout));
ncp_openref_request(cref_lo, cref_hi, openout);
open_ret_ax = tool_get_word_lh(openout + 14);
open_ret_dx = tool_get_word_lh(openout + 16);
*handle_lo = tool_get_word_lh(openout + 18);
*handle_hi = tool_get_word_lh(openout + 20);
if (open_ret_ax != 0 || open_ret_dx != 0 || (*handle_lo == 0 && *handle_hi == 0))
return(3);
return(0); return(0);
} }
int ncp_17_40(uint8 *objname, uint16 objtyp,
uint8 *password, uint8 *newpassword)
/* change password unencreypted */
{
struct {
uint16 len;
uint8 func;
uint8 typ[2];
uint8 namlen;
uint8 buff[48+1+128+1+128];
} req;
struct {
uint16 len;
} repl = { 0 };
uint8 *p=req.buff;
req.func = 0x40;
U16_TO_BE16(objtyp, req.typ);
req.namlen = min(47, strlen(objname));
memcpy(p, objname, req.namlen);
p += req.namlen;
*p = (uint8) min(128, strlen(password));
req.len = 4 + req.namlen + 1 + *p;
memcpy(p+1, password, (int) *p);
p += (1 + *p);
*p = (uint8) min(128, strlen(newpassword));
req.len += (1 + *p);
memcpy(p+1, newpassword, (int) *p);
neterrno = Net_Call(0xE300, &req, &repl);
if (neterrno) return(-1);
return(0);
}
int ncp_14_46(uint32 *obj_id)
/* get bindery access level & actual ID */
{
struct {
uint16 len;
uint8 func;
} req;
struct {
uint16 len;
uint8 access;
uint8 id[4];
} repl;
req.len = 1;
req.func = 0x46;
repl.len = 5;
neterrno = Net_Call(0xE300, &req, &repl);
if (neterrno) return(-1);
else {
if (obj_id) *obj_id = GET_BE32(repl.id);
return(repl.access);
}
}
int ncp_17_4b(uint8 *cryptkey, uint8 *objname, uint16 objtyp,
int passwx, uint8 *newpassword)
/* keyed change password */
{
struct {
uint16 len;
uint8 func;
uint8 key[8];
uint8 typ[2];
uint8 namlen;
uint8 buff[48+1+16];
} req;
struct {
uint16 len;
} repl = { 0 };
uint8 *p = req.buff;
req.func = 0x4b;
memcpy(req.key, cryptkey, 8);
U16_TO_BE16(objtyp, req.typ);
req.namlen = (uint8) min(48, strlen(objname));
req.len = 12 + req.namlen + 1 + 16;
memcpy(p, objname, (int) req.namlen);
p += req.namlen;
*p++ = (uint8) passwx;
memcpy(p, newpassword, 16);
neterrno = Net_Call(0xE300, &req, &repl);
if (neterrno) return(-1);
return(0);
}
int ncp_17_37(uint32 last_id, uint16 objtyp, uint8 *pattern,
BINDERY_OBJECT *target)
/* scan bindery object */
{
struct {
uint16 len;
uint8 func;
uint8 last_id[4];
uint8 typ[2];
uint8 patlen;
uint8 pattern[48];
} req;
struct {
uint16 len;
uint8 object_id[4];
uint8 object_type[2];
uint8 object_name[48];
uint8 object_flags;
uint8 object_security;
uint8 object_has_prop;
} repl;
int patlen = (pattern) ? min(48, strlen(pattern)) : 1;
memset(&req, 0, sizeof(req));
memset(&repl, 0, sizeof(repl));
req.func = 0x37;
U32_TO_BE32(last_id, req.last_id);
U16_TO_BE16(objtyp, req.typ);
req.patlen = (uint8)patlen;
if (pattern) memcpy(req.pattern, pattern, patlen);
else req.pattern[0] = '*';
req.len = 8 + patlen;
repl.len = sizeof(repl) - sizeof(uint16);
neterrno = Net_Call(0xE300, &req, &repl);
if (neterrno) return(-1);
if (target) {
target->object_id = GET_BE32(repl.object_id);
target->object_type = GET_BE16(repl.object_type);
memcpy(target->object_name, repl.object_name, 48);
target->object_name[48] = '\0';
deb(target->object_name);
target->object_flags = repl.object_flags;
target->object_security = repl.object_security;
target->object_has_prop = repl.object_has_prop;
}
return(0);
}
int ncp_17_3d(uint16 objtyp, uint8 *objname, int segment,
uint8 *propname, NW_PROPERTY *target)
/* read bindery property value */
{
struct {
uint16 len;
uint8 func;
uint8 typ[2];
uint8 buff[1+48+1+1+16];
} req;
struct {
uint16 len;
uint8 value[128];
uint8 more_flag;
uint8 property_flag;
} repl;
uint8 *p = req.buff;
int objlen = min(48, strlen(objname));
int proplen = min(16, strlen(propname));
memset(&req, 0, sizeof(req));
memset(&repl, 0, sizeof(repl));
req.func = 0x3d;
U16_TO_BE16(objtyp, req.typ);
*p++ = (uint8)objlen;
memcpy(p, objname, objlen);
p += objlen;
*p++ = (uint8)segment;
*p++ = (uint8)proplen;
memcpy(p, propname, proplen);
req.len = 6 + objlen + proplen;
repl.len = sizeof(repl) - sizeof(uint16);
neterrno = Net_Call(0xE300, &req, &repl);
if (neterrno) return(-1);
if (target) {
memcpy(target->value, repl.value, 128);
target->more_flag = repl.more_flag;
target->property_flag = repl.property_flag;
}
return(0);
}

1210
ndir.c Normal file

File diff suppressed because it is too large Load Diff

115
net.c
View File

@@ -1,10 +1,29 @@
/* net.c */ /*
#define VERS_DATE "21-May-96" * mars-nwe-dosutils - NetWare/DOS utility tools.
/* simple client program to act with mars_nwe */ *
* 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/>.
*/
/**************************************************************** /*
* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany * * Purpose: NET multicall front-end and command dispatcher for the DOS utility collection.
****************************************************************/ * Depends on: net.h plus command modules such as login.c, map.c, flag.c, ndir.c, trustee.c, tools.c and netcall.c.
*/
#define VERS_DATE "21-May-96"
#include "net.h" #include "net.h"
@@ -13,6 +32,27 @@ char prgpath[65];
typedef int (*NET_FUNC)(int argc, char *argv[], int mode); typedef int (*NET_FUNC)(int argc, char *argv[], int mode);
/*
* net_functions
*
* Purpose:
* Maps NET subcommands and stand-alone multicall executable names to their
* implementation function. The same binary can be invoked either as NET
* with the command name in argv[1], or through a renamed/stub executable
* where argv[0] already contains the command name.
*
* Fields:
* name - uppercase command or alias name used for dispatch.
* description - short text shown by the built-in usage listing.
* func - command implementation entry point.
* mode - small command-specific selector passed to shared handlers.
*
* Notes:
* NCOPY is intentionally kept out of this table while the NCP74
* server-side copy/open-handle path is still under investigation. Keeping
* ncopy.c in the build makes it compile-tested, but removing the table entry
* prevents accidental execution through NET/Multicall dispatch.
*/
static struct s_net_functions { static struct s_net_functions {
char *name; char *name;
char *description; char *description;
@@ -34,7 +74,19 @@ static struct s_net_functions {
{"PATHDEL","removes search path" , func_path , 1}, {"PATHDEL","removes search path" , func_path , 1},
{"PATHINS","insert search path" , func_path , 2}, {"PATHINS","insert search path" , func_path , 2},
{"LOGOUT", "logout from server", func_logout , 0}, {"LOGOUT", "logout from server", func_logout , 0},
{"FLAG", "display or modify file attributes", func_flag , 0},
{"FLAGDIR","display or modify directory attributes",func_flagdir, 0},
{"GRANT", "grant trustee rights", func_grant , 0},
{"REVOKE", "revoke trustee rights", func_revoke , 0},
{"REMOVE", "remove trustee", func_remove , 0},
{"NDIR", "list directory contents", func_ndir , 0},
{"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}, {"SLIST", "list servers", func_slist , 0},
{"WHOAMI", "show current NetWare user", func_whoami , 0},
#if 0 /* NCOPY disabled: unsafe/open server-side-copy work-in-progress. */
{"NCOPY", "copy files", func_ncopy , 0},
#endif
{"PASSWD", "change password", func_passwd , 0}, {"PASSWD", "change password", func_passwd , 0},
#if 1 #if 1
{"TESTS", "only testroutines!", func_tests , 0}, {"TESTS", "only testroutines!", func_tests , 0},
@@ -44,6 +96,18 @@ static struct s_net_functions {
#define MAX_FUNCS (sizeof(net_functions) / sizeof(struct s_net_functions)) #define MAX_FUNCS (sizeof(net_functions) / sizeof(struct s_net_functions))
/*
* get_entry_nr
*
* Purpose:
* Resolves a DOS program path or command token to an entry in the NET
* dispatch table. The basename is extracted, an optional extension is
* removed, and the result is uppercased before it is compared with the
* registered command names.
*
* Returns:
* The net_functions[] index on match, or -1 if the token is not registered.
*/
static int get_entry_nr(char *fstr) static int get_entry_nr(char *fstr)
{ {
int entry = MAX_FUNCS; int entry = MAX_FUNCS;
@@ -62,6 +126,24 @@ static int get_entry_nr(char *fstr)
return(-1); return(-1);
} }
/*
* call_func_entry
*
* Purpose:
* Attempts to dispatch argv[0] to a registered NET command. This supports
* both stand-alone multicall-style invocations and the second pass from
* main(), where argv is shifted so that NET subcommands are dispatched as if
* they were executable names.
*
* Notes:
* Most commands require IPX/requester initialization before they run. MAP is
* allowed to run without a successful ipx_init() so it can report existing
* mapping state and requester-related errors in the traditional utility
* style.
*
* Returns:
* The command result, or -0xff when no matching command was found.
*/
int call_func_entry(int argc, char *argv[]) int call_func_entry(int argc, char *argv[])
{ {
int funcmode; int funcmode;
@@ -83,6 +165,14 @@ int call_func_entry(int argc, char *argv[])
return(result); return(result);
} }
/*
* get_path
*
* Purpose:
* Stores the directory part of argv[0] in the global prgpath buffer. Some
* command handlers use this to locate companion files or command scripts
* relative to the NET executable.
*/
static void get_path(char *path) static void get_path(char *path)
{ {
char buf[100]; char buf[100];
@@ -91,6 +181,19 @@ static void get_path(char *path)
get_path_fn(buf, prgpath, NULL); get_path_fn(buf, prgpath, NULL);
} }
/*
* main
*
* Purpose:
* NET multicall entry point. First try to dispatch by argv[0], which handles
* renamed/stub executables such as FLAG.EXE or NDIR.EXE. If that fails, try
* again with argv shifted by one so "NET FLAG ..." and similar command
* forms work through the same dispatch table.
*
* Returns:
* The selected command's return code. If no command matches, print the
* built-in usage list and return the not-found result.
*/
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
int result = -0xff; int result = -0xff;

BIN
net.exe

Binary file not shown.

128
net.h
View File

@@ -1,8 +1,27 @@
/* net.h: 20-May-96 */ /*
* 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/>.
*/
/**************************************************************** /*
* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany * * Purpose: Shared public header for the DOS utility collection: types, prototypes and common structures.
****************************************************************/ * Depends on: ipx.h, ncp.h, all command modules, netcall.c, ncpcall.c, tools.c and ncpapi.c.
*/
#include <stddef.h> #include <stddef.h>
#include <stdlib.h> #include <stdlib.h>
@@ -17,6 +36,7 @@
#include <stdarg.h> #include <stdarg.h>
#ifdef __WATCOMC__ #ifdef __WATCOMC__
#include <direct.h> #include <direct.h>
extern int tool_page_line(int *line_count, int *continuous);
#endif #endif
typedef unsigned int UI; typedef unsigned int UI;
@@ -33,35 +53,9 @@ typedef void (*FUNC_VOID)();
typedef int (*FUNC_INT)(); typedef int (*FUNC_INT)();
typedef struct { #include "ipx.h"
uint8 checksum[2]; #include "ncp.h"
uint16 packetlen;
uint8 tcontrol;
uint8 ptype;
uint8 dest_net[4];
uint8 dest_node[6];
uint16 dest_sock; /* HI LOW */
uint8 source_net[4];
uint8 source_node[6];
uint16 source_sock; /* HI LOW */
} IPX_HEADER;
typedef struct {
uint8 *link_address;
FUNC_VOID esr_routine;
uint8 in_use_flag;
uint8 completition_code;
uint16 socket; /* HI LOW */
uint8 ipx_workspace[4]; /* interner Gebrauch */
uint8 drv_workspace[4]; /* interner Gebrauch */
uint8 immediate_address[6]; /* HI LOW Node Address */
uint16 fragment_count; /* Anzahl Fragment Buffers */
uint8 *fragment_1;
uint16 fragment_1_size;
/* K<>nnen auch mehr sein */
} ECB;
#include "kern.h"
#define UI2NET(i) ( ( (i) << 8) | ( ((i)>>8) & 0xFF) ) #define UI2NET(i) ( ( (i) << 8) | ( ((i)>>8) & 0xFF) )
#define NET2UI(i) ( ( (i) << 8) | ( ((i)>>8) & 0xFF) ) #define NET2UI(i) ( ( (i) << 8) | ( ((i)>>8) & 0xFF) )
@@ -145,6 +139,38 @@ extern uint8 *upstr(uint8 *s);
extern void korrpath(char *s); extern void korrpath(char *s);
extern void get_path_fn(char *s, char *p, char *fn); extern void get_path_fn(char *s, char *p, char *fn);
/* Shared DOS utility helpers. Keep command frontends small so the
* historical multicall net.exe can later be split into smaller groups. */
extern void tool_put_word_lh(uint8 *p, uint16 v);
extern void tool_put_dword_lh(uint8 *p, uint32 v);
extern uint16 tool_get_word_lh(uint8 *p);
extern uint32 tool_get_dword_lh(uint8 *p);
extern void tool_put_word_hl(uint8 *p, uint16 v);
extern void tool_put_dword_hl(uint8 *p, uint32 v);
extern uint16 tool_get_word_hl(uint8 *p);
extern uint32 tool_get_dword_hl(uint8 *p);
extern int tool_copy_ncp22_name(uint8 *dst, char *src, uint8 *len_out);
extern int tool_strsame(char *a, char *b);
extern int tool_is_help_arg(char *s);
extern int tool_is_option(char *s);
extern int tool_is_files_option(char *s);
extern int tool_is_subdirs_option(char *s);
extern int tool_get_current_drive(void);
extern int tool_current_dhandle(uint8 *connid, uint8 *dhandle);
extern int tool_current_dhandle_only(uint8 *dhandle);
extern int tool_current_prefix(char *out, int max);
extern int tool_is_current_path(char *path);
extern int tool_path_is_dir(char *path);
extern void tool_upcopy(char *dst, char *src, int max);
extern void tool_basename(char *dst, char *src, int max);
extern void tool_header_path(char *out, char *path, int max);
extern int tool_is_dot_dir(char *name);
extern void tool_join_path(char *out, char *base, char *name, int max);
extern int tool_has_wildcards(char *path);
extern void tool_parent_path(char *dst, char *src, int max);
extern void tool_parent_pattern(char *dir, char *pattern, char *path,
int maxdir, int maxpat);
#define reb(s) deb((s)),leb((s)) #define reb(s) deb((s)),leb((s))
extern void deb(uint8 *s); extern void deb(uint8 *s);
@@ -204,25 +230,25 @@ extern int get_volume_name(uint8 nr, char *name);
extern int get_search_drive_vektor(SEARCH_VECTOR_ENTRY *vec); extern int get_search_drive_vektor(SEARCH_VECTOR_ENTRY *vec);
extern int set_search_drive_vektor(SEARCH_VECTOR_ENTRY *vec); extern int set_search_drive_vektor(SEARCH_VECTOR_ENTRY *vec);
/********* ncpcall.h ***********/ /********* ncp.h ***********/
extern int ncp_16_02(int dirhandle, extern int ncp16_02_get_directory_entry(int dirhandle,
uint8 *path, uint8 *path,
int *sub_dir, int *sub_dir,
uint8 *resultpath, uint8 *resultpath,
uint32 *creattime, uint32 *creattime,
uint32 *owner_id); uint32 *owner_id);
extern int ncp_14_46(uint32 *obj_id); extern int ncp14_46_get_bindery_access_level(uint32 *obj_id);
extern int ncp_17_02(int module, int debuglevel); extern int ncp17_02_set_debug_level(int module, int debuglevel);
extern int ncp_17_14(uint8 *objname, uint16 objtyp, uint8 *password); extern int ncp17_14_login_object_unencrypted(uint8 *objname, uint16 objtyp, uint8 *password);
extern int ncp_17_17(uint8 *key); extern int ncp17_17_get_encryption_key(uint8 *key);
extern int ncp_17_18(uint8 *cryptkey, uint8 *objname, uint16 objtyp); extern int ncp17_18_keyed_object_login(uint8 *cryptkey, uint8 *objname, uint16 objtyp);
extern uint32 ncp_17_35(uint8 *objname, uint16 objtyp); extern uint32 ncp17_35_get_bindery_object_id(uint8 *objname, uint16 objtyp);
extern int ncp_17_36(uint32 obj_id, uint8 *objname, uint16 *objtyp); extern int ncp17_36_get_bindery_object_name(uint32 obj_id, uint8 *objname, uint16 *objtyp);
extern int ncp_17_40(uint8 *objname, uint16 objtyp, uint8 *password, extern int ncp17_40_change_password_unencrypted(uint8 *objname, uint16 objtyp, uint8 *password,
uint8 *newpassword); uint8 *newpassword);
extern int ncp_17_4b(uint8 *cryptkey, uint8 *objname, uint16 objtyp, extern int ncp17_4b_keyed_change_password(uint8 *cryptkey, uint8 *objname, uint16 objtyp,
int passwx, uint8 *newpassword); int passwx, uint8 *newpassword);
/* map.c */ /* map.c */
@@ -242,6 +268,8 @@ extern int read_command_file(char *fstr);
/* slist.c */ /* slist.c */
extern int func_slist (int argc, char *argv[], int mode); 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 */ /* nwdebug.c */
extern int func_debug (int argc, char *argv[], int mode); extern int func_debug (int argc, char *argv[], int mode);
@@ -252,9 +280,19 @@ extern int func_tests (int argc, char *argv[], int mode);
/* capture.c */ /* capture.c */
extern int func_capture(int argc, char *argv[], int mode); extern int func_capture(int argc, char *argv[], int mode);
/* flag.c */
extern int func_flag (int argc, char *argv[], int mode);
extern int func_flagdir(int argc, char *argv[], int mode);
extern int func_grant (int argc, char *argv[], int mode);
extern int func_revoke(int argc, char *argv[], int mode);
extern int func_remove(int argc, char *argv[], int mode);
extern int func_rights (int argc, char *argv[], int mode);
extern int func_creator(int argc, char *argv[], int mode);
extern int func_ncopy (int argc, char *argv[], int mode);
extern int ncp_17_37(uint32 last_id, uint16 objtyp, uint8 *pattern,
extern int ncp17_37_scan_bindery_object(uint32 last_id, uint16 objtyp, uint8 *pattern,
BINDERY_OBJECT *target); BINDERY_OBJECT *target);
extern int ncp_17_3d(uint16 objtyp, uint8 *objname, int segment, extern int ncp17_3d_read_property_value(uint16 objtyp, uint8 *objname, int segment,
uint8 *propname, NW_PROPERTY *target); uint8 *propname, NW_PROPERTY *target);

View File

@@ -1,8 +1,27 @@
/* netcall.c: 05-Apr-96 */ /*
* 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/>.
*/
/**************************************************************** /*
* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany * * Purpose: DOS/NetWare requester wrapper layer and environment helpers used by the utilities.
****************************************************************/ * Depends on: net.h, ipx.asm/ncp.asm low-level IPX and Net_Call glue, ncpcall.c high-level NCP helpers, tools.c shared utility routines.
*/
#include "net.h" #include "net.h"

BIN
netold.exe Executable file

Binary file not shown.

View File

@@ -1,3 +1,29 @@
/*
* 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: NetWare password obfuscation/encryption helper routines used by LOGIN/PASSWD.
* Depends on: nwcrypt.h public declarations and login.c caller.
*/
/*$********************************************************* /*$*********************************************************
$* $*
$* This code has been taken from DDJ 11/93, from an $* This code has been taken from DDJ 11/93, from an

View File

@@ -1,4 +1,28 @@
/* nwcrypt.h */ /*
* 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: Public declarations for NetWare password encryption helper routines.
* Depends on: nwcrypt.c implementation and login.c caller.
*/
extern void shuffle(unsigned char *lon, extern void shuffle(unsigned char *lon,
const unsigned char *buf, int buflen, const unsigned char *buf, int buflen,
unsigned char *target); unsigned char *target);

View File

@@ -1,8 +1,27 @@
/* nwdebug.c 21-May-96 */ /*
* 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/>.
*/
/**************************************************************** /*
* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany * * Purpose: NWDEBUG command implementation for changing/querying MARS-NWE debug settings.
****************************************************************/ * Depends on: net.h, netcall.c requester helpers, ncpcall.c NCP debug helper, tools.c shared utility routines.
*/
#include "net.h" #include "net.h"
@@ -28,7 +47,7 @@ int func_debug(int argc, char *argv[], int mode)
else return(usage()); else return(usage());
level = atoi(argv[2]); level = atoi(argv[2]);
if (level < 0 || level > 99) return(usage()); if (level < 0 || level > 99) return(usage());
result = ncp_17_02(module, level); result = ncp17_02_set_debug_level(module, level);
if (result < 0) { if (result < 0) {
fprintf(stderr, "set debug failed\n"); fprintf(stderr, "set debug failed\n");
fprintf(stderr, "perhaps you did not enable FUNC_17_02_IS_DEBUG\n"); fprintf(stderr, "perhaps you did not enable FUNC_17_02_IS_DEBUG\n");

2736
nwtests.c

File diff suppressed because it is too large Load Diff

304
remove.c Normal file
View File

@@ -0,0 +1,304 @@
/*
* mars-nwe-dosutils - NetWare/DOS utility tools.
*
* Copyright (C) 2026 Mario Fetka
*
* 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: REMOVE utility for removing trustee rights from NetWare directories and files.
* Depends on: net.h, ncpapi.h, trustee.h/trustee.c trustee helpers, netcall.c requester helpers, tools.c shared utility routines.
*/
#include "net.h"
#include "ncpapi.h"
#include "trustee.h"
#include <sys/types.h>
#include <sys/stat.h>
#ifndef _A_NORMAL
#define _A_NORMAL 0x00
#endif
static int remove_last_rc = 0;
static void remove_usage(void)
{
fprintf(stdout, "\n");
fprintf(stdout, "Usage: REMOVE [USER | GROUP] name [FROM path] [option]\n");
fprintf(stdout, "Options: /Subdirs | /Files \n");
}
static void remove_usage_after_error(void)
{
fprintf(stdout, "\007\n");
fprintf(stdout, "Usage: REMOVE [USER | GROUP] name [FROM path] [option]\n");
fprintf(stdout, "Options: /Subdirs | /Files \n");
fprintf(stdout, "\n");
}
static int remove_one(char *path, uint16 dhandle, uint32 object_id,
uint16 objtype, char *objname, int forced_is_file)
{
uint16 old_rights = 0;
int is_dir;
int rc;
/* Without /FILES, Novell REMOVE reports directory-oriented messages even
* if the specified path cannot be located. */
is_dir = forced_is_file ? 0 : 1;
rc = ncp87_05_find_trustee_rights(path, dhandle, object_id, &old_rights,
NULL, NULL, NULL);
remove_last_rc = rc;
if (rc) {
if (rc == 0xff)
fprintf(stdout, "No trustee for the specified %s.\n", is_dir ? "directory" : "file");
else
fprintf(stdout, "Error scanning trustee list.\n");
return(1);
}
rc = ncp22_2b_delete_trustee_rights(path, dhandle, object_id);
if (rc)
rc = ncp87_0b_delete_trustee_rights(path, dhandle, object_id,
NULL, NULL, NULL);
remove_last_rc = rc;
if (rc) {
fprintf(stdout, "Error deleting trustee.\n");
return(1);
}
{
char header[300];
trustee_header_path(header, path, sizeof(header));
fprintf(stdout, "%s\n", header);
}
if (objtype == TRUSTEE_BINDERY_GROUP)
fprintf(stdout, "Group \"%s\" no longer a trustee to the specified %s.\n\n",
objname, is_dir ? "directory" : "file");
else
fprintf(stdout, "User \"%s\" no longer a trustee to the specified %s.\n\n",
objname, is_dir ? "directory" : "file");
return(0);
}
static int remove_subdirs_inner(char *path, uint16 dhandle, uint32 object_id,
uint16 objtype, char *objname, int *count,
int include_this)
{
struct find_t ff;
char pattern[260];
char child[260];
int rc = 0;
if (include_this) {
if (remove_one(path, dhandle, object_id, objtype, objname, 0) == 0)
(*count)++;
else
rc = 1;
}
tool_join_path(pattern, path, "*.*", sizeof(pattern));
if (_dos_findfirst(pattern, _A_SUBDIR, &ff) == 0) {
do {
if ((ff.attrib & _A_SUBDIR) && !tool_is_dot_dir(ff.name)) {
tool_join_path(child, path, ff.name, sizeof(child));
if (remove_subdirs_inner(child, dhandle, object_id, objtype, objname,
count, 1))
rc = 1;
}
} while (_dos_findnext(&ff) == 0);
}
return(rc);
}
static int remove_subdirs(char *path, uint16 dhandle, uint32 object_id,
uint16 objtype, char *objname, int *count)
{
/* Novell REMOVE /SUBDIRS affects the subdirectories under the specified
* start directory, not the start directory itself. */
return(remove_subdirs_inner(path, dhandle, object_id, objtype, objname,
count, 0));
}
static int remove_files(char *path, uint16 dhandle, uint32 object_id,
uint16 objtype, char *objname, int *count)
{
struct find_t ff;
char dir[260];
char pat[80];
char spec[260];
char target[260];
int rc = 0;
if (tool_path_is_dir(path)) {
strmaxcpy(dir, path, sizeof(dir) - 1);
strmaxcpy(pat, "*.*", sizeof(pat) - 1);
} else if (tool_has_wildcards(path)) {
tool_parent_pattern(dir, pat, path, sizeof(dir), sizeof(pat));
} else {
if (remove_one(path, dhandle, object_id, objtype, objname, 1) == 0)
(*count)++;
else
rc = 1;
return(rc);
}
tool_join_path(spec, dir, pat, sizeof(spec));
if (_dos_findfirst(spec, _A_NORMAL | _A_HIDDEN | _A_SYSTEM | _A_ARCH, &ff) == 0) {
do {
if (!(ff.attrib & _A_SUBDIR)) {
tool_join_path(target, dir, ff.name, sizeof(target));
if (remove_one(target, dhandle, object_id, objtype, objname, 1) == 0)
(*count)++;
else
rc = 1;
}
} while (_dos_findnext(&ff) == 0);
}
return(rc);
}
int func_remove(int argc, char *argv[], int mode)
{
char *path = ".";
char *objname = NULL;
char objprint[48];
uint16 objtype = TRUSTEE_BINDERY_USER;
int objtype_given = 0;
uint8 connid = 0;
uint8 dhandle = 0;
uint32 object_id;
int use_subdirs = 0;
int use_files = 0;
int count = 0;
int i = 1;
int rc;
(void)mode;
if (argc < 2 || tool_is_help_arg(argv[1])) {
if (argc < 2) {
remove_usage_after_error();
return(1);
}
remove_usage();
return(argc < 2 ? 1 : 0);
}
if (i < argc && tool_strsame(argv[i], "USER")) {
/* Novell treats "REMOVE USER FROM path" as an object lookup for
* USER, not as a grammar error. */
if ((i + 1) < argc && tool_strsame(argv[i + 1], "FROM")) {
objtype_given = 0;
} else {
objtype = TRUSTEE_BINDERY_USER;
objtype_given = 1;
i++;
}
} else if (i < argc && tool_strsame(argv[i], "GROUP")) {
if ((i + 1) < argc && tool_strsame(argv[i + 1], "FROM")) {
objtype_given = 0;
} else {
objtype = TRUSTEE_BINDERY_GROUP;
objtype_given = 1;
i++;
}
}
if (i >= argc) {
remove_usage_after_error();
return(1);
}
objname = argv[i++];
if (i < argc && tool_strsame(argv[i], "FROM")) {
i++;
if (i >= argc) {
remove_usage_after_error();
return(1);
}
path = argv[i++];
}
while (i < argc) {
if (!tool_is_option(argv[i])) {
remove_usage_after_error();
return(1);
}
if (tool_is_files_option(argv[i])) {
use_files = 1;
i++;
continue;
}
if (tool_is_subdirs_option(argv[i])) {
use_subdirs = 1;
i++;
continue;
}
remove_usage_after_error();
return(1);
}
if (use_files && use_subdirs) {
fprintf(stdout, "Remove cannot do both directories and files in a single pass.\n");
return(1);
}
if (tool_current_dhandle(&connid, &dhandle)) {
fprintf(stdout, "Error: Drive not mapped to network.\n");
return(1);
}
object_id = trustee_lookup_object(objname, &objtype, objtype_given);
if (!object_id) {
if (objtype_given && objtype == TRUSTEE_BINDERY_GROUP)
fprintf(stdout, "\007Group \"%s\" not found.\n", objname);
else if (objtype_given)
fprintf(stdout, "\007User \"%s\" not found.\n", objname);
else
fprintf(stdout, "\007User or group \"%s\" not found.\n", objname);
return(1);
}
tool_upcopy(objprint, objname, sizeof(objprint));
if (use_subdirs)
rc = remove_subdirs(path, (uint16)dhandle, object_id, objtype, objprint, &count);
else if (use_files)
rc = remove_files(path, (uint16)dhandle, object_id, objtype, objprint, &count);
else {
rc = remove_one(path, (uint16)dhandle, object_id, objtype, objprint, 0);
if (!rc)
count = 1;
}
if (use_subdirs || (!use_files && !rc))
fprintf(stdout, "Trustee \"%s\" removed from %d directories.\n\n", objprint, count);
else if (use_files)
fprintf(stdout, "Trustee \"%s\" removed from %d files.\n\n", objprint, count);
return(rc ? (remove_last_rc ? remove_last_rc : 1) : 0);
}

361
revoke.c Normal file
View File

@@ -0,0 +1,361 @@
/*
* mars-nwe-dosutils - NetWare/DOS utility tools.
*
* Copyright (C) 2026 Mario Fetka
*
* 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: REVOKE utility for deleting trustee assignments from NetWare directories and files.
* Depends on: net.h, ncpapi.h, trustee.h/trustee.c trustee helpers, netcall.c requester helpers, tools.c shared utility routines.
*/
#include "net.h"
#include "ncpapi.h"
#include "trustee.h"
#ifndef _A_NORMAL
#define _A_NORMAL 0x00
#endif
static int revoke_last_rc = 0;
static void revoke_usage_short(int leading_blank, int bell_first)
{
if (bell_first)
fprintf(stdout, "\a");
if (leading_blank || bell_first)
fprintf(stdout, "\n");
fprintf(stdout, "Usage: REVOKE rightslist* [FOR path] FROM [USER|GROUP] name [options]\n");
fprintf(stdout, "Options: /SubDirectories | /Files\n");
fprintf(stdout, " ");
if (bell_first)
fprintf(stdout, "\n");
}
static void revoke_usage_full(int leading_blank, int bell_before_tail)
{
if (leading_blank)
fprintf(stdout, "\n");
fprintf(stdout, "Usage: REVOKE rightslist* [FOR path] FROM [USER|GROUP] name [options]\n");
fprintf(stdout, "Options: /SubDirectories | /Files\n");
fprintf(stdout, " \n");
fprintf(stdout, "286 Rights:\t\t386 Rights:\n");
fprintf(stdout, "---------------\t\t--------------------\n");
fprintf(stdout, "ALL = All\t\tALL = All\n");
fprintf(stdout, "R = Read\t\tS = Supervisor\n");
fprintf(stdout, "W = Write\t\tR = Read\n");
fprintf(stdout, "O = Open\t\tW = Write\n");
fprintf(stdout, "C = Create\t\tC = Create\n");
fprintf(stdout, "D = Delete\t\tE = Erase\n");
fprintf(stdout, "P = Parental\t\tM = Modify\n");
fprintf(stdout, "S = Search\t\tF = File Scan\n");
fprintf(stdout, "M = Modify\t\tA = Access Control\n");
fprintf(stdout, "\n");
if (bell_before_tail)
fprintf(stdout, "\a");
fprintf(stdout, "* Use abbreviations listed above, separated by spaces.\n");
}
static int revoke_one(char *path, uint16 dhandle, uint32 object_id,
uint16 revoke_mask, int forced_is_file)
{
uint16 old_rights = 0;
uint16 new_rights;
int is_dir;
int rc;
/* Without /FILES, Novell REVOKE reports directory-oriented messages even
* if the path cannot be located. */
is_dir = forced_is_file ? 0 : 1;
rc = ncp87_05_find_trustee_rights(path, dhandle, object_id, &old_rights,
NULL, NULL, NULL);
revoke_last_rc = rc;
if (rc) {
if (rc == 0xff)
fprintf(stdout, "\aNo trustee for the specified %s.\n", is_dir ? "directory" : "file");
else
fprintf(stdout, "\aError scanning trustee list.\n");
return(1);
}
new_rights = (uint16)(old_rights & ~revoke_mask);
if (new_rights == 0) {
/* Novell REVOKE removes the trustee through the old NCP22 trustee path.
* Keep the Client32/NCP87 delete call as a compatibility fallback. */
rc = ncp22_2b_delete_trustee_rights(path, dhandle, object_id);
if (rc)
rc = ncp87_0b_delete_trustee_rights(path, dhandle, object_id,
NULL, NULL, NULL);
revoke_last_rc = rc;
if (rc) {
fprintf(stdout, "Error deleting trustee.\n");
return(1);
}
} else {
/* Updating the remaining trustee mask is the same old SetTrustee flow
* used by GRANT. Fall back to NCP87 add-trustee if a server/client
* does not accept NCP22/27. */
rc = ncp22_27_set_trustee_rights(path, dhandle, object_id, new_rights);
if (rc)
rc = ncp87_0a_add_trustee_rights(path, dhandle, object_id, new_rights,
0xffff, NULL, NULL, NULL);
revoke_last_rc = rc;
if (rc) {
fprintf(stdout, "Fatal error revoking access rights.\n");
return(1);
}
}
{
char header[300];
char bracket[10];
trustee_header_path(header, path, sizeof(header));
trustee_rights_bracket(new_rights, bracket);
fprintf(stdout, "%s\n", header);
fprintf(stdout, "Trustee's access rights set to [%s]\r\n\n", bracket);
}
return(0);
}
static int revoke_subdirs_inner(char *path, uint16 dhandle, uint32 object_id,
uint16 revoke_mask, int *count,
int include_this)
{
struct find_t ff;
char pattern[260];
char child[260];
/* Novell REVOKE /SUBDIRECTORIES follows the REMOVE behaviour: the
* specified start directory is a container for the recursive operation,
* not itself part of the operation. Once a listed subdirectory reports
* no direct trustee, Novell stops after that first failure. */
if (include_this) {
if (revoke_one(path, dhandle, object_id, revoke_mask, 0) == 0)
(*count)++;
else
return(1);
}
tool_join_path(pattern, path, "*.*", sizeof(pattern));
if (_dos_findfirst(pattern, _A_SUBDIR, &ff) == 0) {
do {
if ((ff.attrib & _A_SUBDIR) && !tool_is_dot_dir(ff.name)) {
tool_join_path(child, path, ff.name, sizeof(child));
if (revoke_subdirs_inner(child, dhandle, object_id, revoke_mask,
count, 1))
return(1);
}
} while (_dos_findnext(&ff) == 0);
}
return(0);
}
static int revoke_subdirs(char *path, uint16 dhandle, uint32 object_id,
uint16 revoke_mask, int *count)
{
return(revoke_subdirs_inner(path, dhandle, object_id, revoke_mask,
count, 0));
}
static int revoke_files(char *path, uint16 dhandle, uint32 object_id,
uint16 revoke_mask, int *count)
{
struct find_t ff;
char dir[260];
char pat[80];
char spec[260];
char target[260];
int rc = 0;
if (tool_path_is_dir(path)) {
strmaxcpy(dir, path, sizeof(dir) - 1);
strmaxcpy(pat, "*.*", sizeof(pat) - 1);
} else if (tool_has_wildcards(path)) {
tool_parent_pattern(dir, pat, path, sizeof(dir), sizeof(pat));
} else {
if (revoke_one(path, dhandle, object_id, revoke_mask, 1) == 0)
(*count)++;
else
rc = 1;
return(rc);
}
tool_join_path(spec, dir, pat, sizeof(spec));
if (_dos_findfirst(spec, _A_NORMAL | _A_HIDDEN | _A_SYSTEM | _A_ARCH, &ff) == 0) {
do {
if (!(ff.attrib & _A_SUBDIR)) {
tool_join_path(target, dir, ff.name, sizeof(target));
if (revoke_one(target, dhandle, object_id, revoke_mask, 1) == 0)
(*count)++;
else
rc = 1;
}
} while (_dos_findnext(&ff) == 0);
}
return(rc);
}
int func_revoke(int argc, char *argv[], int mode)
{
uint16 rights = 0;
char *path = ".";
char *objname = NULL;
char objprint[48];
uint16 objtype = TRUSTEE_BINDERY_USER;
int objtype_given = 0;
uint8 connid = 0;
uint8 dhandle = 0;
uint32 object_id;
int use_subdirs = 0;
int use_files = 0;
int count = 0;
int i = 1;
int have_rights = 0;
int rc;
(void)mode;
if (argc < 2 || tool_is_help_arg(argv[1])) {
if (argc < 2)
revoke_usage_full(1, 1);
else
revoke_usage_short(1, 0);
return(argc < 2 ? 1 : 0);
}
while (i < argc) {
if (tool_strsame(argv[i], "FOR") || tool_strsame(argv[i], "FROM"))
break;
if (tool_is_option(argv[i]))
break;
if (trustee_parse_right_word(argv[i], &rights)) {
fprintf(stdout, "Invalid right specified.\n\n");
revoke_usage_full(0, 1);
return(1);
}
have_rights = 1;
i++;
}
if (!have_rights || i >= argc) {
revoke_usage_short(0, 1);
return(1);
}
if (tool_strsame(argv[i], "FOR")) {
i++;
if (i >= argc) {
revoke_usage_short(0, 1);
return(1);
}
path = argv[i++];
}
if (i >= argc || !tool_strsame(argv[i], "FROM")) {
revoke_usage_short(0, 1);
return(1);
}
i++;
if (i < argc && tool_strsame(argv[i], "USER")) {
objtype = TRUSTEE_BINDERY_USER;
objtype_given = 1;
i++;
} else if (i < argc && tool_strsame(argv[i], "GROUP")) {
objtype = TRUSTEE_BINDERY_GROUP;
objtype_given = 1;
i++;
}
if (i >= argc) {
revoke_usage_short(0, 1);
return(1);
}
objname = argv[i++];
while (i < argc) {
if (!tool_is_option(argv[i])) {
revoke_usage_short(0, 1);
return(1);
}
if (tool_is_files_option(argv[i])) {
use_files = 1;
i++;
continue;
}
if (tool_is_subdirs_option(argv[i])) {
use_subdirs = 1;
i++;
continue;
}
revoke_usage_short(0, 1);
return(1);
}
/* Novell REVOKE does not emit a grammar-specific message for /FILES plus
* /SUBDIRECTORIES. It reports the same directory trustee failure text. */
if (tool_current_dhandle(&connid, &dhandle)) {
fprintf(stdout, "Error: Drive not mapped to Network.\n");
return(1);
}
object_id = trustee_lookup_object(objname, &objtype, objtype_given);
if (!object_id) {
if (objtype_given && objtype == TRUSTEE_BINDERY_GROUP)
fprintf(stdout, "\aGroup \"%s\" not found.\n", objname);
else if (objtype_given)
fprintf(stdout, "\aUser \"%s\" not found.\n", objname);
else
fprintf(stdout, "\aUser or group \"%s\" not found.\n", objname);
return(1);
}
tool_upcopy(objprint, objname, sizeof(objprint));
if (use_files && use_subdirs) {
fprintf(stdout, "\aNo trustee for the specified directory.\n");
revoke_last_rc = 0xff;
return(1);
} else if (use_subdirs)
rc = revoke_subdirs(path, (uint16)dhandle, object_id, rights, &count);
else if (use_files)
rc = revoke_files(path, (uint16)dhandle, object_id, rights, &count);
else {
rc = revoke_one(path, (uint16)dhandle, object_id, rights, 0);
if (!rc)
count = 1;
}
if ((use_subdirs || (!use_files && !rc)) && count > 0)
fprintf(stdout, "Rights for %d directories were changed for %s.\n\n", count, objprint);
else if (use_files && count > 0)
fprintf(stdout, "Rights for %d files were changed for %s.\n\n", count, objprint);
return(rc ? (revoke_last_rc ? revoke_last_rc : 1) : 0);
}

318
rights.c Normal file
View File

@@ -0,0 +1,318 @@
/*
* mars-nwe-dosutils - NetWare/DOS utility tools.
*
* Copyright (C) 2026 Mario Fetka
*
* 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: RIGHTS utility for displaying effective NetWare rights.
* Depends on: net.h, ncpapi.h, netcall.c requester helpers, ncpapi.c namespace/NCP helpers, tools.c shared utility routines.
*/
#include "net.h"
#include "ncpapi.h"
#include <dos.h>
#include <sys/types.h>
#include <sys/stat.h>
#ifndef S_IFDIR
#define S_IFDIR 0040000
#endif
#define NW_RIGHT_S 0x01
#define NW_RIGHT_R 0x02
#define NW_RIGHT_W 0x04
#define NW_RIGHT_C 0x08
#define NW_RIGHT_E 0x10
#define NW_RIGHT_M 0x20
#define NW_RIGHT_F 0x40
#define NW_RIGHT_A 0x80
/* NCP effective-rights bits returned by NCP87 subfunction 29. */
#define NCP_RIGHT_READ 0x0001
#define NCP_RIGHT_WRITE 0x0002
#define NCP_RIGHT_OPEN 0x0004
#define NCP_RIGHT_CREATE 0x0008
#define NCP_RIGHT_DELETE 0x0010
#define NCP_RIGHT_OWNER 0x0020
#define NCP_RIGHT_SEARCH 0x0040
#define NCP_RIGHT_MODIFY 0x0080
#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, "\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_ncp_path(char *dst, char *src, int max)
{
char up[260];
char *p;
if (tool_is_current_path(src)) {
dst[0] = '\0';
return;
}
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, NCP_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(ncp87_06_obtain_ndir_info(npath, (uint16)dhandle,
info, NULL, NULL, NULL));
}
static int rights_path_exists(char *path, int *is_dir)
{
NCP_NDIR_INFO info;
if (rights_get_ncp_info(path, &info))
return(0);
if (is_dir)
*is_dir = (info.attributes & 0x10) ? 1 : 0;
return(1);
}
static int rights_effective_mask(char *path, int is_dir, uint8 *mask)
{
uint8 connid = 0;
uint8 dhandle = 0;
uint8 eff = 0;
char usepath[260];
int newhandle;
uint16 ncp_rights = 0;
if (mask) *mask = 0;
if (tool_current_dhandle(&connid, &dhandle))
return(-1);
/*
* Prefer the explicit Client32 NCP87 effective-rights request. This is
* the DOS Client32 equivalent of ncpfs ncp_get_eff_directory_rights().
* It works for both files and directories, so pass the requested path
* itself instead of mapping files to their parent directory.
*/
rights_ncp_path(usepath, path, sizeof(usepath));
if (!ncp87_1d_get_effective_rights(usepath,
(uint16)dhandle,
&ncp_rights,
NULL, NULL, NULL)) {
if (mask) *mask = rights_map_ncp_mask(ncp_rights);
return(0);
}
/*
* Fallback for older requesters/paths: allocate a temporary directory
* handle and use the returned old-style effective-rights byte.
* This cannot directly target a file, so files are mapped to their parent.
*/
if (tool_is_current_path(path)) {
usepath[0] = '\0';
} else if (is_dir) {
rights_ncp_path(usepath, path, sizeof(usepath));
} else {
char npath[260];
rights_ncp_path(npath, path, sizeof(npath));
tool_parent_path(usepath, npath, sizeof(usepath));
}
newhandle = alloc_temp_dir_handle(dhandle, usepath, 0, &eff);
if (newhandle < 0) {
if (usepath[0]) {
int subdir = 1;
int r = ncp16_02_get_directory_entry(dhandle, (uint8 *)usepath, &subdir,
NULL, NULL, NULL);
if (r >= 0) {
eff = (uint8)r;
} else {
return(-1);
}
} else {
eff = 0xff;
}
} else {
dealloc_dir_handle(newhandle);
}
if (mask) *mask = eff;
return(0);
}
static uint8 rights_map_ncp_mask(uint16 ncp_rights)
{
uint8 mask = 0;
if (ncp_rights & NCP_RIGHT_SUPER) mask |= NW_RIGHT_S;
if (ncp_rights & NCP_RIGHT_READ) mask |= NW_RIGHT_R;
if (ncp_rights & NCP_RIGHT_WRITE) mask |= NW_RIGHT_W;
if (ncp_rights & NCP_RIGHT_CREATE) mask |= NW_RIGHT_C;
if (ncp_rights & NCP_RIGHT_DELETE) mask |= NW_RIGHT_E;
if (ncp_rights & NCP_RIGHT_MODIFY) mask |= NW_RIGHT_M;
if (ncp_rights & NCP_RIGHT_SEARCH) mask |= NW_RIGHT_F;
if (ncp_rights & NCP_RIGHT_OWNER) mask |= NW_RIGHT_A;
return(mask);
}
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[8] = '\0';
}
/*
* Novell RIGHTS layout:
* - lines with star: two leading blanks, star, blank, text
* - lines without star: four leading blanks, text
* Keep the right-column letter at a fixed-ish DOS-screen position.
*/
static void rights_print_line(int have, int star, char *text, char letter)
{
(void)have;
if (star)
fprintf(stdout, " * %-43s(%c)\n", text, letter);
else
fprintf(stdout, " %-43s(%c)\n", text, letter);
}
static void rights_display(char *path, int is_dir, uint8 mask)
{
char hdr[300];
char mstr[10];
tool_header_path(hdr, path, sizeof(hdr));
rights_mask_string(mask, mstr);
fprintf(stdout, "%s\n", hdr);
if (is_dir)
fprintf(stdout, "Your Effective Rights for this directory are [%s]\n", mstr);
else
fprintf(stdout, "Your Effective Rights for this file are [%s]\n", mstr);
if (is_dir) {
rights_print_line(mask & NW_RIGHT_S, 0, "You have Supervisor Rights to Directory.", 'S');
rights_print_line(mask & NW_RIGHT_R, 1, "May Read from File.", 'R');
rights_print_line(mask & NW_RIGHT_W, 1, "May Write to File.", 'W');
rights_print_line(mask & NW_RIGHT_C, 0, "May Create Subdirectories and Files.", 'C');
rights_print_line(mask & NW_RIGHT_E, 0, "May Erase Directory.", 'E');
rights_print_line(mask & NW_RIGHT_M, 0, "May Modify Directory.", 'M');
rights_print_line(mask & NW_RIGHT_F, 0, "May Scan for Files.", 'F');
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, " Entries in Directory May Inherit [%s] rights.\n", mstr);
if (mask == 0xff)
fprintf(stdout, " You have ALL RIGHTS to Directory Entry.\n");
} else {
rights_print_line(mask & NW_RIGHT_S, 0, "You have Supervisor Rights to File.", 'S');
rights_print_line(mask & NW_RIGHT_R, 0, "May Read from File.", 'R');
rights_print_line(mask & NW_RIGHT_W, 0, "May Write to File.", 'W');
rights_print_line(mask & NW_RIGHT_C, 1, "May Create Subdirectories and Files.", 'C');
rights_print_line(mask & NW_RIGHT_E, 0, "May Erase File.", 'E');
rights_print_line(mask & NW_RIGHT_M, 0, "May Modify File.", 'M');
rights_print_line(mask & NW_RIGHT_F, 0, "May Scan for File.", 'F');
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");
if (mask == 0xff)
fprintf(stdout, " You have ALL RIGHTS to Directory Entry.\n");
}
}
int func_rights(int argc, char *argv[], int mode)
{
char *path = ".";
uint8 mask = 0;
int is_dir;
(void)mode;
if (argc > 2) {
fprintf(stdout, "Too many parameters on command line.\n");
rights_usage();
return(1);
}
if (argc == 2) {
if (tool_is_help_arg(argv[1])) {
rights_usage();
return(0);
}
path = argv[1];
}
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);
}
rights_display(path, is_dir, mask);
return(0);
}

106
slist.c
View File

@@ -1,18 +1,56 @@
/* slist.c - list known NetWare file servers, DOS mars-dosutils version */ /*
* 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" #include "net.h"
#define NCP_BINDERY_FSERVER 0x0004
static int usage(void) static int usage(void)
{ {
fprintf(stderr, "usage:\t%s [pattern]\n", funcname); fprintf(stdout, "Usage: SLIST [Server] [/Continue] \n");
return(-1); return(0);
} }
static void print_net_node(uint8 *addr) static unsigned long node_to_number(uint8 *addr)
{ {
fprintf(stdout, "%08lX %02X%02X%02X%02X%02X%02X", 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), (unsigned long)GET_BE32(addr),
addr[4], addr[5], addr[6], addr[7], addr[8], addr[9]); node_to_number(addr),
is_default ? "Default " : "");
} }
int func_slist(int argc, char *argv[], int mode) int func_slist(int argc, char *argv[], int mode)
@@ -20,44 +58,68 @@ int func_slist(int argc, char *argv[], int mode)
BINDERY_OBJECT obj; BINDERY_OBJECT obj;
uint32 last_id = MAX_U32; uint32 last_id = MAX_U32;
uint8 pattern[50]; uint8 pattern[50];
int explicit_server = 0;
int found = 0; int found = 0;
int result; int result;
int i;
int continuous = 0;
int line_count = 0;
(void)mode; (void)mode;
if (argc > 2) return(usage()); strcpy(pattern, "*");
for (i = 1; i < argc; i++) {
if (tool_is_help_arg(argv[i])) return(usage());
if (argv[i][0] == '/' || argv[i][0] == '-') {
if (tool_strsame(argv[i], "/C") || tool_strsame(argv[i], "/CONTINUE") ||
tool_strsame(argv[i], "-C") || tool_strsame(argv[i], "-CONTINUE")) {
continuous = 1;
continue;
}
return(usage());
}
strmaxcpy(pattern, argv[i], sizeof(pattern) - 1);
explicit_server = 1;
}
if (argc == 2) strmaxcpy(pattern, argv[1], sizeof(pattern) - 1);
else strcpy(pattern, "*");
upstr(pattern); upstr(pattern);
fprintf(stdout, "\n%-52s%-10s%-12s\n", while ((result = ncp17_37_scan_bindery_object(last_id, NCP_BINDERY_FSERVER,
"Known NetWare File Servers", "Network", "Node Address");
fprintf(stdout,
"-----------------------------------------------"
"---------------------------\n");
while ((result = ncp_17_37(last_id, NCP_BINDERY_FSERVER,
pattern, &obj)) == 0) { pattern, &obj)) == 0) {
NW_PROPERTY prop; NW_PROPERTY prop;
found = 1; found++;
last_id = obj.object_id; last_id = obj.object_id;
fprintf(stdout, "%-52s", obj.object_name); if (found == 1) {
fprintf(stdout, "%-48sNetwork Node Address Status\n",
"Known NetWare File Servers");
fprintf(stdout, "%-48s------- ------------ ------\n",
"--------------------------");
}
if (!ncp_17_3d(NCP_BINDERY_FSERVER, obj.object_name, fprintf(stdout, "%-47s", obj.object_name);
if (!ncp17_3d_read_property_value(NCP_BINDERY_FSERVER, obj.object_name,
1, "NET_ADDRESS", &prop)) { 1, "NET_ADDRESS", &prop)) {
print_net_node(prop.value); print_net_node_status(prop.value, found == 1);
} }
fprintf(stdout, "\n"); fprintf(stdout, "\n");
tool_page_line(&line_count, &continuous);
if (last_id == MAX_U32) break; if (last_id == MAX_U32) break;
} }
if (!found) if (explicit_server && !found) {
fprintf(stdout, "No servers found\n"); fprintf(stdout, "Server %s not found.\n", pattern);
return(0);
}
fprintf(stdout, "\nTotal of %d file servers found\n", found);
return(0); return(0);
} }

17
test/README.TXT Normal file
View File

@@ -0,0 +1,17 @@
DOS utility regression tests
============================
See README.md in this directory for the GitHub/Gitea formatted test index.
Common result directories:
OUT Novell reference output
PUBOUT current PUBLIC/LOGIN implementation output
UNOV Novell readback as NOPASSUSER
UPUB PUBLIC readback as NOPASSUSER
LOUT Novell output while logged out
LPUBOUT public LOGIN output while logged out
Some tests use DLYSTRT and a local C:\*TMP helper directory because LOGOUT
removes F: and normal network mappings. Set LGNTPWD before running tests that
need automatic re-login as SUPERVISOR.

107
test/README.md Normal file
View File

@@ -0,0 +1,107 @@
# DOS utility regression tests
This directory contains DOS-side comparison and regression tests for the
`mars-dosutils` tools. The tests are meant for maintainer use against a MARS-NWE
`SYS:` tree that also contains the original Novell tools in `SYS:NPUBLIC` and
`SYS:NLOGIN`.
Most tests compare captured Novell output with the current public implementation
byte-for-byte. Some tests also switch to a normal user and read back effective
rights, because matching command output alone is not enough for trustee tools.
## Output naming convention
The generated result trees use these names consistently:
```text
OUT Novell reference output from SYS:NPUBLIC or SYS:NLOGIN
PUBOUT current implementation output from SYS:PUBLIC or SYS:LOGIN
COMPARE.LOG
UNOV Novell readback while logged in as NOPASSUSER
UPUB public readback while logged in as NOPASSUSER
UCOMP.LOG
LOUT Novell output while logged out, usually from SYS:NLOGIN copy
LPUBOUT public output while logged out, usually from SYS:LOGIN copy
LCOMP.LOG
```
Not every test has every directory. For example, SLIST has `LOUT`/`LPUBOUT`,
while trustee tools usually have `UNOV`/`UPUB`.
## User switching and local helpers
Tests that must survive a `LOGOUT` use `DLYSTRT.EXE` and a local helper directory
on `C:`. This is required because logging out removes `F:` and normal network
mappings. The common pattern is:
1. run the main `*STA.BAT` as `SUPERVISOR` from `F:`,
2. copy the helper `*C.BAT`, `DLYSTRT.EXE`, and required tools to `C:\*TMP`,
3. queue the helper with `DLYSTRT`,
4. let the helper log out, perform the user or logged-out checks, log back in,
5. queue `F:\*STA.BAT PART2`,
6. compare and package the captured files.
For automatic re-login, set the Supervisor password before starting the test:
```bat
SET LGNTPWD=your-supervisor-password
```
`LGNTPWD` is used only by maintainer tests and should not be committed to any
script or log.
## Test index
| Directory | Main script | Current purpose/status |
| --- | --- | --- |
| `creator/` | `CIXSTA.BAT` | CREATOR metadata/xattr test plus optional `NOPASSUSER` readback. |
| `flag/` | `FLGTSTA.BAT` | `NPUBLIC\FLAG` vs `PUBLIC\FLAG`, including user-context readback. |
| `flagdir/` | `FDGTSTA.BAT` | `NPUBLIC\FLAGDIR` vs `PUBLIC\FLAGDIR`, including user-context readback. |
| `grant/` | `GRNTSTA.BAT` | `NPUBLIC\GRANT` vs `PUBLIC\GRANT`, rights matrix and `NOPASSUSER` readback. |
| `login/` | `LGNTSTA.BAT` | Maintainer baseline for Novell LOGIN/LOGOUT/MAP flow. |
| `logout/` | see `login/` | LOGOUT is covered by the LOGIN baseline flow. |
| `map/` | `MAPTSTA.BAT` | Novell MAP baseline and root/non-root mapping semantics; full PUBLIC comparison still pending. |
| `ndir/` | `NDIRTSTA.BAT` | `NPUBLIC\NDIR` vs `PUBLIC\NDIR`, matrix, filters, `/SUB`, `/RIGHTS`, user readback. |
| `remove/` | `RMVSTA.BAT` | `NPUBLIC\REMOVE` vs `PUBLIC\REMOVE`, matrix and `NOPASSUSER` readback. |
| `revoke/` | `RVKSTA.BAT` | `NPUBLIC\REVOKE` vs `PUBLIC\REVOKE`, matrix and `NOPASSUSER` readback. |
| `rights/` | `RGHTSTA.BAT` | `NPUBLIC\RIGHTS` vs `PUBLIC\RIGHTS`, direct effective-rights cases. |
| `slist/` | `SLSTSTA.BAT` | `NPUBLIC\SLIST` vs `PUBLIC\SLIST` while logged in, plus `NLOGIN\SLIST` vs `LOGIN\SLIST` while logged out. |
| `whoami/` | `WHOSTA.BAT` | `NPUBLIC\WHOAMI` vs `PUBLIC\WHOAMI`. |
| `rightsuser/` | varies | Additional user-rights experiments. |
| `renmove/` | varies | Rename/move experiments. |
| `ncopy/` | varies | NCOPY experiments. |
| `filer/` | varies | FILER-related notes/experiments. |
## Packaging
Most test directories have a matching `*ZIP.BAT` that packages the result tree
under `SYS:`. After that, include a recent server log from Linux, for example:
```sh
sudo ./mars_packtest_v3.sh slststa 5 mario
```
Use the test-specific README for exact ZIP names and any Linux-side collector
steps.
## Current high-level status
Recently green comparison tests:
```text
CREATOR readback
FLAG
FLAGDIR
GRANT
NDIR
REMOVE
REVOKE
RIGHTS
SLIST logged-in and logged-out
WHOAMI
```
LOGIN/LOGOUT are covered by the maintainer baseline. MAP still needs a full
`PUBLIC\MAP` vs Novell comparison beyond the current baseline/semantics test.

71
test/creator/CIXC.BAT Normal file
View File

@@ -0,0 +1,71 @@
@ECHO OFF
REM CIXC.BAT - delayed user-context CREATOR readback helper.
REM Started by CIXSTA via DLYSTRT. Runs from C:\CIXTMP.
C:
CD \CIXTMP
ECHO CIXC user-context CREATOR readback helper > HELPER.TXT
ECHO Current phase: logout supervisor, login NOPASSUSER. >> HELPER.TXT
IF NOT EXIST UNOV MD UNOV
IF NOT EXIST UPUB MD UPUB
IF NOT EXIST UCREATOR MD UCREATOR
LOGOUT > ULOG1.OUT
LOGIN NOPASSUSER > ULOGIN.OUT
F:
CD \
IF EXIST \PUBLIC\CREATOR.EXE GOTO HAVEF
ECHO F: not ready after NOPASSUSER login. >> C:\CIXTMP\HELPER.TXT
GOTO RELSUP
:HAVEF
ECHO Capturing NOPASSUSER RIGHTS readback... >> C:\CIXTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\CIXTEST\SUP > C:\CIXTMP\UNOV\SUPRGT.OUT
\PUBLIC\RIGHTS F:\CIXTEST\SUP > C:\CIXTMP\UPUB\SUPRGT.OUT
\NPUBLIC\RIGHTS F:\CIXTEST\SUP\S_SUP.TXT > C:\CIXTMP\UNOV\RSUP.OUT
\PUBLIC\RIGHTS F:\CIXTEST\SUP\S_SUP.TXT > C:\CIXTMP\UPUB\RSUP.OUT
\NPUBLIC\RIGHTS F:\CIXTEST\SUP\S_ARCH.TXT > C:\CIXTMP\UNOV\RARCH.OUT
\PUBLIC\RIGHTS F:\CIXTEST\SUP\S_ARCH.TXT > C:\CIXTMP\UPUB\RARCH.OUT
\NPUBLIC\RIGHTS F:\CIXTEST\SUP\S_ALL.TXT > C:\CIXTMP\UNOV\RALL.OUT
\PUBLIC\RIGHTS F:\CIXTEST\SUP\S_ALL.TXT > C:\CIXTMP\UPUB\RALL.OUT
ECHO Capturing PUBLIC\CREATOR /SHOW as NOPASSUSER... >> C:\CIXTMP\HELPER.TXT
\PUBLIC\CREATOR F:\CIXTEST\SUP\S_SUP.TXT /SHOW > C:\CIXTMP\UCREATOR\CSUP.OUT
\PUBLIC\CREATOR F:\CIXTEST\SUP\S_ARCH.TXT /SHOW > C:\CIXTMP\UCREATOR\CARCH.OUT
\PUBLIC\CREATOR F:\CIXTEST\SUP\S_ALL.TXT /SHOW > C:\CIXTMP\UCREATOR\CALL.OUT
:RELSUP
ECHO Relogin as SUPERVISOR. >> C:\CIXTMP\HELPER.TXT
C:
CD \CIXTMP
LOGOUT > ULOG2.OUT
F:
CD \
IF EXIST \LOGIN\LOGIN.EXE GOTO HAVELOG
ECHO F:\LOGIN\LOGIN.EXE not found. >> C:\CIXTMP\HELPER.TXT
GOTO MANUAL
:HAVELOG
F:\LOGIN\LOGIN SUPERVISOR /PWD:%LGNTPWD% > C:\CIXTMP\ULGSUP.OUT
F:
CD \
IF EXIST F:\CIXSTA.BAT GOTO QUEUEP2
ECHO F:\CIXSTA.BAT missing after SUPERVISOR login. >> C:\CIXTMP\HELPER.TXT
GOTO MANUAL
:QUEUEP2
C:\CIXTMP\DLYSTRT /T:2 F:\CIXSTA.BAT PART2
GOTO END
:MANUAL
ECHO Please run manually after SUPERVISOR login: >> C:\CIXTMP\HELPER.TXT
ECHO F: >> C:\CIXTMP\HELPER.TXT
ECHO CD \ >> C:\CIXTMP\HELPER.TXT
ECHO CIXSTA PART2 >> C:\CIXTMP\HELPER.TXT
:END

194
test/creator/CIXSTA.BAT Normal file
View File

@@ -0,0 +1,194 @@
@ECHO OFF
REM CIXSTA.BAT
REM Automated CREATOR/xattr test for MARS NWE.
REM
REM PART1 runs as SUPERVISOR, prepares data and queues CIXC via DLYSTRT.
REM PART2 runs after CIXC has logged SUPERVISOR back in and collects results
REM from C:\CIXTMP into F:\CIXCMP.
REM
REM Optional NOPASSUSER readback 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: CIXSTA [PART2]
GOTO END
:PART1
F:
CD \
REM --- Clean generated test/result directories (contents only). ---
IF EXIST CIXTEST\NUL DELTREE /Y CIXTEST\*.*
IF EXIST CIXCMP\NUL DELTREE /Y CIXCMP\*.*
IF NOT EXIST CIXTEST\NUL MD CIXTEST
IF NOT EXIST CIXTEST\SUP\NUL MD CIXTEST\SUP
IF NOT EXIST CIXCMP\NUL MD CIXCMP
IF NOT EXIST CIXCMP\PRE\NUL MD CIXCMP\PRE
IF NOT EXIST CIXCMP\POST\NUL MD CIXCMP\POST
IF NOT EXIST CIXCMP\LINUX\NUL MD CIXCMP\LINUX
IF NOT EXIST CIXCMP\UNOV\NUL MD CIXCMP\UNOV
IF NOT EXIST CIXCMP\UPUB\NUL MD CIXCMP\UPUB
IF NOT EXIST CIXCMP\UCREATOR\NUL MD CIXCMP\UCREATOR
IF EXIST F:\CIXCMP\RUN.LOG DEL F:\CIXCMP\RUN.LOG
IF EXIST F:\CIXCMP\SUMMARY.TXT DEL F:\CIXCMP\SUMMARY.TXT
IF EXIST F:\CIXCMP\CIXSTA.ZIP DEL F:\CIXCMP\CIXSTA.ZIP
IF EXIST F:\CIXCMP\ZIP.LOG DEL F:\CIXCMP\ZIP.LOG
IF EXIST F:\CIXCMP\PRE\*.OUT DEL F:\CIXCMP\PRE\*.OUT
IF EXIST F:\CIXCMP\POST\*.OUT DEL F:\CIXCMP\POST\*.OUT
IF EXIST F:\CIXCMP\LINUX\*.TXT DEL F:\CIXCMP\LINUX\*.TXT
IF EXIST F:\CIXCMP\UNOV\*.OUT DEL F:\CIXCMP\UNOV\*.OUT
IF EXIST F:\CIXCMP\UPUB\*.OUT DEL F:\CIXCMP\UPUB\*.OUT
IF EXIST F:\CIXCMP\UCREATOR\*.OUT DEL F:\CIXCMP\UCREATOR\*.OUT
IF EXIST F:\CIXCMP\UCOMP.LOG DEL F:\CIXCMP\UCOMP.LOG
IF EXIST F:\CIXCMP\HELPER.TXT DEL F:\CIXCMP\HELPER.TXT
IF EXIST F:\CIXCMP\ULOG1.OUT DEL F:\CIXCMP\ULOG1.OUT
IF EXIST F:\CIXCMP\ULOGIN.OUT DEL F:\CIXCMP\ULOGIN.OUT
IF EXIST F:\CIXCMP\ULOG2.OUT DEL F:\CIXCMP\ULOG2.OUT
IF EXIST F:\CIXCMP\ULGSUP.OUT DEL F:\CIXCMP\ULGSUP.OUT
REM Reset files from previous runs.
IF EXIST F:\CIXTEST\SUP\S_SUP.TXT DEL F:\CIXTEST\SUP\S_SUP.TXT
IF EXIST F:\CIXTEST\SUP\S_ARCH.TXT DEL F:\CIXTEST\SUP\S_ARCH.TXT
IF EXIST F:\CIXTEST\SUP\S_ALL.TXT DEL F:\CIXTEST\SUP\S_ALL.TXT
ECHO CIXSTA creator/xattr test using PUBLIC\CREATOR > F:\CIXCMP\RUN.LOG
ECHO Run this as SUPERVISOR. >> F:\CIXCMP\RUN.LOG
ECHO Date/time stamp skipped to avoid DOS prompt. >> F:\CIXCMP\RUN.LOG
ECHO Optional user-context target: NOPASSUSER >> F:\CIXCMP\RUN.LOG
ECHO. >> F:\CIXCMP\RUN.LOG
ECHO SUP CREATOR FILE > F:\CIXTEST\SUP\S_SUP.TXT
ECHO SUP ARCHIVE FILE > F:\CIXTEST\SUP\S_ARCH.TXT
ECHO SUP ALL FILE > F:\CIXTEST\SUP\S_ALL.TXT
NPUBLIC\FLAG F:\CIXTEST\SUP\S_SUP.TXT N >> F:\CIXCMP\RUN.LOG
NPUBLIC\FLAG F:\CIXTEST\SUP\S_ARCH.TXT N >> F:\CIXCMP\RUN.LOG
NPUBLIC\FLAG F:\CIXTEST\SUP\S_ALL.TXT N >> F:\CIXCMP\RUN.LOG
ECHO === PRE READBACK === >> F:\CIXCMP\RUN.LOG
NPUBLIC\NDIR F:\CIXTEST\SUP /DATES > F:\CIXCMP\PRE\SUPDAT.OUT
NPUBLIC\NDIR F:\CIXTEST\SUP /RIGHTS > F:\CIXCMP\PRE\SUPRGT.OUT
PUBLIC\CREATOR F:\CIXTEST\SUP\S_SUP.TXT /SHOW > F:\CIXCMP\PRE\CSUP.OUT
PUBLIC\CREATOR F:\CIXTEST\SUP\S_ARCH.TXT /SHOW > F:\CIXCMP\PRE\CARCH.OUT
PUBLIC\CREATOR F:\CIXTEST\SUP\S_ALL.TXT /SHOW > F:\CIXCMP\PRE\CALL.OUT
ECHO === CREATOR TOOL SET INFO === >> F:\CIXCMP\RUN.LOG
REM Set fileinfo xattr fields.
PUBLIC\CREATOR F:\CIXTEST\SUP\S_SUP.TXT /CREATOR MARIO >> F:\CIXCMP\RUN.LOG
PUBLIC\CREATOR F:\CIXTEST\SUP\S_SUP.TXT /MODIFIER MARIO >> F:\CIXCMP\RUN.LOG
REM Set archive xattr fields.
PUBLIC\CREATOR F:\CIXTEST\SUP\S_ARCH.TXT /ARCHIVE MARIO >> F:\CIXCMP\RUN.LOG
REM Set all three groups with one command and explicit date/time.
PUBLIC\CREATOR F:\CIXTEST\SUP\S_ALL.TXT /ALL MARIO 2026-05-25 16:12:00 >> F:\CIXCMP\RUN.LOG
ECHO === POST READBACK === >> F:\CIXCMP\RUN.LOG
NPUBLIC\NDIR F:\CIXTEST\SUP /DATES > F:\CIXCMP\POST\SUPDAT.OUT
NPUBLIC\NDIR F:\CIXTEST\SUP /RIGHTS > F:\CIXCMP\POST\SUPRGT.OUT
PUBLIC\CREATOR F:\CIXTEST\SUP\S_SUP.TXT /SHOW > F:\CIXCMP\POST\CSUP.OUT
PUBLIC\CREATOR F:\CIXTEST\SUP\S_ARCH.TXT /SHOW > F:\CIXCMP\POST\CARCH.OUT
PUBLIC\CREATOR F:\CIXTEST\SUP\S_ALL.TXT /SHOW > F:\CIXCMP\POST\CALL.OUT
NPUBLIC\FLAG F:\CIXTEST\SUP\S_SUP.TXT > F:\CIXCMP\POST\FSUP.OUT
NPUBLIC\FLAG F:\CIXTEST\SUP\S_ARCH.TXT > F:\CIXCMP\POST\FARCH.OUT
NPUBLIC\FLAG F:\CIXTEST\SUP\S_ALL.TXT > F:\CIXCMP\POST\FALL.OUT
REM Allow NOPASSUSER to read this tree for optional user-context readback.
REM Creator metadata is set by SUPERVISOR above; the helper only verifies
REM that /SHOW and effective rights look sane for a normal user.
\NPUBLIC\GRANT R F FOR F:\CIXTEST\SUP TO USER NOPASSUSER > F:\CIXCMP\POST\UGRANTD.OUT
\NPUBLIC\GRANT R F FOR F:\CIXTEST\SUP\S_SUP.TXT TO USER NOPASSUSER > F:\CIXCMP\POST\UGRNTS.OUT
\NPUBLIC\GRANT R F FOR F:\CIXTEST\SUP\S_ARCH.TXT TO USER NOPASSUSER > F:\CIXCMP\POST\UGRNTA.OUT
\NPUBLIC\GRANT R F FOR F:\CIXTEST\SUP\S_ALL.TXT TO USER NOPASSUSER > F:\CIXCMP\POST\UGRNTL.OUT
REM --- Queue delayed NOPASSUSER readback helper. ---
IF "%LGNTPWD%"=="" GOTO NEEDPWD
IF EXIST C:\CIXTMP\*.* DELTREE /Y C:\CIXTMP
IF NOT EXIST C:\CIXTMP MD C:\CIXTMP
IF NOT EXIST C:\CIXTMP\UNOV MD C:\CIXTMP\UNOV
IF NOT EXIST C:\CIXTMP\UPUB MD C:\CIXTMP\UPUB
IF NOT EXIST C:\CIXTMP\UCREATOR MD C:\CIXTMP\UCREATOR
REM DLYSTRT must be local because F: disappears after LOGOUT.
IF EXIST \PUBLIC\DLYSTRT.EXE COPY \PUBLIC\DLYSTRT.EXE C:\CIXTMP > NUL
IF EXIST C:\CIXTMP\DLYSTRT.EXE GOTO HAVEDLY
ECHO ERROR: DLYSTRT.EXE not found. >> F:\CIXCMP\RUN.LOG
ECHO ERROR: DLYSTRT.EXE not found.
GOTO END
:HAVEDLY
REM Only the helper and DLYSTRT must be local. CIXSTA stays on F:\ and is
REM started as F:\CIXSTA.BAT PART2 after the SUPERVISOR re-login.
COPY F:\CIXC.BAT C:\CIXTMP\CIXC.BAT > NUL
C:
CD \CIXTMP
DLYSTRT /T:2 CIXC.BAT
ECHO CIXC queued via DLYSTRT. >> F:\CIXCMP\RUN.LOG
ECHO CIXC wurde via DLYSTRT gestartet.
ECHO Nach automatischem Re-Login wird CIXSTA PART2 gestartet.
GOTO END
:PART2
F:
CD \
IF NOT EXIST CIXCMP\UNOV MD CIXCMP\UNOV
IF NOT EXIST CIXCMP\UPUB MD CIXCMP\UPUB
IF NOT EXIST CIXCMP\UCREATOR MD CIXCMP\UCREATOR
IF EXIST C:\CIXTMP\UNOV\*.* COPY C:\CIXTMP\UNOV\*.* F:\CIXCMP\UNOV > NUL
IF EXIST C:\CIXTMP\UPUB\*.* COPY C:\CIXTMP\UPUB\*.* F:\CIXCMP\UPUB > NUL
IF EXIST C:\CIXTMP\UCREATOR\*.* COPY C:\CIXTMP\UCREATOR\*.* F:\CIXCMP\UCREATOR > NUL
IF EXIST C:\CIXTMP\HELPER.TXT COPY C:\CIXTMP\HELPER.TXT F:\CIXCMP\HELPER.TXT > NUL
IF EXIST C:\CIXTMP\ULOG1.OUT COPY C:\CIXTMP\ULOG1.OUT F:\CIXCMP\ULOG1.OUT > NUL
IF EXIST C:\CIXTMP\ULOGIN.OUT COPY C:\CIXTMP\ULOGIN.OUT F:\CIXCMP\ULOGIN.OUT > NUL
IF EXIST C:\CIXTMP\ULOG2.OUT COPY C:\CIXTMP\ULOG2.OUT F:\CIXCMP\ULOG2.OUT > NUL
IF EXIST C:\CIXTMP\ULGSUP.OUT COPY C:\CIXTMP\ULGSUP.OUT F:\CIXCMP\ULGSUP.OUT > NUL
ECHO === COMPARE NOPASSUSER NOVELL RIGHTS AGAINST PUBLIC RIGHTS === > F:\CIXCMP\UCOMP.LOG
ECHO Comparing SUP directory >> F:\CIXCMP\UCOMP.LOG
FC F:\CIXCMP\UNOV\SUPRGT.OUT F:\CIXCMP\UPUB\SUPRGT.OUT >> F:\CIXCMP\UCOMP.LOG
ECHO Comparing S_SUP.TXT >> F:\CIXCMP\UCOMP.LOG
FC F:\CIXCMP\UNOV\RSUP.OUT F:\CIXCMP\UPUB\RSUP.OUT >> F:\CIXCMP\UCOMP.LOG
ECHO Comparing S_ARCH.TXT >> F:\CIXCMP\UCOMP.LOG
FC F:\CIXCMP\UNOV\RARCH.OUT F:\CIXCMP\UPUB\RARCH.OUT >> F:\CIXCMP\UCOMP.LOG
ECHO Comparing S_ALL.TXT >> F:\CIXCMP\UCOMP.LOG
FC F:\CIXCMP\UNOV\RALL.OUT F:\CIXCMP\UPUB\RALL.OUT >> F:\CIXCMP\UCOMP.LOG
ECHO === SUMMARY === > F:\CIXCMP\SUMMARY.TXT
ECHO CIXSTA creator/xattr test with PUBLIC\CREATOR finished. >> F:\CIXCMP\SUMMARY.TXT
ECHO. >> F:\CIXCMP\SUMMARY.TXT
ECHO Expected: >> F:\CIXCMP\SUMMARY.TXT
ECHO - S_SUP.TXT has creator/modifier MARIO via user.mars_nwe.fileinfo. >> F:\CIXCMP\SUMMARY.TXT
ECHO - S_ARCH.TXT has archive date/time/archiver MARIO via user.mars_nwe.archive. >> F:\CIXCMP\SUMMARY.TXT
ECHO - S_ALL.TXT has fileinfo and archive metadata with explicit date/time. >> F:\CIXCMP\SUMMARY.TXT
ECHO - POST\C*.OUT shows PUBLIC\CREATOR /SHOW readback. >> F:\CIXCMP\SUMMARY.TXT
ECHO - POST\SUPDAT.OUT shows NDIR /DATES readback. >> F:\CIXCMP\SUMMARY.TXT
ECHO - UCREATOR/UNOV/UPUB show NOPASSUSER readback. >> F:\CIXCMP\SUMMARY.TXT
ECHO. >> F:\CIXCMP\SUMMARY.TXT
ECHO Next Linux-side step: run cix_collect_xattr.sh, then CIXZIP. >> F:\CIXCMP\SUMMARY.TXT
ECHO.
ECHO CIXSTA PART2 fertig.
ECHO Jetzt auf Linux cix_collect_xattr.sh ausfuehren, dann CIXZIP.
ECHO.
GOTO END
:NEEDPWD
ECHO ERROR: LGNTPWD ist nicht gesetzt.
ECHO Fuer den automatischen CREATOR/NOPASSUSER-Test zuerst setzen, z.B.:
ECHO SET LGNTPWD=dein-supervisor-passwort
ECHO Danach starten:
ECHO F:\CIXSTA
ECHO Es wurde kein DLYSTRT installiert und kein User-Kontext-Test gestartet.
GOTO END
:END

26
test/creator/CIXZIP.BAT Normal file
View File

@@ -0,0 +1,26 @@
@ECHO OFF
REM CIXZIP.BAT
REM Optional packer for CIXSTA result files.
REM Requires ZIP.EXE in PATH or current directory.
F:
CD \CIXCMP
IF EXIST CIXSTA.ZIP DEL CIXSTA.ZIP
IF EXIST ZIP.LOG DEL ZIP.LOG
ECHO Creating CIXSTA.ZIP > ZIP.LOG
ZIP -r CIXSTA.ZIP RUN.LOG SUMMARY.TXT PRE POST LINUX UNOV UPUB UCREATOR UCOMP.LOG HELPER.TXT ULOG1.OUT ULOGIN.OUT ULOG2.OUT ULGSUP.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 \CIXTEST\NUL DELTREE /Y \CIXTEST >> ZIP.LOG
CD \
ECHO.
ECHO ZIP step finished.
ECHO Check:
ECHO F:\CIXCMP\CIXSTA.ZIP
ECHO F:\CIXCMP\ZIP.LOG
ECHO.

179
test/creator/README.md Normal file
View File

@@ -0,0 +1,179 @@
# CREATOR / xattr automated test
This test validates `PUBLIC\CREATOR.EXE` against the MARS-NWE file metadata
stored in Linux extended attributes. It also performs an optional readback as
`NOPASSUSER`, so the generated metadata and effective rights can be checked from
a normal-user context.
## Requirements
Install the current DOS tools into the normal test locations:
```text
SYS:PUBLIC\CREATOR.EXE
SYS:PUBLIC\RIGHTS.EXE
SYS:PUBLIC\DLYSTRT.EXE
SYS:NPUBLIC\NDIR.EXE
SYS:NPUBLIC\RIGHTS.EXE
SYS:NPUBLIC\FLAG.EXE
SYS:NPUBLIC\GRANT.EXE
```
For the Linux collector install the `attr` package, so `getfattr` is available.
The optional user-context phase expects these accounts to exist:
```text
SUPERVISOR
NOPASSUSER
MARIO
```
`MARIO` is used as the creator/modifier/archiver object name in the test data.
## Files used by the test
All DOS scripts are expected at the root of `F:`:
```text
F:\CIXSTA.BAT
F:\CIXC.BAT
F:\CIXZIP.BAT
```
`CIXC.BAT` and `DLYSTRT.EXE` are copied to `C:\CIXTMP` before the delayed
logout/login helper is started. `CIXSTA.BAT` stays on `F:` and is run again as
`F:\CIXSTA.BAT PART2` after the helper has logged `SUPERVISOR` back in.
Generated directories:
```text
F:\CIXTEST test tree
F:\CIXCMP result tree
C:\CIXTMP temporary local helper/output directory
```
## DOS flow
Run as `SUPERVISOR`.
For the full test, including the `NOPASSUSER` readback, set the Supervisor
password first:
```text
SET LGNTPWD=your-supervisor-password
F:\CIXSTA
```
Without `LGNTPWD`, the Supervisor-only CREATOR/xattr part can still be run, but
the delayed user-context phase is skipped.
When the delayed helper finishes, it starts:
```text
F:\CIXSTA PART2
```
Wait until the screen shows:
```text
CIXSTA PART2 fertig.
```
Then run the Linux-side collector:
```sh
sudo ./cix_collect_xattr.sh
```
Finally package the DOS-side result tree:
```text
F:\CIXZIP
```
Result ZIP:
```text
F:\CIXCMP\CIXSTA.ZIP
```
Linux package with server log:
```sh
sudo ./mars_packtest_v3.sh cixsta 5 mario
```
## What CIXSTA does
```text
S_SUP.TXT:
PUBLIC\CREATOR ... /CREATOR MARIO
PUBLIC\CREATOR ... /MODIFIER MARIO
Expected xattr: user.mars_nwe.fileinfo
S_ARCH.TXT:
PUBLIC\CREATOR ... /ARCHIVE MARIO
Expected xattr: user.mars_nwe.archive
S_ALL.TXT:
PUBLIC\CREATOR ... /ALL MARIO 2026-05-25 16:12:00
Expected xattrs: user.mars_nwe.fileinfo and user.mars_nwe.archive
```
The scripts also grant `NOPASSUSER` read/file-scan rights and collect readback
output as that user:
```text
UNOV\*.OUT NPUBLIC\RIGHTS readback as NOPASSUSER
UPUB\*.OUT PUBLIC\RIGHTS readback as NOPASSUSER
UCREATOR\*.OUT PUBLIC\CREATOR /SHOW readback as NOPASSUSER
UCOMP.LOG FC comparison of UNOV vs UPUB
HELPER.TXT delayed helper phase log
```
## Important DOS outputs
```text
F:\CIXCMP\RUN.LOG
F:\CIXCMP\SUMMARY.TXT
F:\CIXCMP\PRE\*.OUT
F:\CIXCMP\POST\*.OUT
F:\CIXCMP\UNOV\*.OUT
F:\CIXCMP\UPUB\*.OUT
F:\CIXCMP\UCREATOR\*.OUT
F:\CIXCMP\UCOMP.LOG
F:\CIXCMP\HELPER.TXT
```
## Important Linux outputs
The collector writes DOS/ZIP-safe 8.3 file names under `F:\CIXCMP\LINUX`
(`/var/mars_nwe/SYS/CIXCMP/LINUX` on Linux):
```text
collecto.txt collector metadata
files.txt enumerated files/directories
stat.txt Linux stat information
xattr_na.txt xattr names only
getfattr.txt full xattr dump with hex values
xattr_fo.txt filtered mars/nwe/netware/creator/archive-related xattrs
```
The expected interesting xattrs are:
```text
user.mars_nwe.fileinfo
user.mars_nwe.archive
```
## Expected good result
A good run has:
```text
UCOMP.LOG: all FC comparisons report no differences
UCREATOR\*.OUT: CREATOR /SHOW prints readable Attributes and Rights mask
LINUX\getfattr.txt: S_SUP.TXT has fileinfo, S_ARCH.TXT has archive,
S_ALL.TXT has both fileinfo and archive
```

View File

@@ -0,0 +1,85 @@
#!/bin/sh
#
# cix_collect_xattr.sh
#
# Linux-side collector for the CIXSTA CREATOR/xattr test.
#
# Run as root after CIXSTA.BAT/PART2 and before CIXZIP.BAT:
# sudo ./cix_collect_xattr.sh
#
# The output names intentionally use DOS/ZIP-safe 8.3 names because the
# DOS-side ZIP step may truncate long names in F:\CIXCMP\LINUX.
#
set -eu
SYS=${SYS:-/var/mars_nwe/SYS}
TREE=${TREE:-$SYS/CIXTEST}
OUT=${OUT:-$SYS/CIXCMP/LINUX}
mkdir -p "$OUT"
INFO="$OUT/collecto.txt"
FILES="$OUT/files.txt"
STAT="$OUT/stat.txt"
XATTR_NAMES="$OUT/xattr_na.txt"
GETFATTR="$OUT/getfattr.txt"
XATTR_FOCUS="$OUT/xattr_fo.txt"
{
echo "CIX CREATOR xattr/stat collection"
echo "Created: $(date)"
echo "Tree: $TREE"
echo "Output: $OUT"
echo
} > "$INFO"
if ! command -v getfattr >/dev/null 2>&1; then
echo "ERROR: getfattr not installed. Install the attr package." | tee "$OUT/getfattr_missing.txt"
exit 1
fi
if [ ! -d "$TREE" ]; then
echo "ERROR: test tree not found: $TREE" | tee "$OUT/tree_missing.txt"
exit 1
fi
find "$TREE" -xdev -print | sort > "$FILES"
{
echo "path|uid|gid|mode|size|mtime|ctime|atime"
while IFS= read -r p; do
stat -c '%n|%u|%g|%a|%s|%y|%z|%x' "$p"
done < "$FILES"
} > "$STAT"
{
while IFS= read -r p; do
echo "### $p"
getfattr -m - --absolute-names "$p" 2>/dev/null || true
echo
done < "$FILES"
} > "$XATTR_NAMES"
{
while IFS= read -r p; do
echo "### $p"
getfattr -d -m - -e hex --absolute-names "$p" 2>/dev/null || true
echo
done < "$FILES"
} > "$GETFATTR"
grep -iE 'mars|nwe|netware|trust|owner|creator|modifier|archiv|fileinfo|dos|attr' \
"$GETFATTR" > "$XATTR_FOCUS" || true
chmod -R a+r "$OUT"
cat <<EOF2
Wrote:
$INFO
$FILES
$STAT
$XATTR_NAMES
$GETFATTR
$XATTR_FOCUS
EOF2

37
test/deploy.sh Normal file
View File

@@ -0,0 +1,37 @@
#!/usr/bin/env bash
set -euo pipefail
SRC="/home/mario/mars/mars-nwe-build/dosutils/net.exe"
SYS="/var/mars_nwe/SYS"
# Nur unsere aktuell getesteten Open-Source-Tools überschreiben:
install -m 0644 "$SRC" "$SYS/public/login.exe"
install -m 0644 "$SRC" "$SYS/login/login.exe"
install -m 0644 "$SRC" "$SYS/public/map.exe"
install -m 0644 "$SRC" "$SYS/login/map.exe"
install -m 0644 "$SRC" "$SYS/public/slist.exe"
install -m 0644 "$SRC" "$SYS/login/slist.exe"
install -m 0644 "$SRC" "$SYS/public/pathins.exe"
install -m 0644 "$SRC" "$SYS/public/pathdel.exe"
install -m 0644 "$SRC" "$SYS/public/path.exe"
install -m 0644 "$SRC" "$SYS/public/flag.exe"
install -m 0644 "$SRC" "$SYS/public/flagdir.exe"
install -m 0644 "$SRC" "$SYS/public/rights.exe"
install -m 0644 "$SRC" "$SYS/public/grant.exe"
install -m 0644 "$SRC" "$SYS/public/revoke.exe"
install -m 0644 "$SRC" "$SYS/public/remove.exe"
install -m 0644 "$SRC" "$SYS/public/ndir.exe"
# Optional nur wenn du gerade diese Open-Source-Version testen willst:
# install -m 0644 "$SRC" "$SYS/public/passwd.exe"
# install -m 0644 "$SRC" "$SYS/public/capture.exe"
# install -m 0644 "$SRC" "$SYS/public/endcap.exe"
# install -m 0644 "$SRC" "$SYS/public/logout.exe"
install -m 0644 "$SRC" "$SYS/public/tests.exe"
echo "deployed selected Open Source DOS utils from: $SRC"

63
test/filer/FILCMPN.BAT Normal file
View File

@@ -0,0 +1,63 @@
@ECHO OFF
REM FILCMPN.BAT
REM Repeat comparison of FILER PRE/POST output files.
REM
REM Run after FILPREN.BAT, manual NPUBLIC\FILER, and FILPOSTN.BAT.
CLS
ECHO === FILCMPN: Compare FILER PRE/POST outputs ===
ECHO.
ECHO Unterschiede sind OK, wenn sie bewusst in FILER erzeugt wurden.
ECHO.
PAUSE
CLS
ECHO === C01 FLAG A.TXT ===
FC F:\TFILE\PRE\FLAGA.OUT F:\TFILE\POST\FLAGA.OUT
ECHO.
PAUSE
CLS
ECHO === C02 FLAG B.TXT ===
FC F:\TFILE\PRE\FLAGB.OUT F:\TFILE\POST\FLAGB.OUT
ECHO.
PAUSE
CLS
ECHO === C03 FLAG KEEP.TXT ===
FC F:\TFILE\PRE\FLAGK.OUT F:\TFILE\POST\FLAGK.OUT
ECHO.
PAUSE
CLS
ECHO === C04 NDIR ===
FC F:\TFILE\PRE\NDIR.OUT F:\TFILE\POST\NDIR.OUT
ECHO.
PAUSE
CLS
ECHO === C05 DATES ===
FC F:\TFILE\PRE\DATES.OUT F:\TFILE\POST\DATES.OUT
ECHO.
PAUSE
CLS
ECHO === C06 NDIR RIGHTS ===
FC F:\TFILE\PRE\RIGHTS.OUT F:\TFILE\POST\RIGHTS.OUT
ECHO.
PAUSE
CLS
ECHO === C07 RIGHTS Directory ===
FC F:\TFILE\PRE\TRUST.OUT F:\TFILE\POST\TRUST.OUT
ECHO.
PAUSE
CLS
ECHO === C08 RIGHTS A.TXT ===
FC F:\TFILE\PRE\TRUSTA.OUT F:\TFILE\POST\TRUSTA.OUT
ECHO.
PAUSE
CLS
ECHO === FILCMPN fertig ===

149
test/filer/FILPOSTN.BAT Normal file
View File

@@ -0,0 +1,149 @@
@ECHO OFF
REM FILPOSTN.BAT
REM Novell-only FILER post-test readback and compare for MARS NWE.
REM
REM Run this after manual NPUBLIC\FILER test.
REM
REM Vergleicht:
REM F:\TFILE\PRE\*.OUT
REM F:\TFILE\POST\*.OUT
CLS
ECHO === FILPOSTN: Novell FILER Post-Test Compare ===
ECHO.
ECHO Dieses Script erzeugt POST-Ausgaben und vergleicht sie mit PRE.
ECHO Unterschiede sind OK, wenn du in FILER bewusst etwas geaendert hast.
ECHO Unerwartete Unterschiede bitte gegen Serverlog pruefen.
ECHO.
PAUSE
CLS
ECHO === Q01: POST-Ausgaben erzeugen ===
ECHO Schreibe POST\FLAGA.OUT
NPUBLIC\FLAG F:\TFILE\A.TXT > F:\TFILE\POST\FLAGA.OUT
ECHO Schreibe POST\FLAGB.OUT
NPUBLIC\FLAG F:\TFILE\B.TXT > F:\TFILE\POST\FLAGB.OUT
ECHO Schreibe POST\FLAGK.OUT
NPUBLIC\FLAG F:\TFILE\KEEP.TXT > F:\TFILE\POST\FLAGK.OUT
ECHO Schreibe POST\FLAGC.OUT
NPUBLIC\FLAG F:\TFILE\SUBDIR\C.TXT > F:\TFILE\POST\FLAGC.OUT
ECHO Schreibe POST\NDIR.OUT
NPUBLIC\NDIR F:\TFILE > F:\TFILE\POST\NDIR.OUT
ECHO Schreibe POST\DATES.OUT
NPUBLIC\NDIR F:\TFILE /DATES > F:\TFILE\POST\DATES.OUT
ECHO Schreibe POST\RIGHTS.OUT
NPUBLIC\NDIR F:\TFILE /RIGHTS > F:\TFILE\POST\RIGHTS.OUT
ECHO Schreibe POST\TRUST.OUT
NPUBLIC\RIGHTS F:\TFILE > F:\TFILE\POST\TRUST.OUT
ECHO Schreibe POST\TRUSTA.OUT
NPUBLIC\RIGHTS F:\TFILE\A.TXT > F:\TFILE\POST\TRUSTA.OUT
ECHO.
PAUSE
CLS
ECHO === Q02: Vergleich FLAG A.TXT ===
FC F:\TFILE\PRE\FLAGA.OUT F:\TFILE\POST\FLAGA.OUT
ECHO.
PAUSE
CLS
ECHO === Q03: Vergleich FLAG B.TXT ===
FC F:\TFILE\PRE\FLAGB.OUT F:\TFILE\POST\FLAGB.OUT
ECHO.
PAUSE
CLS
ECHO === Q04: Vergleich FLAG KEEP.TXT ===
FC F:\TFILE\PRE\FLAGK.OUT F:\TFILE\POST\FLAGK.OUT
ECHO.
PAUSE
CLS
ECHO === Q05: Vergleich NDIR ===
FC F:\TFILE\PRE\NDIR.OUT F:\TFILE\POST\NDIR.OUT
ECHO.
PAUSE
CLS
ECHO === Q06: Vergleich DATES ===
FC F:\TFILE\PRE\DATES.OUT F:\TFILE\POST\DATES.OUT
ECHO.
PAUSE
CLS
ECHO === Q07: Vergleich NDIR RIGHTS ===
FC F:\TFILE\PRE\RIGHTS.OUT F:\TFILE\POST\RIGHTS.OUT
ECHO.
PAUSE
CLS
ECHO === Q08: Vergleich RIGHTS Directory ===
FC F:\TFILE\PRE\TRUST.OUT F:\TFILE\POST\TRUST.OUT
ECHO.
PAUSE
CLS
ECHO === Q09: Vergleich RIGHTS A.TXT ===
FC F:\TFILE\PRE\TRUSTA.OUT F:\TFILE\POST\TRUSTA.OUT
ECHO.
PAUSE
CLS
ECHO === Q10: POST-Ausgaben anzeigen: FLAG A ===
TYPE F:\TFILE\POST\FLAGA.OUT
ECHO.
PAUSE
CLS
ECHO === Q11: POST-Ausgaben anzeigen: FLAG B ===
TYPE F:\TFILE\POST\FLAGB.OUT
ECHO.
PAUSE
CLS
ECHO === Q12: POST-Ausgaben anzeigen: FLAG KEEP ===
TYPE F:\TFILE\POST\FLAGK.OUT
ECHO.
PAUSE
CLS
ECHO === Q13: POST NDIR ===
TYPE F:\TFILE\POST\NDIR.OUT
ECHO.
PAUSE
CLS
ECHO === Q14: POST DATES ===
TYPE F:\TFILE\POST\DATES.OUT
ECHO.
PAUSE
CLS
ECHO === Q15: Cleanup Attribute ===
NPUBLIC\FLAG F:\TFILE\A.TXT N
NPUBLIC\FLAG F:\TFILE\B.TXT N
NPUBLIC\FLAG F:\TFILE\KEEP.TXT N
NPUBLIC\FLAG F:\TFILE\SUBDIR\C.TXT N
ECHO.
PAUSE
CLS
ECHO === Q16: Final NDIR ===
NPUBLIC\NDIR F:\TFILE
ECHO.
PAUSE
CLS
ECHO === FILPOSTN fertig ===
ECHO.
ECHO Vergleichsdateien liegen hier:
ECHO F:\TFILE\PRE\*.OUT
ECHO F:\TFILE\POST\*.OUT
ECHO.
ECHO Im Serverlog pruefen:
ECHO FILER Info-Readback
ECHO NCP22/25 change bits bei Aenderungen
ECHO NCP22/25 Set Directory/File Information
ECHO xattr-Metadaten falls FILER passende Felder setzt
ECHO keine unerwarteten Completion Codes
ECHO.

153
test/filer/FILPREN.BAT Normal file
View File

@@ -0,0 +1,153 @@
@ECHO OFF
REM FILPREN.BAT
REM Novell-only FILER pre-test setup for MARS NWE.
REM
REM Run this first, then run NPUBLIC\FILER manually.
REM After exiting FILER, run FILPOSTN.BAT.
REM
REM Testordner:
REM F:\TFILE
REM
REM Vergleichsdateien:
REM F:\TFILE\PRE\*.OUT
REM F:\TFILE\POST\*.OUT
REM
REM Wichtig:
REM Die Ausgaben werden per Redirect in Dateien geschrieben, damit
REM FILPOSTN.BAT sie spaeter mit FC vergleichen kann.
CLS
ECHO === FILPREN: Novell FILER Pre-Test ===
ECHO.
ECHO Schrittfolge:
ECHO 1. FILPREN.BAT ausfuehren
ECHO 2. NPUBLIC\FILER manuell starten
ECHO 3. In FILER F:\TFILE pruefen/aendern
ECHO 4. FILPOSTN.BAT ausfuehren
ECHO.
PAUSE
CLS
ECHO === P00: Testordner vorbereiten ===
F:
CD \
REM --- Clean generated test/result directories (contents only). ---
IF EXIST TFILE\NUL DELTREE /Y TFILE\*.*
IF NOT EXIST TFILE MD TFILE
CD TFILE
IF NOT EXIST PRE MD PRE
IF NOT EXIST POST MD POST
ECHO FILER TEST A > A.TXT
ECHO FILER TEST B > B.TXT
ECHO FILER KEEP > KEEP.TXT
IF NOT EXIST SUBDIR MD SUBDIR
ECHO FILER SUB C > SUBDIR\C.TXT
CD \
ECHO.
ECHO Angelegt/geprueft:
ECHO F:\TFILE\A.TXT
ECHO F:\TFILE\B.TXT
ECHO F:\TFILE\KEEP.TXT
ECHO F:\TFILE\SUBDIR\C.TXT
ECHO F:\TFILE\PRE
ECHO F:\TFILE\POST
ECHO.
PAUSE
CLS
ECHO === P01: Alte Vergleichsausgaben loeschen ===
DEL F:\TFILE\PRE\*.OUT
DEL F:\TFILE\POST\*.OUT
ECHO.
PAUSE
CLS
ECHO === P02: Attribute normalisieren ===
NPUBLIC\FLAG F:\TFILE\A.TXT N
NPUBLIC\FLAG F:\TFILE\B.TXT N
NPUBLIC\FLAG F:\TFILE\KEEP.TXT N
NPUBLIC\FLAG F:\TFILE\SUBDIR\C.TXT N
ECHO.
PAUSE
CLS
ECHO === P03: Referenz-Attribute vor FILER setzen ===
ECHO A.TXT: +H
ECHO B.TXT: +RO
ECHO KEEP.TXT: +A
NPUBLIC\FLAG F:\TFILE\A.TXT +H
NPUBLIC\FLAG F:\TFILE\B.TXT +RO
NPUBLIC\FLAG F:\TFILE\KEEP.TXT +A
ECHO.
PAUSE
CLS
ECHO === P04: PRE-Ausgaben erzeugen ===
ECHO Schreibe PRE\FLAGA.OUT
NPUBLIC\FLAG F:\TFILE\A.TXT > F:\TFILE\PRE\FLAGA.OUT
ECHO Schreibe PRE\FLAGB.OUT
NPUBLIC\FLAG F:\TFILE\B.TXT > F:\TFILE\PRE\FLAGB.OUT
ECHO Schreibe PRE\FLAGK.OUT
NPUBLIC\FLAG F:\TFILE\KEEP.TXT > F:\TFILE\PRE\FLAGK.OUT
ECHO Schreibe PRE\NDIR.OUT
NPUBLIC\NDIR F:\TFILE > F:\TFILE\PRE\NDIR.OUT
ECHO Schreibe PRE\DATES.OUT
NPUBLIC\NDIR F:\TFILE /DATES > F:\TFILE\PRE\DATES.OUT
ECHO Schreibe PRE\RIGHTS.OUT
NPUBLIC\NDIR F:\TFILE /RIGHTS > F:\TFILE\PRE\RIGHTS.OUT
ECHO Schreibe PRE\TRUST.OUT
NPUBLIC\RIGHTS F:\TFILE > F:\TFILE\PRE\TRUST.OUT
ECHO Schreibe PRE\TRUSTA.OUT
NPUBLIC\RIGHTS F:\TFILE\A.TXT > F:\TFILE\PRE\TRUSTA.OUT
ECHO.
PAUSE
CLS
ECHO === P05: PRE-Ausgaben kurz anzeigen ===
ECHO --- PRE FLAG A ---
TYPE F:\TFILE\PRE\FLAGA.OUT
ECHO.
PAUSE
CLS
ECHO === P06: PRE FLAG B ===
TYPE F:\TFILE\PRE\FLAGB.OUT
ECHO.
PAUSE
CLS
ECHO === P07: PRE FLAG KEEP ===
TYPE F:\TFILE\PRE\FLAGK.OUT
ECHO.
PAUSE
CLS
ECHO === P08: PRE NDIR ===
TYPE F:\TFILE\PRE\NDIR.OUT
ECHO.
PAUSE
CLS
ECHO === P09: PRE DATES ===
TYPE F:\TFILE\PRE\DATES.OUT
ECHO.
PAUSE
CLS
ECHO === FILPREN fertig ===
ECHO.
ECHO Jetzt manuell starten:
ECHO.
ECHO NPUBLIC\FILER
ECHO.
ECHO In FILER:
ECHO - zu F:\TFILE wechseln
ECHO - A.TXT, B.TXT, KEEP.TXT, SUBDIR ansehen
ECHO - Attribute/Informationen aendern, wenn moeglich
ECHO - FILER verlassen
ECHO.
ECHO Danach ausfuehren:
ECHO.
ECHO FILPOSTN.BAT
ECHO.

33
test/filer/FILTSTM.TST Normal file
View File

@@ -0,0 +1,33 @@
# FILTSTM.TST
# MARS/dosutils FILER regression notes/spec.
#
# Test flow:
#
# 1. `FILPREN.BAT`
# - creates F:\TFILE
# - writes baseline output files to F:\TFILE\PRE\*.OUT
#
# 2. manual `NPUBLIC\FILER`
# - inspect/change files in F:\TFILE
#
# 3. `FILPOSTN.BAT`
# - writes post-FILER output files to F:\TFILE\POST\*.OUT
# - compares PRE vs POST with FC
#
# 4. optional `FILCMPN.BAT`
# - repeats only the comparisons
#
#
MANUAL FILER CHANGE SET:
Recommended controlled changes:
A.TXT toggle Hidden
B.TXT toggle Read Only
KEEP.TXT toggle Archive Needed
For a readback-only pass, inspect the same entries but do not save changes.
FILPOSTN.BAT should then show no FC differences.
Expected:
# - FC reports no differences if FILER was only inspected.
# - FC reports intentional differences if attributes/metadata were changed.

211
test/filer/FILTSTN.BAT Normal file
View File

@@ -0,0 +1,211 @@
@ECHO OFF
REM FILTSTN.BAT
REM Novell-only FILER baseline / manual GUI test prep for MARS NWE.
REM
REM NPUBLIC = originale Novell Tools
REM PUBLIC = MARS/dosutils Tools
REM
REM Testordner:
REM F:\TFILE
REM
REM Ziel:
REM - Testdaten fuer NPUBLIC\FILER vorbereiten
REM - Attribute/Rechte/Datum-Readback vor und nach FILER pruefen
REM - Serverlog fuer NCP22/25 Set Directory/File Information,
REM NCP22/1E Info-Readback, NCP23/F3/F4 und NCP87 beobachten
REM
REM FILER ist ein DOS-GUI-Tool. Der eigentliche FILER-Test ist manuell.
CLS
ECHO === FILTSTN: Novell FILER Manual Baseline ===
ECHO.
ECHO Dieses Script bereitet F:\TFILE vor und startet danach NPUBLIC\FILER.
ECHO.
ECHO In FILER dann manuell:
ECHO 1. Zu F:\TFILE wechseln
ECHO 2. File/Directory Information fuer A.TXT, B.TXT, SUBDIR ansehen
ECHO 3. Attribute/Informationen aendern, wenn moeglich
ECHO 4. FILER verlassen
ECHO 5. Danach Readback-Sektionen im Script weiterlaufen lassen
ECHO.
PAUSE
CLS
ECHO === F00: Testordner vorbereiten ===
F:
CD \
REM --- Clean generated test/result directories (contents only). ---
IF EXIST TFILE\NUL DELTREE /Y TFILE\*.*
IF NOT EXIST TFILE MD TFILE
CD TFILE
ECHO FILER TEST A > A.TXT
ECHO FILER TEST B > B.TXT
ECHO FILER KEEP > KEEP.TXT
IF NOT EXIST SUBDIR MD SUBDIR
ECHO FILER SUB C > SUBDIR\C.TXT
CD \
ECHO.
ECHO Angelegt/geprueft:
ECHO F:\TFILE\A.TXT
ECHO F:\TFILE\B.TXT
ECHO F:\TFILE\KEEP.TXT
ECHO F:\TFILE\SUBDIR\C.TXT
ECHO.
PAUSE
CLS
ECHO === F01: Attribute normalisieren ===
NPUBLIC\FLAG F:\TFILE\A.TXT N
NPUBLIC\FLAG F:\TFILE\B.TXT N
NPUBLIC\FLAG F:\TFILE\KEEP.TXT N
NPUBLIC\FLAG F:\TFILE\SUBDIR\C.TXT N
ECHO.
PAUSE
CLS
ECHO === F02: Ausgangszustand FLAG ===
NPUBLIC\FLAG F:\TFILE\A.TXT
ECHO.
NPUBLIC\FLAG F:\TFILE\B.TXT
ECHO.
NPUBLIC\FLAG F:\TFILE\KEEP.TXT
ECHO.
PAUSE
CLS
ECHO === F03: Ausgangszustand NDIR ===
NPUBLIC\NDIR F:\TFILE
ECHO.
PAUSE
CLS
ECHO === F04: Ausgangszustand NDIR /DATES ===
NPUBLIC\NDIR F:\TFILE /DATES
ECHO.
PAUSE
CLS
ECHO === F05: Ausgangszustand NDIR /RIGHTS ===
NPUBLIC\NDIR F:\TFILE /RIGHTS
ECHO.
PAUSE
CLS
ECHO === F06: Ausgangszustand RIGHTS ===
NPUBLIC\RIGHTS F:\TFILE
ECHO.
NPUBLIC\RIGHTS F:\TFILE\A.TXT
ECHO.
PAUSE
CLS
ECHO === F07: Referenz-Attribute vor FILER setzen ===
ECHO A.TXT: +H
ECHO B.TXT: +RO
ECHO KEEP.TXT: +A
NPUBLIC\FLAG F:\TFILE\A.TXT +H
NPUBLIC\FLAG F:\TFILE\B.TXT +RO
NPUBLIC\FLAG F:\TFILE\KEEP.TXT +A
ECHO.
PAUSE
CLS
ECHO === F08: Readback nach FLAG vor FILER ===
NPUBLIC\FLAG F:\TFILE\A.TXT
ECHO.
NPUBLIC\FLAG F:\TFILE\B.TXT
ECHO.
NPUBLIC\FLAG F:\TFILE\KEEP.TXT
ECHO.
PAUSE
CLS
ECHO === F09: NDIR /DATES nach FLAG vor FILER ===
NPUBLIC\NDIR F:\TFILE /DATES
ECHO.
PAUSE
CLS
ECHO === F10: Jetzt NPUBLIC\FILER manuell testen ===
ECHO.
ECHO Hinweise fuer FILER:
ECHO - Directory auf F:\TFILE setzen
ECHO - A.TXT, B.TXT, KEEP.TXT, SUBDIR ansehen
ECHO - File/Directory Information anzeigen
ECHO - Wenn moeglich Attribute aendern:
ECHO A.TXT Hidden toggeln
ECHO B.TXT Read Only toggeln
ECHO KEEP.TXT Archive Needed toggeln
ECHO - Optional Directory Information von SUBDIR ansehen
ECHO - Danach FILER beenden
ECHO.
PAUSE
NPUBLIC\FILER
ECHO.
ECHO FILER beendet.
PAUSE
CLS
ECHO === F11: Readback FLAG nach FILER ===
NPUBLIC\FLAG F:\TFILE\A.TXT
ECHO.
NPUBLIC\FLAG F:\TFILE\B.TXT
ECHO.
NPUBLIC\FLAG F:\TFILE\KEEP.TXT
ECHO.
NPUBLIC\FLAG F:\TFILE\SUBDIR\C.TXT
ECHO.
PAUSE
CLS
ECHO === F12: Readback NDIR nach FILER ===
NPUBLIC\NDIR F:\TFILE
ECHO.
PAUSE
CLS
ECHO === F13: Readback NDIR /DATES nach FILER ===
NPUBLIC\NDIR F:\TFILE /DATES
ECHO.
PAUSE
CLS
ECHO === F14: Readback NDIR /RIGHTS nach FILER ===
NPUBLIC\NDIR F:\TFILE /RIGHTS
ECHO.
PAUSE
CLS
ECHO === F15: Readback RIGHTS nach FILER ===
NPUBLIC\RIGHTS F:\TFILE
ECHO.
NPUBLIC\RIGHTS F:\TFILE\A.TXT
ECHO.
PAUSE
CLS
ECHO === F16: Cleanup Attribute ===
NPUBLIC\FLAG F:\TFILE\A.TXT N
NPUBLIC\FLAG F:\TFILE\B.TXT N
NPUBLIC\FLAG F:\TFILE\KEEP.TXT N
NPUBLIC\FLAG F:\TFILE\SUBDIR\C.TXT N
ECHO.
PAUSE
CLS
ECHO === F17: Final NDIR ===
NPUBLIC\NDIR F:\TFILE
ECHO.
PAUSE
CLS
ECHO === FILTSTN fertig ===
ECHO.
ECHO Im Serverlog pruefen:
ECHO FILER Info-Readback
ECHO NCP22/25 change bits bei Aenderungen
ECHO NCP22/25 Set Directory/File Information
ECHO xattr-Metadaten falls FILER passende Felder setzt
ECHO keine unerwarteten Completion Codes
ECHO.

172
test/filer/README.md Normal file
View File

@@ -0,0 +1,172 @@
# FILER tests
Manual Novell FILER baseline with pre/post output comparison.
## Files
| File | Purpose |
| --- | --- |
| `FILPREN.BAT` | Pre-FILER setup and baseline output capture. |
| `FILPOSTN.BAT` | Post-FILER output capture, compare, and cleanup. |
| `FILCMPN.BAT` | Repeat PRE/POST comparisons only. |
| `FILTSTM.TST` | MARS/dosutils regression notes/spec for the scenario. |
## Test flow
```text
FILPREN.BAT
NPUBLIC\FILER
FILPOSTN.BAT
```
Optional repeat compare:
```text
FILCMPN.BAT
```
## Output comparison
`FILPREN.BAT` writes baseline files to:
```text
F:\TFILE\PRE\*.OUT
```
`FILPOSTN.BAT` writes post-FILER files to:
```text
F:\TFILE\POST\*.OUT
```
Then `FC` compares:
```text
FLAGA.OUT
FLAGB.OUT
FLAGK.OUT
NDIR.OUT
DATES.OUT
RIGHTS.OUT
TRUST.OUT
TRUSTA.OUT
```
No differences are expected if FILER was only used for inspection.
Intentional differences are expected if attributes or metadata were changed in FILER.
## Manual changes to perform in FILER
The FILER screen starts at `MARS\SYS:NPUBLIC`. Use the menu to navigate and make a small, controlled change set.
### 1. Go to the test directory
Use:
```text
Select Current Directory
```
Change to:
```text
F:\TFILE
```
or the equivalent NetWare path:
```text
MARS\SYS:TFILE
```
Then use:
```text
Directory Contents
```
You should see:
```text
A.TXT
B.TXT
KEEP.TXT
SUBDIR
```
### 2. Inspect file and directory information
Open/inspect the information screen for:
```text
A.TXT
B.TXT
KEEP.TXT
SUBDIR
SUBDIR\C.TXT
```
Just opening these screens should exercise the server info-readback paths without changing anything.
### 3. Make one or more intentional attribute changes
Use FILER to change only a few obvious attributes, so the `PRE` versus `POST` compare is easy to understand.
Suggested changes:
```text
A.TXT Hidden: toggle
B.TXT Read Only: toggle
KEEP.TXT Archive Needed: toggle
```
If FILER allows editing directory attributes, also inspect `SUBDIR`, but keep directory changes minimal.
### 4. Optional no-change pass
For a pure readback test, do not change anything in FILER. Then `FILPOSTN.BAT` should show no `FC` differences except harmless output/date formatting differences.
### 5. Expected compare results
After leaving FILER, run:
```text
FILPOSTN.BAT
```
Expected results:
```text
No FILER changes:
FC should report no differences for the PRE/POST files.
Changed A.TXT Hidden:
FLAGA.OUT, NDIR.OUT, DATES.OUT may differ.
Changed B.TXT Read Only:
FLAGB.OUT, NDIR.OUT, DATES.OUT may differ.
Changed KEEP.TXT Archive Needed:
FLAGK.OUT, NDIR.OUT, DATES.OUT may differ.
Changed rights/trustees:
RIGHTS.OUT and/or TRUST*.OUT may differ.
```
The important part is that the differences match the intentional FILER changes and the server log shows no unexpected completion codes.
## Server log focus
Look for:
```text
NCP22/25
Set Directory/File Information
change bits
nwp_stat
nw_optain_file_dir_info
nw_search_file_dir
build_d_i
```

101
test/flag/FLGC.BAT Normal file
View File

@@ -0,0 +1,101 @@
@ECHO OFF
REM FLGC.BAT - helper for FLGTSTA user-context FLAG tests.
C:
CD \FLGTMP
ECHO FLGC helper started. > C:\FLGTMP\HELPER.TXT
ECHO Running FLAG as NOPASSUSER, then relogging SUPERVISOR. >> C:\FLGTMP\HELPER.TXT
LOGOUT > C:\FLGTMP\D00_LOG.OUT
LOGIN NOPASSUSER > C:\FLGTMP\D01_LGIN.OUT
F:
CD \
ECHO Starting U10 read...
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT N > NUL
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT > C:\FLGTMP\UNOV\U10_READ.OUT
PUBLIC\FLAG F:\FLGTEST\ALPHA.TXT > C:\FLGTMP\UPUB\U10_READ.OUT
ECHO Starting U11 N...
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT +H > NUL
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT N > C:\FLGTMP\UNOV\U11_N.OUT
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT +H > NUL
PUBLIC\FLAG F:\FLGTEST\ALPHA.TXT N > C:\FLGTMP\UPUB\U11_N.OUT
ECHO Starting U12 H...
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT N > NUL
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT +H > C:\FLGTMP\UNOV\U12_H.OUT
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT >> C:\FLGTMP\UNOV\U12_H.OUT
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT N > NUL
PUBLIC\FLAG F:\FLGTEST\ALPHA.TXT +H > C:\FLGTMP\UPUB\U12_H.OUT
PUBLIC\FLAG F:\FLGTEST\ALPHA.TXT >> C:\FLGTMP\UPUB\U12_H.OUT
ECHO Starting U13 RO...
NPUBLIC\FLAG F:\FLGTEST\BETA.TXT N > NUL
NPUBLIC\FLAG F:\FLGTEST\BETA.TXT +RO > C:\FLGTMP\UNOV\U13_RO.OUT
NPUBLIC\FLAG F:\FLGTEST\BETA.TXT >> C:\FLGTMP\UNOV\U13_RO.OUT
NPUBLIC\FLAG F:\FLGTEST\BETA.TXT N > NUL
PUBLIC\FLAG F:\FLGTEST\BETA.TXT +RO > C:\FLGTMP\UPUB\U13_RO.OUT
PUBLIC\FLAG F:\FLGTEST\BETA.TXT >> C:\FLGTMP\UPUB\U13_RO.OUT
ECHO Starting U14 A...
NPUBLIC\FLAG F:\FLGTEST\GAMMA.DAT N > NUL
NPUBLIC\FLAG F:\FLGTEST\GAMMA.DAT +A > C:\FLGTMP\UNOV\U14_A.OUT
NPUBLIC\FLAG F:\FLGTEST\GAMMA.DAT >> C:\FLGTMP\UNOV\U14_A.OUT
NPUBLIC\FLAG F:\FLGTEST\GAMMA.DAT N > NUL
PUBLIC\FLAG F:\FLGTEST\GAMMA.DAT +A > C:\FLGTMP\UPUB\U14_A.OUT
PUBLIC\FLAG F:\FLGTEST\GAMMA.DAT >> C:\FLGTMP\UPUB\U14_A.OUT
ECHO Starting U15 SY...
NPUBLIC\FLAG F:\FLGTEST\DELTA.BIN N > NUL
NPUBLIC\FLAG F:\FLGTEST\DELTA.BIN +SY > C:\FLGTMP\UNOV\U15_SY.OUT
NPUBLIC\FLAG F:\FLGTEST\DELTA.BIN >> C:\FLGTMP\UNOV\U15_SY.OUT
NPUBLIC\FLAG F:\FLGTEST\DELTA.BIN N > NUL
PUBLIC\FLAG F:\FLGTEST\DELTA.BIN +SY > C:\FLGTMP\UPUB\U15_SY.OUT
PUBLIC\FLAG F:\FLGTEST\DELTA.BIN >> C:\FLGTMP\UPUB\U15_SY.OUT
ECHO Starting U16 DI RI...
NPUBLIC\FLAG F:\FLGTEST\EPS.TXT N > NUL
NPUBLIC\FLAG F:\FLGTEST\EPS.TXT +DI +RI > C:\FLGTMP\UNOV\U16_DIRI.OUT
NPUBLIC\FLAG F:\FLGTEST\EPS.TXT >> C:\FLGTMP\UNOV\U16_DIRI.OUT
NPUBLIC\FLAG F:\FLGTEST\EPS.TXT N > NUL
PUBLIC\FLAG F:\FLGTEST\EPS.TXT +DI +RI > C:\FLGTMP\UPUB\U16_DIRI.OUT
PUBLIC\FLAG F:\FLGTEST\EPS.TXT >> C:\FLGTMP\UPUB\U16_DIRI.OUT
ECHO Starting U17 mixed...
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT N > NUL
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT +H +RO +A > C:\FLGTMP\UNOV\U17_MIX.OUT
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT >> C:\FLGTMP\UNOV\U17_MIX.OUT
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT N > NUL
PUBLIC\FLAG F:\FLGTEST\ALPHA.TXT +H +RO +A > C:\FLGTMP\UPUB\U17_MIX.OUT
PUBLIC\FLAG F:\FLGTEST\ALPHA.TXT >> C:\FLGTMP\UPUB\U17_MIX.OUT
ECHO Starting U18 clear...
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT +H +RO +A > NUL
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT -H -RO -A > C:\FLGTMP\UNOV\U18_CLR.OUT
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT >> C:\FLGTMP\UNOV\U18_CLR.OUT
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT +H +RO +A > NUL
PUBLIC\FLAG F:\FLGTEST\ALPHA.TXT -H -RO -A > C:\FLGTMP\UPUB\U18_CLR.OUT
PUBLIC\FLAG F:\FLGTEST\ALPHA.TXT >> C:\FLGTMP\UPUB\U18_CLR.OUT
ECHO Starting U90 missing...
NPUBLIC\FLAG F:\FLGTEST\NOFILE.TXT > C:\FLGTMP\UNOV\U90_MISS.OUT
PUBLIC\FLAG F:\FLGTEST\NOFILE.TXT > C:\FLGTMP\UPUB\U90_MISS.OUT
LOGOUT > C:\FLGTMP\D02_LGOT.OUT
F:
CD \
IF EXIST \LOGIN\LOGIN.EXE GOTO HAVELOGIN
ECHO F:\LOGIN\LOGIN.EXE not found. >> C:\FLGTMP\HELPER.TXT
GOTO END
:HAVELOGIN
F:\LOGIN\LOGIN SUPERVISOR /PWD:%LGNTPWD% > C:\FLGTMP\D03_LGSU.OUT
F:
CD \
IF EXIST \FLGTSTA.BAT GOTO QUEUEP2
ECHO F: not restored or FLGTSTA missing. >> C:\FLGTMP\HELPER.TXT
GOTO END
:QUEUEP2
C:
CD \FLGTMP
DLYSTRT /T:2 F:\FLGTSTA.BAT PART2 > C:\FLGTMP\D04_P2.OUT
:END

191
test/flag/FLGTSTA.BAT Normal file
View File

@@ -0,0 +1,191 @@
@ECHO OFF
REM FLGTSTA.BAT
REM FLAG compare test.
REM
REM Direct part:
REM OUT = Novell baseline using \NPUBLIC\FLAG
REM PUBOUT = our implementation using \PUBLIC\FLAG
REM
REM User-context part:
REM NOPASSUSER logs in via DLYSTRT helper and runs the same effective tests.
REM UNOV = Novell FLAG as NOPASSUSER
REM UPUB = Public FLAG as NOPASSUSER
REM
REM For the automatic NOPASSUSER block set:
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: FLGTSTA [PART2]
GOTO END
:PART1
F:
CD \
REM --- Clean generated test/result directories. ---
IF EXIST FLGTEST\NUL DELTREE /Y FLGTEST\*.*
IF EXIST FLGCMP\NUL DELTREE /Y FLGCMP\*.*
IF EXIST FLGTMP\NUL DELTREE /Y FLGTMP\*.*
IF NOT EXIST FLGTEST\NUL MD FLGTEST
IF NOT EXIST FLGTMP\NUL MD FLGTMP
IF NOT EXIST FLGCMP\NUL MD FLGCMP
IF NOT EXIST FLGCMP\OUT\NUL MD FLGCMP\OUT
IF NOT EXIST FLGCMP\PUBOUT\NUL MD FLGCMP\PUBOUT
IF NOT EXIST FLGCMP\SETUP\NUL MD FLGCMP\SETUP
IF NOT EXIST FLGCMP\UNOV\NUL MD FLGCMP\UNOV
IF NOT EXIST FLGCMP\UPUB\NUL MD FLGCMP\UPUB
IF NOT EXIST FLGCMP\USETUP\NUL MD FLGCMP\USETUP
IF EXIST F:\FLGCMP\RUN.LOG DEL F:\FLGCMP\RUN.LOG
IF EXIST F:\FLGCMP\SUMMARY.TXT DEL F:\FLGCMP\SUMMARY.TXT
IF EXIST F:\FLGCMP\COMPARE.LOG DEL F:\FLGCMP\COMPARE.LOG
IF EXIST F:\FLGCMP\UCOMP.LOG DEL F:\FLGCMP\UCOMP.LOG
IF EXIST F:\FLGCMP\FLGTSTA.ZIP DEL F:\FLGCMP\FLGTSTA.ZIP
IF EXIST F:\FLGCMP\ZIP.LOG DEL F:\FLGCMP\ZIP.LOG
ECHO FLGTSTA FLAG compare > F:\FLGCMP\RUN.LOG
ECHO Direct compare: NPUBLIC\FLAG vs PUBLIC\FLAG. >> F:\FLGCMP\RUN.LOG
ECHO User context: NOPASSUSER via DLYSTRT if LGNTPWD is set. >> F:\FLGCMP\RUN.LOG
ECHO. >> F:\FLGCMP\RUN.LOG
ECHO ALPHA FILE > F:\FLGTEST\ALPHA.TXT
ECHO BETA FILE > F:\FLGTEST\BETA.TXT
ECHO GAMMA FILE > F:\FLGTEST\GAMMA.DAT
ECHO DELTA FILE > F:\FLGTEST\DELTA.BIN
ECHO EPS FILE > F:\FLGTEST\EPS.TXT
ECHO Starting D10 read normal...
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT N > NUL
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT > F:\FLGCMP\OUT\D10_READ.OUT
PUBLIC\FLAG F:\FLGTEST\ALPHA.TXT > F:\FLGCMP\PUBOUT\D10_READ.OUT
ECHO Starting D11 FLAG N...
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT +H > NUL
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT N > F:\FLGCMP\OUT\D11_N.OUT
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT +H > NUL
PUBLIC\FLAG F:\FLGTEST\ALPHA.TXT N > F:\FLGCMP\PUBOUT\D11_N.OUT
ECHO Starting D12 +H...
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT N > NUL
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT +H > F:\FLGCMP\OUT\D12_H.OUT
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT >> F:\FLGCMP\OUT\D12_H.OUT
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT N > NUL
PUBLIC\FLAG F:\FLGTEST\ALPHA.TXT +H > F:\FLGCMP\PUBOUT\D12_H.OUT
PUBLIC\FLAG F:\FLGTEST\ALPHA.TXT >> F:\FLGCMP\PUBOUT\D12_H.OUT
ECHO Starting D13 +RO...
NPUBLIC\FLAG F:\FLGTEST\BETA.TXT N > NUL
NPUBLIC\FLAG F:\FLGTEST\BETA.TXT +RO > F:\FLGCMP\OUT\D13_RO.OUT
NPUBLIC\FLAG F:\FLGTEST\BETA.TXT >> F:\FLGCMP\OUT\D13_RO.OUT
NPUBLIC\FLAG F:\FLGTEST\BETA.TXT N > NUL
PUBLIC\FLAG F:\FLGTEST\BETA.TXT +RO > F:\FLGCMP\PUBOUT\D13_RO.OUT
PUBLIC\FLAG F:\FLGTEST\BETA.TXT >> F:\FLGCMP\PUBOUT\D13_RO.OUT
ECHO Starting D14 +A...
NPUBLIC\FLAG F:\FLGTEST\GAMMA.DAT N > NUL
NPUBLIC\FLAG F:\FLGTEST\GAMMA.DAT +A > F:\FLGCMP\OUT\D14_A.OUT
NPUBLIC\FLAG F:\FLGTEST\GAMMA.DAT >> F:\FLGCMP\OUT\D14_A.OUT
NPUBLIC\FLAG F:\FLGTEST\GAMMA.DAT N > NUL
PUBLIC\FLAG F:\FLGTEST\GAMMA.DAT +A > F:\FLGCMP\PUBOUT\D14_A.OUT
PUBLIC\FLAG F:\FLGTEST\GAMMA.DAT >> F:\FLGCMP\PUBOUT\D14_A.OUT
ECHO Starting D15 +SY...
NPUBLIC\FLAG F:\FLGTEST\DELTA.BIN N > NUL
NPUBLIC\FLAG F:\FLGTEST\DELTA.BIN +SY > F:\FLGCMP\OUT\D15_SY.OUT
NPUBLIC\FLAG F:\FLGTEST\DELTA.BIN >> F:\FLGCMP\OUT\D15_SY.OUT
NPUBLIC\FLAG F:\FLGTEST\DELTA.BIN N > NUL
PUBLIC\FLAG F:\FLGTEST\DELTA.BIN +SY > F:\FLGCMP\PUBOUT\D15_SY.OUT
PUBLIC\FLAG F:\FLGTEST\DELTA.BIN >> F:\FLGCMP\PUBOUT\D15_SY.OUT
ECHO Starting D16 +DI +RI...
NPUBLIC\FLAG F:\FLGTEST\EPS.TXT N > NUL
NPUBLIC\FLAG F:\FLGTEST\EPS.TXT +DI +RI > F:\FLGCMP\OUT\D16_DIRI.OUT
NPUBLIC\FLAG F:\FLGTEST\EPS.TXT >> F:\FLGCMP\OUT\D16_DIRI.OUT
NPUBLIC\FLAG F:\FLGTEST\EPS.TXT N > NUL
PUBLIC\FLAG F:\FLGTEST\EPS.TXT +DI +RI > F:\FLGCMP\PUBOUT\D16_DIRI.OUT
PUBLIC\FLAG F:\FLGTEST\EPS.TXT >> F:\FLGCMP\PUBOUT\D16_DIRI.OUT
ECHO Starting D17 mixed flags...
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT N > NUL
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT +H +RO +A > F:\FLGCMP\OUT\D17_MIX.OUT
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT >> F:\FLGCMP\OUT\D17_MIX.OUT
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT N > NUL
PUBLIC\FLAG F:\FLGTEST\ALPHA.TXT +H +RO +A > F:\FLGCMP\PUBOUT\D17_MIX.OUT
PUBLIC\FLAG F:\FLGTEST\ALPHA.TXT >> F:\FLGCMP\PUBOUT\D17_MIX.OUT
ECHO Starting D18 clear flags...
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT +H +RO +A > NUL
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT -H -RO -A > F:\FLGCMP\OUT\D18_CLR.OUT
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT >> F:\FLGCMP\OUT\D18_CLR.OUT
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT +H +RO +A > NUL
PUBLIC\FLAG F:\FLGTEST\ALPHA.TXT -H -RO -A > F:\FLGCMP\PUBOUT\D18_CLR.OUT
PUBLIC\FLAG F:\FLGTEST\ALPHA.TXT >> F:\FLGCMP\PUBOUT\D18_CLR.OUT
ECHO Starting D90 missing file...
NPUBLIC\FLAG F:\FLGTEST\NOFILE.TXT > F:\FLGCMP\OUT\D90_MISS.OUT
PUBLIC\FLAG F:\FLGTEST\NOFILE.TXT > F:\FLGCMP\PUBOUT\D90_MISS.OUT
ECHO Comparing direct FLAG outputs... > F:\FLGCMP\COMPARE.LOG
FOR %%F IN (D10_READ.OUT D11_N.OUT D12_H.OUT D13_RO.OUT D14_A.OUT D15_SY.OUT D16_DIRI.OUT D17_MIX.OUT D18_CLR.OUT D90_MISS.OUT) DO FC F:\FLGCMP\OUT\%%F F:\FLGCMP\PUBOUT\%%F >> F:\FLGCMP\COMPARE.LOG
REM Prepare user-context test tree.
ECHO Preparing NOPASSUSER FLAG matrix... >> F:\FLGCMP\RUN.LOG
NPUBLIC\FLAG F:\FLGTEST\ALPHA.TXT N > NUL
NPUBLIC\FLAG F:\FLGTEST\BETA.TXT N > NUL
NPUBLIC\FLAG F:\FLGTEST\GAMMA.DAT N > NUL
NPUBLIC\FLAG F:\FLGTEST\DELTA.BIN N > NUL
NPUBLIC\FLAG F:\FLGTEST\EPS.TXT N > NUL
NPUBLIC\GRANT ALL FOR F:\FLGTEST TO USER NOPASSUSER > F:\FLGCMP\SETUP\S01_GRD.OUT
NPUBLIC\GRANT ALL FOR F:\FLGTEST\ALPHA.TXT TO USER NOPASSUSER /FILES > F:\FLGCMP\SETUP\S02_GRF.OUT
NPUBLIC\GRANT ALL FOR F:\FLGTEST\BETA.TXT TO USER NOPASSUSER /FILES >> F:\FLGCMP\SETUP\S02_GRF.OUT
NPUBLIC\GRANT ALL FOR F:\FLGTEST\GAMMA.DAT TO USER NOPASSUSER /FILES >> F:\FLGCMP\SETUP\S02_GRF.OUT
NPUBLIC\GRANT ALL FOR F:\FLGTEST\DELTA.BIN TO USER NOPASSUSER /FILES >> F:\FLGCMP\SETUP\S02_GRF.OUT
NPUBLIC\GRANT ALL FOR F:\FLGTEST\EPS.TXT TO USER NOPASSUSER /FILES >> F:\FLGCMP\SETUP\S02_GRF.OUT
IF "%LGNTPWD%"=="" GOTO NEEDPWD
IF EXIST C:\FLGTMP DELTREE /Y C:\FLGTMP > NUL
MD C:\FLGTMP
MD C:\FLGTMP\UNOV
MD C:\FLGTMP\UPUB
COPY F:\FLGC.BAT C:\FLGTMP\FLGC.BAT > NUL
COPY F:\PUBLIC\DLYSTRT.EXE C:\FLGTMP\DLYSTRT.EXE > NUL
C:
CD \FLGTMP
DLYSTRT /T:2 FLGC.BAT
GOTO END
:NEEDPWD
ECHO LGNTPWD is not set. User-context FLAG block skipped. >> F:\FLGCMP\RUN.LOG
ECHO.
ECHO LGNTPWD ist nicht gesetzt. User-Kontext wurde nicht gestartet.
ECHO Beispiel:
ECHO SET LGNTPWD=dein-supervisor-passwort
ECHO FLGTSTA
GOTO END
:PART2
F:
CD \
IF NOT EXIST FLGCMP\UNOV\NUL MD FLGCMP\UNOV
IF NOT EXIST FLGCMP\UPUB\NUL MD FLGCMP\UPUB
IF EXIST F:\FLGCMP\UCOMP.LOG DEL F:\FLGCMP\UCOMP.LOG
COPY C:\FLGTMP\UNOV\*.OUT F:\FLGCMP\UNOV > NUL
COPY C:\FLGTMP\UPUB\*.OUT F:\FLGCMP\UPUB > NUL
IF EXIST C:\FLGTMP\HELPER.TXT COPY C:\FLGTMP\HELPER.TXT F:\FLGCMP > NUL
ECHO Comparing NOPASSUSER FLAG outputs... > F:\FLGCMP\UCOMP.LOG
FOR %%F IN (U10_READ.OUT U11_N.OUT U12_H.OUT U13_RO.OUT U14_A.OUT U15_SY.OUT U16_DIRI.OUT U17_MIX.OUT U18_CLR.OUT U90_MISS.OUT) DO FC F:\FLGCMP\UNOV\%%F F:\FLGCMP\UPUB\%%F >> F:\FLGCMP\UCOMP.LOG
ECHO FLGTSTA summary > F:\FLGCMP\SUMMARY.TXT
ECHO Direct compare: F:\FLGCMP\COMPARE.LOG >> F:\FLGCMP\SUMMARY.TXT
ECHO User compare: F:\FLGCMP\UCOMP.LOG >> F:\FLGCMP\SUMMARY.TXT
ECHO Optional: FLGTZIP ausfuehren. >> F:\FLGCMP\SUMMARY.TXT
ECHO.
ECHO FLGTSTA PART2 fertig. Optional FLGTZIP ausfuehren.
GOTO END
:END

25
test/flag/FLGTZIP.BAT Normal file
View File

@@ -0,0 +1,25 @@
@ECHO OFF
REM FLGTZIP.BAT
REM Optional packer for FLGTSTA result files.
REM Requires ZIP.EXE in PATH or current directory.
F:
CD \FLGCMP
IF EXIST FLGTSTA.ZIP DEL FLGTSTA.ZIP
IF EXIST ZIP.LOG DEL ZIP.LOG
ECHO Creating FLGTSTA.ZIP > ZIP.LOG
ZIP -r FLGTSTA.ZIP RUN.LOG SUMMARY.TXT COMPARE.LOG UCOMP.LOG HELPER.TXT OUT PUBOUT SETUP UNOV UPUB USETUP >> ZIP.LOG
REM Cleanup generated test directories after ZIP.
ECHO Cleaning generated test directories... >> ZIP.LOG
IF EXIST \FLGTEST\NUL DELTREE /Y \FLGTEST >> ZIP.LOG
IF EXIST \FLGTMP\NUL DELTREE /Y \FLGTMP >> ZIP.LOG
CD \
ECHO.
ECHO ZIP step finished.
ECHO Check:
ECHO F:\FLGCMP\FLGTSTA.ZIP
ECHO F:\FLGCMP\ZIP.LOG
ECHO.

50
test/flag/README.md Normal file
View File

@@ -0,0 +1,50 @@
# FLAG automated compare test
Compares Novell `NPUBLIC\FLAG` against the current `PUBLIC\FLAG`.
## Run
For the direct compare only:
```text
FLGTSTA
```
For the full automatic NOPASSUSER context block, set the maintainer-login
password first:
```text
SET LGNTPWD=your-supervisor-password
FLGTSTA
```
`FLGTSTA` starts `C:\FLGTMP\FLGC.BAT` through `DLYSTRT`, logs in as
`NOPASSUSER`, runs `NPUBLIC\FLAG` and `PUBLIC\FLAG`, logs back in as
`SUPERVISOR` with `F:\LOGIN\LOGIN /PWD:`, and then queues
`FLGTSTA PART2`.
Package manually:
```text
FLGTZIP
```
## Result directories
```text
F:\FLGCMP\OUT Novell FLAG direct baseline
F:\FLGCMP\PUBOUT PUBLIC FLAG direct output
F:\FLGCMP\COMPARE.LOG direct FC compare
F:\FLGCMP\UNOV Novell FLAG as NOPASSUSER
F:\FLGCMP\UPUB PUBLIC FLAG as NOPASSUSER
F:\FLGCMP\UCOMP.LOG NOPASSUSER FC compare
```
## Coverage
- `FLAG` display
- `FLAG ... N`
- set/clear `H`, `RO`, `A`, `SY`, `DI`, `RI`
- mixed flag combinations
- missing-file behavior
- same cases as `NOPASSUSER`

79
test/flagdir/FDGC.BAT Normal file
View File

@@ -0,0 +1,79 @@
@ECHO OFF
REM FDGC.BAT - helper for FDGTSTA user-context FLAGDIR tests.
C:
CD \FDGTMP
ECHO FDGC helper started. > C:\FDGTMP\HELPER.TXT
ECHO Running FLAGDIR as NOPASSUSER, then relogging SUPERVISOR. >> C:\FDGTMP\HELPER.TXT
LOGOUT > C:\FDGTMP\D00_LOG.OUT
LOGIN NOPASSUSER > C:\FDGTMP\D01_LGIN.OUT
F:
CD \
ECHO Starting U10 read...
NPUBLIC\FLAGDIR F:\FDGTEST\DIRA Normal > NUL
NPUBLIC\FLAGDIR F:\FDGTEST\DIRA > C:\FDGTMP\UNOV\U10_READ.OUT
PUBLIC\FLAGDIR F:\FDGTEST\DIRA > C:\FDGTMP\UPUB\U10_READ.OUT
ECHO Starting U11 Hidden...
NPUBLIC\FLAGDIR F:\FDGTEST\DIRA Normal > NUL
NPUBLIC\FLAGDIR F:\FDGTEST\DIRA Hidden > C:\FDGTMP\UNOV\U11_HID.OUT
NPUBLIC\FLAGDIR F:\FDGTEST\DIRA >> C:\FDGTMP\UNOV\U11_HID.OUT
NPUBLIC\FLAGDIR F:\FDGTEST\DIRA Normal > NUL
PUBLIC\FLAGDIR F:\FDGTEST\DIRA Hidden > C:\FDGTMP\UPUB\U11_HID.OUT
PUBLIC\FLAGDIR F:\FDGTEST\DIRA >> C:\FDGTMP\UPUB\U11_HID.OUT
ECHO Starting U12 System...
NPUBLIC\FLAGDIR F:\FDGTEST\DIRB Normal > NUL
NPUBLIC\FLAGDIR F:\FDGTEST\DIRB System > C:\FDGTMP\UNOV\U12_SYS.OUT
NPUBLIC\FLAGDIR F:\FDGTEST\DIRB >> C:\FDGTMP\UNOV\U12_SYS.OUT
NPUBLIC\FLAGDIR F:\FDGTEST\DIRB Normal > NUL
PUBLIC\FLAGDIR F:\FDGTEST\DIRB System > C:\FDGTMP\UPUB\U12_SYS.OUT
PUBLIC\FLAGDIR F:\FDGTEST\DIRB >> C:\FDGTMP\UPUB\U12_SYS.OUT
ECHO Starting U13 Purge...
NPUBLIC\FLAGDIR F:\FDGTEST\DIRC Normal > NUL
NPUBLIC\FLAGDIR F:\FDGTEST\DIRC Purge > C:\FDGTMP\UNOV\U13_PUR.OUT
NPUBLIC\FLAGDIR F:\FDGTEST\DIRC >> C:\FDGTMP\UNOV\U13_PUR.OUT
NPUBLIC\FLAGDIR F:\FDGTEST\DIRC Normal > NUL
PUBLIC\FLAGDIR F:\FDGTEST\DIRC Purge > C:\FDGTMP\UPUB\U13_PUR.OUT
PUBLIC\FLAGDIR F:\FDGTEST\DIRC >> C:\FDGTMP\UPUB\U13_PUR.OUT
ECHO Starting U14 Delete/Rename inhibit...
NPUBLIC\FLAGDIR F:\FDGTEST\DIRB\SUB Normal > NUL
NPUBLIC\FLAGDIR F:\FDGTEST\DIRB\SUB Deleteinhibit Renameinhibit > C:\FDGTMP\UNOV\U14_DIRI.OUT
NPUBLIC\FLAGDIR F:\FDGTEST\DIRB\SUB >> C:\FDGTMP\UNOV\U14_DIRI.OUT
NPUBLIC\FLAGDIR F:\FDGTEST\DIRB\SUB Normal > NUL
PUBLIC\FLAGDIR F:\FDGTEST\DIRB\SUB Deleteinhibit Renameinhibit > C:\FDGTMP\UPUB\U14_DIRI.OUT
PUBLIC\FLAGDIR F:\FDGTEST\DIRB\SUB >> C:\FDGTMP\UPUB\U14_DIRI.OUT
ECHO Starting U15 Normal reset...
NPUBLIC\FLAGDIR F:\FDGTEST\DIRA Hidden System > NUL
NPUBLIC\FLAGDIR F:\FDGTEST\DIRA Normal > C:\FDGTMP\UNOV\U15_NORM.OUT
NPUBLIC\FLAGDIR F:\FDGTEST\DIRA >> C:\FDGTMP\UNOV\U15_NORM.OUT
NPUBLIC\FLAGDIR F:\FDGTEST\DIRA Hidden System > NUL
PUBLIC\FLAGDIR F:\FDGTEST\DIRA Normal > C:\FDGTMP\UPUB\U15_NORM.OUT
PUBLIC\FLAGDIR F:\FDGTEST\DIRA >> C:\FDGTMP\UPUB\U15_NORM.OUT
ECHO Starting U90 missing...
NPUBLIC\FLAGDIR F:\FDGTEST\MISSING > C:\FDGTMP\UNOV\U90_MISS.OUT
PUBLIC\FLAGDIR F:\FDGTEST\MISSING > C:\FDGTMP\UPUB\U90_MISS.OUT
LOGOUT > C:\FDGTMP\D02_LGOT.OUT
F:
CD \
IF EXIST \LOGIN\LOGIN.EXE GOTO HAVELOGIN
ECHO F:\LOGIN\LOGIN.EXE not found. >> C:\FDGTMP\HELPER.TXT
GOTO END
:HAVELOGIN
F:\LOGIN\LOGIN SUPERVISOR /PWD:%LGNTPWD% > C:\FDGTMP\D03_LGSU.OUT
F:
CD \
IF EXIST \FDGTSTA.BAT GOTO QUEUEP2
ECHO F: not restored or FDGTSTA missing. >> C:\FDGTMP\HELPER.TXT
GOTO END
:QUEUEP2
C:
CD \FDGTMP
DLYSTRT /T:2 F:\FDGTSTA.BAT PART2 > C:\FDGTMP\D04_P2.OUT
:END

147
test/flagdir/FDGTSTA.BAT Normal file
View File

@@ -0,0 +1,147 @@
@ECHO OFF
REM FDGTSTA.BAT
REM FLAGDIR compare test.
REM
REM Direct part:
REM OUT = Novell baseline using \NPUBLIC\FLAGDIR
REM PUBOUT = our implementation using \PUBLIC\FLAGDIR
REM
REM User-context part:
REM NOPASSUSER logs in via DLYSTRT helper and runs the same effective tests.
IF "%1"=="" GOTO PART1
IF "%1"=="PART2" GOTO PART2
IF "%1"=="part2" GOTO PART2
IF "%1"=="Part2" GOTO PART2
ECHO Usage: FDGTSTA [PART2]
GOTO END
:PART1
F:
CD \
IF EXIST FDGTEST\NUL DELTREE /Y FDGTEST\*.*
IF EXIST FDGCMP\NUL DELTREE /Y FDGCMP\*.*
IF EXIST FDGTMP\NUL DELTREE /Y FDGTMP\*.*
IF NOT EXIST FDGTEST\NUL MD FDGTEST
IF NOT EXIST FDGTEST\DIRA\NUL MD FDGTEST\DIRA
IF NOT EXIST FDGTEST\DIRB\NUL MD FDGTEST\DIRB
IF NOT EXIST FDGTEST\DIRC\NUL MD FDGTEST\DIRC
IF NOT EXIST FDGTEST\DIRB\SUB\NUL MD FDGTEST\DIRB\SUB
IF NOT EXIST FDGCMP\NUL MD FDGCMP
IF NOT EXIST FDGCMP\OUT\NUL MD FDGCMP\OUT
IF NOT EXIST FDGCMP\PUBOUT\NUL MD FDGCMP\PUBOUT
IF NOT EXIST FDGCMP\SETUP\NUL MD FDGCMP\SETUP
IF NOT EXIST FDGCMP\UNOV\NUL MD FDGCMP\UNOV
IF NOT EXIST FDGCMP\UPUB\NUL MD FDGCMP\UPUB
IF EXIST F:\FDGCMP\RUN.LOG DEL F:\FDGCMP\RUN.LOG
IF EXIST F:\FDGCMP\SUMMARY.TXT DEL F:\FDGCMP\SUMMARY.TXT
IF EXIST F:\FDGCMP\COMPARE.LOG DEL F:\FDGCMP\COMPARE.LOG
IF EXIST F:\FDGCMP\UCOMP.LOG DEL F:\FDGCMP\UCOMP.LOG
IF EXIST F:\FDGCMP\FDGTSTA.ZIP DEL F:\FDGCMP\FDGTSTA.ZIP
IF EXIST F:\FDGCMP\ZIP.LOG DEL F:\FDGCMP\ZIP.LOG
ECHO SUB FILE > F:\FDGTEST\DIRB\SUB\SUB.TXT
ECHO FDGTSTA FLAGDIR compare > F:\FDGCMP\RUN.LOG
ECHO Starting D10 read normal...
NPUBLIC\FLAGDIR F:\FDGTEST\DIRA Normal > NUL
NPUBLIC\FLAGDIR F:\FDGTEST\DIRA > F:\FDGCMP\OUT\D10_READ.OUT
PUBLIC\FLAGDIR F:\FDGTEST\DIRA > F:\FDGCMP\PUBOUT\D10_READ.OUT
ECHO Starting D11 Hidden...
NPUBLIC\FLAGDIR F:\FDGTEST\DIRA Normal > NUL
NPUBLIC\FLAGDIR F:\FDGTEST\DIRA Hidden > F:\FDGCMP\OUT\D11_HID.OUT
NPUBLIC\FLAGDIR F:\FDGTEST\DIRA >> F:\FDGCMP\OUT\D11_HID.OUT
NPUBLIC\FLAGDIR F:\FDGTEST\DIRA Normal > NUL
PUBLIC\FLAGDIR F:\FDGTEST\DIRA Hidden > F:\FDGCMP\PUBOUT\D11_HID.OUT
PUBLIC\FLAGDIR F:\FDGTEST\DIRA >> F:\FDGCMP\PUBOUT\D11_HID.OUT
ECHO Starting D12 System...
NPUBLIC\FLAGDIR F:\FDGTEST\DIRB Normal > NUL
NPUBLIC\FLAGDIR F:\FDGTEST\DIRB System > F:\FDGCMP\OUT\D12_SYS.OUT
NPUBLIC\FLAGDIR F:\FDGTEST\DIRB >> F:\FDGCMP\OUT\D12_SYS.OUT
NPUBLIC\FLAGDIR F:\FDGTEST\DIRB Normal > NUL
PUBLIC\FLAGDIR F:\FDGTEST\DIRB System > F:\FDGCMP\PUBOUT\D12_SYS.OUT
PUBLIC\FLAGDIR F:\FDGTEST\DIRB >> F:\FDGCMP\PUBOUT\D12_SYS.OUT
ECHO Starting D13 Purge...
NPUBLIC\FLAGDIR F:\FDGTEST\DIRC Normal > NUL
NPUBLIC\FLAGDIR F:\FDGTEST\DIRC Purge > F:\FDGCMP\OUT\D13_PUR.OUT
NPUBLIC\FLAGDIR F:\FDGTEST\DIRC >> F:\FDGCMP\OUT\D13_PUR.OUT
NPUBLIC\FLAGDIR F:\FDGTEST\DIRC Normal > NUL
PUBLIC\FLAGDIR F:\FDGTEST\DIRC Purge > F:\FDGCMP\PUBOUT\D13_PUR.OUT
PUBLIC\FLAGDIR F:\FDGTEST\DIRC >> F:\FDGCMP\PUBOUT\D13_PUR.OUT
ECHO Starting D14 Delete/Rename inhibit...
NPUBLIC\FLAGDIR F:\FDGTEST\DIRB\SUB Normal > NUL
NPUBLIC\FLAGDIR F:\FDGTEST\DIRB\SUB Deleteinhibit Renameinhibit > F:\FDGCMP\OUT\D14_DIRI.OUT
NPUBLIC\FLAGDIR F:\FDGTEST\DIRB\SUB >> F:\FDGCMP\OUT\D14_DIRI.OUT
NPUBLIC\FLAGDIR F:\FDGTEST\DIRB\SUB Normal > NUL
PUBLIC\FLAGDIR F:\FDGTEST\DIRB\SUB Deleteinhibit Renameinhibit > F:\FDGCMP\PUBOUT\D14_DIRI.OUT
PUBLIC\FLAGDIR F:\FDGTEST\DIRB\SUB >> F:\FDGCMP\PUBOUT\D14_DIRI.OUT
ECHO Starting D15 mixed reset...
NPUBLIC\FLAGDIR F:\FDGTEST\DIRA Hidden System > NUL
NPUBLIC\FLAGDIR F:\FDGTEST\DIRA Normal > F:\FDGCMP\OUT\D15_NORM.OUT
NPUBLIC\FLAGDIR F:\FDGTEST\DIRA >> F:\FDGCMP\OUT\D15_NORM.OUT
NPUBLIC\FLAGDIR F:\FDGTEST\DIRA Hidden System > NUL
PUBLIC\FLAGDIR F:\FDGTEST\DIRA Normal > F:\FDGCMP\PUBOUT\D15_NORM.OUT
PUBLIC\FLAGDIR F:\FDGTEST\DIRA >> F:\FDGCMP\PUBOUT\D15_NORM.OUT
ECHO Starting D90 missing dir...
NPUBLIC\FLAGDIR F:\FDGTEST\MISSING > F:\FDGCMP\OUT\D90_MISS.OUT
PUBLIC\FLAGDIR F:\FDGTEST\MISSING > F:\FDGCMP\PUBOUT\D90_MISS.OUT
ECHO Comparing direct FLAGDIR outputs... > F:\FDGCMP\COMPARE.LOG
FOR %%F IN (D10_READ.OUT D11_HID.OUT D12_SYS.OUT D13_PUR.OUT D14_DIRI.OUT D15_NORM.OUT D90_MISS.OUT) DO FC F:\FDGCMP\OUT\%%F F:\FDGCMP\PUBOUT\%%F >> F:\FDGCMP\COMPARE.LOG
REM Grant NOPASSUSER enough rights for user-context directory flag tests.
NPUBLIC\GRANT ALL FOR F:\FDGTEST TO USER NOPASSUSER > F:\FDGCMP\SETUP\S01_GRD.OUT
NPUBLIC\GRANT ALL FOR F:\FDGTEST\DIRA TO USER NOPASSUSER >> F:\FDGCMP\SETUP\S01_GRD.OUT
NPUBLIC\GRANT ALL FOR F:\FDGTEST\DIRB TO USER NOPASSUSER >> F:\FDGCMP\SETUP\S01_GRD.OUT
NPUBLIC\GRANT ALL FOR F:\FDGTEST\DIRC TO USER NOPASSUSER >> F:\FDGCMP\SETUP\S01_GRD.OUT
NPUBLIC\GRANT ALL FOR F:\FDGTEST\DIRB\SUB TO USER NOPASSUSER >> F:\FDGCMP\SETUP\S01_GRD.OUT
IF "%LGNTPWD%"=="" GOTO NEEDPWD
IF EXIST C:\FDGTMP DELTREE /Y C:\FDGTMP > NUL
MD C:\FDGTMP
MD C:\FDGTMP\UNOV
MD C:\FDGTMP\UPUB
COPY F:\FDGC.BAT C:\FDGTMP\FDGC.BAT > NUL
COPY F:\PUBLIC\DLYSTRT.EXE C:\FDGTMP\DLYSTRT.EXE > NUL
C:
CD \FDGTMP
DLYSTRT /T:2 FDGC.BAT
GOTO END
:NEEDPWD
ECHO LGNTPWD is not set. User-context FLAGDIR block skipped. >> F:\FDGCMP\RUN.LOG
ECHO.
ECHO LGNTPWD ist nicht gesetzt. User-Kontext wurde nicht gestartet.
GOTO END
:PART2
F:
CD \
IF NOT EXIST FDGCMP\UNOV\NUL MD FDGCMP\UNOV
IF NOT EXIST FDGCMP\UPUB\NUL MD FDGCMP\UPUB
IF EXIST F:\FDGCMP\UCOMP.LOG DEL F:\FDGCMP\UCOMP.LOG
COPY C:\FDGTMP\UNOV\*.OUT F:\FDGCMP\UNOV > NUL
COPY C:\FDGTMP\UPUB\*.OUT F:\FDGCMP\UPUB > NUL
IF EXIST C:\FDGTMP\HELPER.TXT COPY C:\FDGTMP\HELPER.TXT F:\FDGCMP > NUL
ECHO Comparing NOPASSUSER FLAGDIR outputs... > F:\FDGCMP\UCOMP.LOG
FOR %%F IN (U10_READ.OUT U11_HID.OUT U12_SYS.OUT U13_PUR.OUT U14_DIRI.OUT U15_NORM.OUT U90_MISS.OUT) DO FC F:\FDGCMP\UNOV\%%F F:\FDGCMP\UPUB\%%F >> F:\FDGCMP\UCOMP.LOG
ECHO FDGTSTA summary > F:\FDGCMP\SUMMARY.TXT
ECHO Direct compare: F:\FDGCMP\COMPARE.LOG >> F:\FDGCMP\SUMMARY.TXT
ECHO User compare: F:\FDGCMP\UCOMP.LOG >> F:\FDGCMP\SUMMARY.TXT
ECHO Optional: FDGTZIP ausfuehren. >> F:\FDGCMP\SUMMARY.TXT
ECHO.
ECHO FDGTSTA PART2 fertig. Optional FDGTZIP ausfuehren.
GOTO END
:END

25
test/flagdir/FDGTZIP.BAT Normal file
View File

@@ -0,0 +1,25 @@
@ECHO OFF
REM FDGTZIP.BAT
REM Optional packer for FDGTSTA result files.
REM Requires ZIP.EXE in PATH or current directory.
F:
CD \FDGCMP
IF EXIST FDGTSTA.ZIP DEL FDGTSTA.ZIP
IF EXIST ZIP.LOG DEL ZIP.LOG
ECHO Creating FDGTSTA.ZIP > ZIP.LOG
ZIP -r FDGTSTA.ZIP RUN.LOG SUMMARY.TXT COMPARE.LOG UCOMP.LOG HELPER.TXT OUT PUBOUT SETUP UNOV UPUB >> ZIP.LOG
REM Cleanup generated test directories after ZIP.
ECHO Cleaning generated test directories... >> ZIP.LOG
IF EXIST \FDGTEST\NUL DELTREE /Y \FDGTEST >> ZIP.LOG
IF EXIST \FDGTMP\NUL DELTREE /Y \FDGTMP >> ZIP.LOG
CD \
ECHO.
ECHO ZIP step finished.
ECHO Check:
ECHO F:\FDGCMP\FDGTSTA.ZIP
ECHO F:\FDGCMP\ZIP.LOG
ECHO.

51
test/flagdir/README.md Normal file
View File

@@ -0,0 +1,51 @@
# FLAGDIR automated compare test
Compares Novell `NPUBLIC\FLAGDIR` against the current `PUBLIC\FLAGDIR`.
## Run
For the direct compare only:
```text
FDGTSTA
```
For the automatic NOPASSUSER context block, set the maintainer-login password:
```text
SET LGNTPWD=your-supervisor-password
FDGTSTA
```
`FDGTSTA` starts `C:\FDGTMP\FDGC.BAT` through `DLYSTRT`, logs in as
`NOPASSUSER`, runs `NPUBLIC\FLAGDIR` and `PUBLIC\FLAGDIR`, logs back in as
`SUPERVISOR` with `F:\LOGIN\LOGIN /PWD:`, and then queues
`FDGTSTA PART2`.
Package manually:
```text
FDGTZIP
```
## Result directories
```text
F:\FDGCMP\OUT Novell FLAGDIR direct baseline
F:\FDGCMP\PUBOUT PUBLIC FLAGDIR direct output
F:\FDGCMP\COMPARE.LOG direct FC compare
F:\FDGCMP\UNOV Novell FLAGDIR as NOPASSUSER
F:\FDGCMP\UPUB PUBLIC FLAGDIR as NOPASSUSER
F:\FDGCMP\UCOMP.LOG NOPASSUSER FC compare
```
## Coverage
- `FLAGDIR` display
- `Normal`
- `Hidden`
- `System`
- `Purge`
- `Deleteinhibit` / `Renameinhibit`
- missing-directory behavior
- same cases as `NOPASSUSER`

165
test/grant/GRNTC.BAT Normal file
View File

@@ -0,0 +1,165 @@
@ECHO OFF
REM GRNTC.BAT - delayed user-context GRANT readback helper.
REM Started by GRNTSTA via DLYSTRT. Runs from C:\GRNTTMP.
C:
CD \GRNTTMP
ECHO GRNTC user-context GRANT readback 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:\GRNTTMP\HELPER.TXT
GOTO RELSUP
:HAVEF
ECHO Starting G10_R as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G10 > C:\GRNTTMP\UNOV\G10_R.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G10 > C:\GRNTTMP\UPUB\G10_R.OUT
ECHO Starting G11_W as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G11 > C:\GRNTTMP\UNOV\G11_W.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G11 > C:\GRNTTMP\UPUB\G11_W.OUT
ECHO Starting G12_C as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G12 > C:\GRNTTMP\UNOV\G12_C.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G12 > C:\GRNTTMP\UPUB\G12_C.OUT
ECHO Starting G13_E as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G13 > C:\GRNTTMP\UNOV\G13_E.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G13 > C:\GRNTTMP\UPUB\G13_E.OUT
ECHO Starting G14_M as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G14 > C:\GRNTTMP\UNOV\G14_M.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G14 > C:\GRNTTMP\UPUB\G14_M.OUT
ECHO Starting G15_F as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G15 > C:\GRNTTMP\UNOV\G15_F.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G15 > C:\GRNTTMP\UPUB\G15_F.OUT
ECHO Starting G16_A as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G16 > C:\GRNTTMP\UNOV\G16_A.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G16 > C:\GRNTTMP\UPUB\G16_A.OUT
ECHO Starting G17_S as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G17 > C:\GRNTTMP\UNOV\G17_S.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G17 > C:\GRNTTMP\UPUB\G17_S.OUT
ECHO Starting G20_RF as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G20 > C:\GRNTTMP\UNOV\G20_RF.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G20 > C:\GRNTTMP\UPUB\G20_RF.OUT
ECHO Starting G21_RW as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G21 > C:\GRNTTMP\UNOV\G21_RW.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G21 > C:\GRNTTMP\UPUB\G21_RW.OUT
ECHO Starting G22_RWC as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G22 > C:\GRNTTMP\UNOV\G22_RWC.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G22 > C:\GRNTTMP\UPUB\G22_RWC.OUT
ECHO Starting G23_RWCE as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G23 > C:\GRNTTMP\UNOV\G23_RWCE.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G23 > C:\GRNTTMP\UPUB\G23_RWCE.OUT
ECHO Starting G24_RAL as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G24 > C:\GRNTTMP\UNOV\G24_RAL.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G24 > C:\GRNTTMP\UPUB\G24_RAL.OUT
ECHO Starting G25_SAL as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G25 > C:\GRNTTMP\UNOV\G25_SAL.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G25 > C:\GRNTTMP\UPUB\G25_SAL.OUT
ECHO Starting G26_ALL as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G26 > C:\GRNTTMP\UNOV\G26_ALL.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G26 > C:\GRNTTMP\UPUB\G26_ALL.OUT
ECHO Starting G27_N as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G27 > C:\GRNTTMP\UNOV\G27_N.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G27 > C:\GRNTTMP\UPUB\G27_N.OUT
ECHO Starting G30_RE as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G30 > C:\GRNTTMP\UNOV\G30_RE.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G30 > C:\GRNTTMP\UPUB\G30_RE.OUT
ECHO Starting G31_RWF as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G31 > C:\GRNTTMP\UNOV\G31_RWF.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G31 > C:\GRNTTMP\UPUB\G31_RWF.OUT
ECHO Starting G32_RCM as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G32 > C:\GRNTTMP\UNOV\G32_RCM.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G32 > C:\GRNTTMP\UPUB\G32_RCM.OUT
ECHO Starting G33_RFA as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G33 > C:\GRNTTMP\UNOV\G33_RFA.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G33 > C:\GRNTTMP\UPUB\G33_RFA.OUT
ECHO Starting G34_WCM as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G34 > C:\GRNTTMP\UNOV\G34_WCM.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G34 > C:\GRNTTMP\UPUB\G34_WCM.OUT
ECHO Starting G35_EMF as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G35 > C:\GRNTTMP\UNOV\G35_EMF.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G35 > C:\GRNTTMP\UPUB\G35_EMF.OUT
ECHO Starting G36_RMF as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G36 > C:\GRNTTMP\UNOV\G36_RMF.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G36 > C:\GRNTTMP\UPUB\G36_RMF.OUT
ECHO Starting G37_REMA as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G37 > C:\GRNTTMP\UNOV\G37_REMA.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G37 > C:\GRNTTMP\UPUB\G37_REMA.OUT
ECHO Starting G38_SR as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G38 > C:\GRNTTMP\UNOV\G38_SR.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G38 > C:\GRNTTMP\UPUB\G38_SR.OUT
ECHO Starting G39_SRF as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G39 > C:\GRNTTMP\UNOV\G39_SRF.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G39 > C:\GRNTTMP\UPUB\G39_SRF.OUT
ECHO Starting G40_SWCM as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\G40 > C:\GRNTTMP\UNOV\G40_SWCM.OUT
\PUBLIC\RIGHTS F:\GRNTEST\G40 > C:\GRNTTMP\UPUB\G40_SWCM.OUT
ECHO Starting F10_R as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\F10\T.TXT > C:\GRNTTMP\UNOV\F10_R.OUT
\PUBLIC\RIGHTS F:\GRNTEST\F10\T.TXT > C:\GRNTTMP\UPUB\F10_R.OUT
ECHO Starting F11_RF as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\F11\T.TXT > C:\GRNTTMP\UNOV\F11_RF.OUT
\PUBLIC\RIGHTS F:\GRNTEST\F11\T.TXT > C:\GRNTTMP\UPUB\F11_RF.OUT
ECHO Starting F12_RAL as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\F12\T.TXT > C:\GRNTTMP\UNOV\F12_RAL.OUT
\PUBLIC\RIGHTS F:\GRNTEST\F12\T.TXT > C:\GRNTTMP\UPUB\F12_RAL.OUT
ECHO Starting F13_ALL as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\F13\T.TXT > C:\GRNTTMP\UNOV\F13_ALL.OUT
\PUBLIC\RIGHTS F:\GRNTEST\F13\T.TXT > C:\GRNTTMP\UPUB\F13_ALL.OUT
ECHO Starting F14_N as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\F14\T.TXT > C:\GRNTTMP\UNOV\F14_N.OUT
\PUBLIC\RIGHTS F:\GRNTEST\F14\T.TXT > C:\GRNTTMP\UPUB\F14_N.OUT
ECHO Starting F15_S as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\F15\T.TXT > C:\GRNTTMP\UNOV\F15_S.OUT
\PUBLIC\RIGHTS F:\GRNTEST\F15\T.TXT > C:\GRNTTMP\UPUB\F15_S.OUT
ECHO Starting F16_SAL as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\F16\T.TXT > C:\GRNTTMP\UNOV\F16_SAL.OUT
\PUBLIC\RIGHTS F:\GRNTEST\F16\T.TXT > C:\GRNTTMP\UPUB\F16_SAL.OUT
ECHO Starting S10_R as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\S10\S1 > C:\GRNTTMP\UNOV\S10_R.OUT
\PUBLIC\RIGHTS F:\GRNTEST\S10\S1 > C:\GRNTTMP\UPUB\S10_R.OUT
ECHO Starting S11_RWC as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\S11\S1 > C:\GRNTTMP\UNOV\S11_RWC.OUT
\PUBLIC\RIGHTS F:\GRNTEST\S11\S1 > C:\GRNTTMP\UPUB\S11_RWC.OUT
ECHO Starting S12_ALL as NOPASSUSER... >> C:\GRNTTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\GRNTEST\S12\S1 > C:\GRNTTMP\UNOV\S12_ALL.OUT
\PUBLIC\RIGHTS F:\GRNTEST\S12\S1 > C:\GRNTTMP\UPUB\S12_ALL.OUT
:RELSUP
C:
CD \GRNTTMP
LOGOUT > ULOG2.OUT
F:
CD \
IF EXIST \LOGIN\LOGIN.EXE GOTO HAVELOG
ECHO F:\LOGIN\LOGIN.EXE not found. >> C:\GRNTTMP\HELPER.TXT
GOTO MANUAL
:HAVELOG
F:\LOGIN\LOGIN SUPERVISOR /PWD:%LGNTPWD% > C:\GRNTTMP\ULGSUP.OUT
F:
CD \
IF EXIST \GRNTSTA.BAT GOTO QUEUEP2
ECHO F: not restored or \GRNTSTA.BAT missing. >> C:\GRNTTMP\HELPER.TXT
GOTO MANUAL
:QUEUEP2
C:
CD \GRNTTMP
DLYSTRT /T:2 F:\GRNTSTA.BAT PART2
GOTO END
:MANUAL
ECHO Please run manually after SUPERVISOR login: >> C:\GRNTTMP\HELPER.TXT
ECHO F: >> C:\GRNTTMP\HELPER.TXT
ECHO CD \ >> C:\GRNTTMP\HELPER.TXT
ECHO GRNTSTA PART2 >> C:\GRNTTMP\HELPER.TXT
:END

491
test/grant/GRNTSTA.BAT Normal file
View File

@@ -0,0 +1,491 @@
@ECHO OFF
REM GRNTSTA.BAT
REM Automated GRANT comparison test for MARS NWE.
REM
REM Direct mode:
REM OUT = Novell baseline using \NPUBLIC\GRANT
REM PUBOUT = our implementation using \PUBLIC\GRANT
REM
REM User-context mode:
REM GRANT is run as SUPERVISOR against NOPASSUSER.
REM DLYSTRT starts C:\GRNTTMP\GRNTC.BAT after this script exits.
REM GRNTC logs in as NOPASSUSER and captures effective 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: GRNTSTA [PART2]
GOTO END
:PART1
F:
CD \
REM --- Clean generated test/result directories. ---
IF EXIST GRNTEST\*.* DELTREE /Y GRNTEST
IF EXIST GRNTCMP\*.* DELTREE /Y GRNTCMP
IF EXIST C:\GRNTTMP\*.* DELTREE /Y C:\GRNTTMP
IF NOT EXIST GRNTEST MD GRNTEST
IF NOT EXIST GRNTCMP MD GRNTCMP
IF NOT EXIST GRNTCMP\OUT MD GRNTCMP\OUT
IF NOT EXIST GRNTCMP\PUBOUT MD GRNTCMP\PUBOUT
IF NOT EXIST GRNTCMP\SETUP MD GRNTCMP\SETUP
IF NOT EXIST C:\GRNTTMP MD C:\GRNTTMP
IF NOT EXIST C:\GRNTTMP\UNOV MD C:\GRNTTMP\UNOV
IF NOT EXIST C:\GRNTTMP\UPUB MD C:\GRNTTMP\UPUB
IF NOT EXIST C:\GRNTTMP\USETUP MD C:\GRNTTMP\USETUP
ECHO GRNTSTA GRANT comparison test > F:\GRNTCMP\RUN.LOG
ECHO OUT = Novell baseline with \NPUBLIC\GRANT >> F:\GRNTCMP\RUN.LOG
ECHO PUBOUT = our implementation with \PUBLIC\GRANT >> F:\GRNTCMP\RUN.LOG
ECHO User-context target: NOPASSUSER >> F:\GRNTCMP\RUN.LOG
ECHO. >> F:\GRNTCMP\RUN.LOG
ECHO Starting D01_HELP...
\NPUBLIC\GRANT /? > F:\GRNTCMP\OUT\D01_HELP.OUT
\PUBLIC\GRANT /? > F:\GRNTCMP\PUBOUT\D01_HELP.OUT
ECHO Starting D02_NOAR...
\NPUBLIC\GRANT > F:\GRNTCMP\OUT\D02_NOAR.OUT
\PUBLIC\GRANT > F:\GRNTCMP\PUBOUT\D02_NOAR.OUT
REM --- Setup matrix directories/files. ---
IF NOT EXIST GRNTEST\G10 MD GRNTEST\G10
ECHO G10_R > F:\GRNTEST\G10\TEST.TXT
IF NOT EXIST GRNTEST\G11 MD GRNTEST\G11
ECHO G11_W > F:\GRNTEST\G11\TEST.TXT
IF NOT EXIST GRNTEST\G12 MD GRNTEST\G12
ECHO G12_C > F:\GRNTEST\G12\TEST.TXT
IF NOT EXIST GRNTEST\G13 MD GRNTEST\G13
ECHO G13_E > F:\GRNTEST\G13\TEST.TXT
IF NOT EXIST GRNTEST\G14 MD GRNTEST\G14
ECHO G14_M > F:\GRNTEST\G14\TEST.TXT
IF NOT EXIST GRNTEST\G15 MD GRNTEST\G15
ECHO G15_F > F:\GRNTEST\G15\TEST.TXT
IF NOT EXIST GRNTEST\G16 MD GRNTEST\G16
ECHO G16_A > F:\GRNTEST\G16\TEST.TXT
IF NOT EXIST GRNTEST\G17 MD GRNTEST\G17
ECHO G17_S > F:\GRNTEST\G17\TEST.TXT
IF NOT EXIST GRNTEST\G20 MD GRNTEST\G20
ECHO G20_RF > F:\GRNTEST\G20\TEST.TXT
IF NOT EXIST GRNTEST\G21 MD GRNTEST\G21
ECHO G21_RW > F:\GRNTEST\G21\TEST.TXT
IF NOT EXIST GRNTEST\G22 MD GRNTEST\G22
ECHO G22_RWC > F:\GRNTEST\G22\TEST.TXT
IF NOT EXIST GRNTEST\G23 MD GRNTEST\G23
ECHO G23_RWCE > F:\GRNTEST\G23\TEST.TXT
IF NOT EXIST GRNTEST\G24 MD GRNTEST\G24
ECHO G24_RAL > F:\GRNTEST\G24\TEST.TXT
IF NOT EXIST GRNTEST\G25 MD GRNTEST\G25
ECHO G25_SAL > F:\GRNTEST\G25\TEST.TXT
IF NOT EXIST GRNTEST\G26 MD GRNTEST\G26
ECHO G26_ALL > F:\GRNTEST\G26\TEST.TXT
IF NOT EXIST GRNTEST\G27 MD GRNTEST\G27
ECHO G27_N > F:\GRNTEST\G27\TEST.TXT
IF NOT EXIST GRNTEST\G30 MD GRNTEST\G30
ECHO G30_RE > F:\GRNTEST\G30\TEST.TXT
IF NOT EXIST GRNTEST\G31 MD GRNTEST\G31
ECHO G31_RWF > F:\GRNTEST\G31\TEST.TXT
IF NOT EXIST GRNTEST\G32 MD GRNTEST\G32
ECHO G32_RCM > F:\GRNTEST\G32\TEST.TXT
IF NOT EXIST GRNTEST\G33 MD GRNTEST\G33
ECHO G33_RFA > F:\GRNTEST\G33\TEST.TXT
IF NOT EXIST GRNTEST\G34 MD GRNTEST\G34
ECHO G34_WCM > F:\GRNTEST\G34\TEST.TXT
IF NOT EXIST GRNTEST\G35 MD GRNTEST\G35
ECHO G35_EMF > F:\GRNTEST\G35\TEST.TXT
IF NOT EXIST GRNTEST\G36 MD GRNTEST\G36
ECHO G36_RMF > F:\GRNTEST\G36\TEST.TXT
IF NOT EXIST GRNTEST\G37 MD GRNTEST\G37
ECHO G37_REMA > F:\GRNTEST\G37\TEST.TXT
IF NOT EXIST GRNTEST\G38 MD GRNTEST\G38
ECHO G38_SR > F:\GRNTEST\G38\TEST.TXT
IF NOT EXIST GRNTEST\G39 MD GRNTEST\G39
ECHO G39_SRF > F:\GRNTEST\G39\TEST.TXT
IF NOT EXIST GRNTEST\G40 MD GRNTEST\G40
ECHO G40_SWCM > F:\GRNTEST\G40\TEST.TXT
IF NOT EXIST GRNTEST\F10 MD GRNTEST\F10
ECHO F10_R > F:\GRNTEST\F10\T.TXT
IF NOT EXIST GRNTEST\F11 MD GRNTEST\F11
ECHO F11_RF > F:\GRNTEST\F11\T.TXT
IF NOT EXIST GRNTEST\F12 MD GRNTEST\F12
ECHO F12_RAL > F:\GRNTEST\F12\T.TXT
IF NOT EXIST GRNTEST\F13 MD GRNTEST\F13
ECHO F13_ALL > F:\GRNTEST\F13\T.TXT
IF NOT EXIST GRNTEST\F14 MD GRNTEST\F14
ECHO F14_N > F:\GRNTEST\F14\T.TXT
IF NOT EXIST GRNTEST\F15 MD GRNTEST\F15
ECHO F15_S > F:\GRNTEST\F15\T.TXT
IF NOT EXIST GRNTEST\F16 MD GRNTEST\F16
ECHO F16_SAL > F:\GRNTEST\F16\T.TXT
IF NOT EXIST GRNTEST\S10 MD GRNTEST\S10
IF NOT EXIST GRNTEST\S10\S1 MD GRNTEST\S10\S1
IF NOT EXIST GRNTEST\S10\S2 MD GRNTEST\S10\S2
ECHO S10_R > F:\GRNTEST\S10\S1\T.TXT
IF NOT EXIST GRNTEST\S11 MD GRNTEST\S11
IF NOT EXIST GRNTEST\S11\S1 MD GRNTEST\S11\S1
IF NOT EXIST GRNTEST\S11\S2 MD GRNTEST\S11\S2
ECHO S11_RWC > F:\GRNTEST\S11\S1\T.TXT
IF NOT EXIST GRNTEST\S12 MD GRNTEST\S12
IF NOT EXIST GRNTEST\S12\S1 MD GRNTEST\S12\S1
IF NOT EXIST GRNTEST\S12\S2 MD GRNTEST\S12\S2
ECHO S12_ALL > F:\GRNTEST\S12\S1\T.TXT
REM --- Direct GRANT output compare and leave PUBLIC state for user-context readback. ---
ECHO Starting G10_R directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G10 > F:\GRNTCMP\SETUP\G10_RNREM.OUT
\NPUBLIC\GRANT R FOR F:\GRNTEST\G10 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G10_R.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G10 > F:\GRNTCMP\SETUP\G10_RPREM.OUT
\PUBLIC\GRANT R FOR F:\GRNTEST\G10 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G10_R.OUT
ECHO Starting G11_W directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G11 > F:\GRNTCMP\SETUP\G11_WNREM.OUT
\NPUBLIC\GRANT W FOR F:\GRNTEST\G11 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G11_W.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G11 > F:\GRNTCMP\SETUP\G11_WPREM.OUT
\PUBLIC\GRANT W FOR F:\GRNTEST\G11 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G11_W.OUT
ECHO Starting G12_C directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G12 > F:\GRNTCMP\SETUP\G12_CNREM.OUT
\NPUBLIC\GRANT C FOR F:\GRNTEST\G12 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G12_C.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G12 > F:\GRNTCMP\SETUP\G12_CPREM.OUT
\PUBLIC\GRANT C FOR F:\GRNTEST\G12 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G12_C.OUT
ECHO Starting G13_E directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G13 > F:\GRNTCMP\SETUP\G13_ENREM.OUT
\NPUBLIC\GRANT E FOR F:\GRNTEST\G13 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G13_E.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G13 > F:\GRNTCMP\SETUP\G13_EPREM.OUT
\PUBLIC\GRANT E FOR F:\GRNTEST\G13 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G13_E.OUT
ECHO Starting G14_M directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G14 > F:\GRNTCMP\SETUP\G14_MNREM.OUT
\NPUBLIC\GRANT M FOR F:\GRNTEST\G14 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G14_M.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G14 > F:\GRNTCMP\SETUP\G14_MPREM.OUT
\PUBLIC\GRANT M FOR F:\GRNTEST\G14 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G14_M.OUT
ECHO Starting G15_F directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G15 > F:\GRNTCMP\SETUP\G15_FNREM.OUT
\NPUBLIC\GRANT F FOR F:\GRNTEST\G15 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G15_F.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G15 > F:\GRNTCMP\SETUP\G15_FPREM.OUT
\PUBLIC\GRANT F FOR F:\GRNTEST\G15 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G15_F.OUT
ECHO Starting G16_A directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G16 > F:\GRNTCMP\SETUP\G16_ANREM.OUT
\NPUBLIC\GRANT A FOR F:\GRNTEST\G16 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G16_A.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G16 > F:\GRNTCMP\SETUP\G16_APREM.OUT
\PUBLIC\GRANT A FOR F:\GRNTEST\G16 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G16_A.OUT
ECHO Starting G17_S directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G17 > F:\GRNTCMP\SETUP\G17_SNREM.OUT
\NPUBLIC\GRANT S FOR F:\GRNTEST\G17 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G17_S.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G17 > F:\GRNTCMP\SETUP\G17_SPREM.OUT
\PUBLIC\GRANT S FOR F:\GRNTEST\G17 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G17_S.OUT
ECHO Starting G20_RF directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G20 > F:\GRNTCMP\SETUP\G20_RFNREM.OUT
\NPUBLIC\GRANT R F FOR F:\GRNTEST\G20 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G20_RF.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G20 > F:\GRNTCMP\SETUP\G20_RFPREM.OUT
\PUBLIC\GRANT R F FOR F:\GRNTEST\G20 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G20_RF.OUT
ECHO Starting G21_RW directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G21 > F:\GRNTCMP\SETUP\G21_RWNREM.OUT
\NPUBLIC\GRANT R W FOR F:\GRNTEST\G21 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G21_RW.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G21 > F:\GRNTCMP\SETUP\G21_RWPREM.OUT
\PUBLIC\GRANT R W FOR F:\GRNTEST\G21 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G21_RW.OUT
ECHO Starting G22_RWC directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G22 > F:\GRNTCMP\SETUP\G22_RWCNREM.OUT
\NPUBLIC\GRANT R W C FOR F:\GRNTEST\G22 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G22_RWC.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G22 > F:\GRNTCMP\SETUP\G22_RWCPREM.OUT
\PUBLIC\GRANT R W C FOR F:\GRNTEST\G22 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G22_RWC.OUT
ECHO Starting G23_RWCE directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G23 > F:\GRNTCMP\SETUP\G23_RWCENREM.OUT
\NPUBLIC\GRANT R W C E FOR F:\GRNTEST\G23 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G23_RWCE.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G23 > F:\GRNTCMP\SETUP\G23_RWCEPREM.OUT
\PUBLIC\GRANT R W C E FOR F:\GRNTEST\G23 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G23_RWCE.OUT
ECHO Starting G24_RAL directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G24 > F:\GRNTCMP\SETUP\G24_RALNREM.OUT
\NPUBLIC\GRANT R W C E M F A FOR F:\GRNTEST\G24 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G24_RAL.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G24 > F:\GRNTCMP\SETUP\G24_RALPREM.OUT
\PUBLIC\GRANT R W C E M F A FOR F:\GRNTEST\G24 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G24_RAL.OUT
ECHO Starting G25_SAL directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G25 > F:\GRNTCMP\SETUP\G25_SALNREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\GRNTEST\G25 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G25_SAL.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G25 > F:\GRNTCMP\SETUP\G25_SALPREM.OUT
\PUBLIC\GRANT S R W C E M F A FOR F:\GRNTEST\G25 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G25_SAL.OUT
ECHO Starting G26_ALL directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G26 > F:\GRNTCMP\SETUP\G26_ALLNREM.OUT
\NPUBLIC\GRANT ALL FOR F:\GRNTEST\G26 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G26_ALL.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G26 > F:\GRNTCMP\SETUP\G26_ALLPREM.OUT
\PUBLIC\GRANT ALL FOR F:\GRNTEST\G26 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G26_ALL.OUT
ECHO Starting G27_N directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G27 > F:\GRNTCMP\SETUP\G27_NNREM.OUT
\NPUBLIC\GRANT N FOR F:\GRNTEST\G27 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G27_N.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G27 > F:\GRNTCMP\SETUP\G27_NPREM.OUT
\PUBLIC\GRANT N FOR F:\GRNTEST\G27 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G27_N.OUT
ECHO Starting G30_RE directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G30 > F:\GRNTCMP\SETUP\G30_RENREM.OUT
\NPUBLIC\GRANT R E FOR F:\GRNTEST\G30 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G30_RE.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G30 > F:\GRNTCMP\SETUP\G30_REPREM.OUT
\PUBLIC\GRANT R E FOR F:\GRNTEST\G30 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G30_RE.OUT
ECHO Starting G31_RWF directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G31 > F:\GRNTCMP\SETUP\G31_RWFNREM.OUT
\NPUBLIC\GRANT R W F FOR F:\GRNTEST\G31 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G31_RWF.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G31 > F:\GRNTCMP\SETUP\G31_RWFPREM.OUT
\PUBLIC\GRANT R W F FOR F:\GRNTEST\G31 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G31_RWF.OUT
ECHO Starting G32_RCM directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G32 > F:\GRNTCMP\SETUP\G32_RCMNREM.OUT
\NPUBLIC\GRANT R C M FOR F:\GRNTEST\G32 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G32_RCM.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G32 > F:\GRNTCMP\SETUP\G32_RCMPREM.OUT
\PUBLIC\GRANT R C M FOR F:\GRNTEST\G32 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G32_RCM.OUT
ECHO Starting G33_RFA directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G33 > F:\GRNTCMP\SETUP\G33_RFANREM.OUT
\NPUBLIC\GRANT R F A FOR F:\GRNTEST\G33 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G33_RFA.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G33 > F:\GRNTCMP\SETUP\G33_RFAPREM.OUT
\PUBLIC\GRANT R F A FOR F:\GRNTEST\G33 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G33_RFA.OUT
ECHO Starting G34_WCM directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G34 > F:\GRNTCMP\SETUP\G34_WCMNREM.OUT
\NPUBLIC\GRANT W C M FOR F:\GRNTEST\G34 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G34_WCM.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G34 > F:\GRNTCMP\SETUP\G34_WCMPREM.OUT
\PUBLIC\GRANT W C M FOR F:\GRNTEST\G34 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G34_WCM.OUT
ECHO Starting G35_EMF directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G35 > F:\GRNTCMP\SETUP\G35_EMFNREM.OUT
\NPUBLIC\GRANT E M F FOR F:\GRNTEST\G35 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G35_EMF.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G35 > F:\GRNTCMP\SETUP\G35_EMFPREM.OUT
\PUBLIC\GRANT E M F FOR F:\GRNTEST\G35 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G35_EMF.OUT
ECHO Starting G36_RMF directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G36 > F:\GRNTCMP\SETUP\G36_RMFNREM.OUT
\NPUBLIC\GRANT R W C M F FOR F:\GRNTEST\G36 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G36_RMF.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G36 > F:\GRNTCMP\SETUP\G36_RMFPREM.OUT
\PUBLIC\GRANT R W C M F FOR F:\GRNTEST\G36 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G36_RMF.OUT
ECHO Starting G37_REMA directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G37 > F:\GRNTCMP\SETUP\G37_REMANREM.OUT
\NPUBLIC\GRANT R E M A FOR F:\GRNTEST\G37 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G37_REMA.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G37 > F:\GRNTCMP\SETUP\G37_REMAPREM.OUT
\PUBLIC\GRANT R E M A FOR F:\GRNTEST\G37 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G37_REMA.OUT
ECHO Starting G38_SR directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G38 > F:\GRNTCMP\SETUP\G38_SRNREM.OUT
\NPUBLIC\GRANT S R FOR F:\GRNTEST\G38 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G38_SR.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G38 > F:\GRNTCMP\SETUP\G38_SRPREM.OUT
\PUBLIC\GRANT S R FOR F:\GRNTEST\G38 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G38_SR.OUT
ECHO Starting G39_SRF directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G39 > F:\GRNTCMP\SETUP\G39_SRFNREM.OUT
\NPUBLIC\GRANT S R F FOR F:\GRNTEST\G39 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G39_SRF.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G39 > F:\GRNTCMP\SETUP\G39_SRFPREM.OUT
\PUBLIC\GRANT S R F FOR F:\GRNTEST\G39 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G39_SRF.OUT
ECHO Starting G40_SWCM directory grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G40 > F:\GRNTCMP\SETUP\G40_SWCMNREM.OUT
\NPUBLIC\GRANT S W C M FOR F:\GRNTEST\G40 TO USER NOPASSUSER > F:\GRNTCMP\OUT\G40_SWCM.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\G40 > F:\GRNTCMP\SETUP\G40_SWCMPREM.OUT
\PUBLIC\GRANT S W C M FOR F:\GRNTEST\G40 TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\G40_SWCM.OUT
ECHO Starting F10_R file grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\F10\T.TXT /FILES > F:\GRNTCMP\SETUP\F10_RNREM.OUT
\NPUBLIC\GRANT R FOR F:\GRNTEST\F10\T.TXT TO USER NOPASSUSER /FILES > F:\GRNTCMP\OUT\F10_R.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\F10\T.TXT /FILES > F:\GRNTCMP\SETUP\F10_RPREM.OUT
\PUBLIC\GRANT R FOR F:\GRNTEST\F10\T.TXT TO USER NOPASSUSER /FILES > F:\GRNTCMP\PUBOUT\F10_R.OUT
ECHO Starting F11_RF file grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\F11\T.TXT /FILES > F:\GRNTCMP\SETUP\F11_RFNREM.OUT
\NPUBLIC\GRANT R F FOR F:\GRNTEST\F11\T.TXT TO USER NOPASSUSER /FILES > F:\GRNTCMP\OUT\F11_RF.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\F11\T.TXT /FILES > F:\GRNTCMP\SETUP\F11_RFPREM.OUT
\PUBLIC\GRANT R F FOR F:\GRNTEST\F11\T.TXT TO USER NOPASSUSER /FILES > F:\GRNTCMP\PUBOUT\F11_RF.OUT
ECHO Starting F12_RAL file grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\F12\T.TXT /FILES > F:\GRNTCMP\SETUP\F12_RALNREM.OUT
\NPUBLIC\GRANT R W C E M F A FOR F:\GRNTEST\F12\T.TXT TO USER NOPASSUSER /FILES > F:\GRNTCMP\OUT\F12_RAL.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\F12\T.TXT /FILES > F:\GRNTCMP\SETUP\F12_RALPREM.OUT
\PUBLIC\GRANT R W C E M F A FOR F:\GRNTEST\F12\T.TXT TO USER NOPASSUSER /FILES > F:\GRNTCMP\PUBOUT\F12_RAL.OUT
ECHO Starting F13_ALL file grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\F13\T.TXT /FILES > F:\GRNTCMP\SETUP\F13_ALLNREM.OUT
\NPUBLIC\GRANT ALL FOR F:\GRNTEST\F13\T.TXT TO USER NOPASSUSER /FILES > F:\GRNTCMP\OUT\F13_ALL.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\F13\T.TXT /FILES > F:\GRNTCMP\SETUP\F13_ALLPREM.OUT
\PUBLIC\GRANT ALL FOR F:\GRNTEST\F13\T.TXT TO USER NOPASSUSER /FILES > F:\GRNTCMP\PUBOUT\F13_ALL.OUT
ECHO Starting F14_N file grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\F14\T.TXT /FILES > F:\GRNTCMP\SETUP\F14_NNREM.OUT
\NPUBLIC\GRANT N FOR F:\GRNTEST\F14\T.TXT TO USER NOPASSUSER /FILES > F:\GRNTCMP\OUT\F14_N.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\F14\T.TXT /FILES > F:\GRNTCMP\SETUP\F14_NPREM.OUT
\PUBLIC\GRANT N FOR F:\GRNTEST\F14\T.TXT TO USER NOPASSUSER /FILES > F:\GRNTCMP\PUBOUT\F14_N.OUT
ECHO Starting F15_S file grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\F15\T.TXT /FILES > F:\GRNTCMP\SETUP\F15_SNREM.OUT
\NPUBLIC\GRANT S FOR F:\GRNTEST\F15\T.TXT TO USER NOPASSUSER /FILES > F:\GRNTCMP\OUT\F15_S.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\F15\T.TXT /FILES > F:\GRNTCMP\SETUP\F15_SPREM.OUT
\PUBLIC\GRANT S FOR F:\GRNTEST\F15\T.TXT TO USER NOPASSUSER /FILES > F:\GRNTCMP\PUBOUT\F15_S.OUT
ECHO Starting F16_SAL file grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\F16\T.TXT /FILES > F:\GRNTCMP\SETUP\F16_SALNREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\GRNTEST\F16\T.TXT TO USER NOPASSUSER /FILES > F:\GRNTCMP\OUT\F16_SAL.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\F16\T.TXT /FILES > F:\GRNTCMP\SETUP\F16_SALPREM.OUT
\PUBLIC\GRANT S R W C E M F A FOR F:\GRNTEST\F16\T.TXT TO USER NOPASSUSER /FILES > F:\GRNTCMP\PUBOUT\F16_SAL.OUT
ECHO Starting S10_R subdir grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\S10 /SUBDIRS > F:\GRNTCMP\SETUP\S10_RNREM.OUT
\NPUBLIC\GRANT R FOR F:\GRNTEST\S10 TO USER NOPASSUSER /SUBDIRECTORIES > F:\GRNTCMP\OUT\S10_R.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\S10 /SUBDIRS > F:\GRNTCMP\SETUP\S10_RPREM.OUT
\PUBLIC\GRANT R FOR F:\GRNTEST\S10 TO USER NOPASSUSER /SUBDIRECTORIES > F:\GRNTCMP\PUBOUT\S10_R.OUT
ECHO Starting S11_RWC subdir grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\S11 /SUBDIRS > F:\GRNTCMP\SETUP\S11_RWCNREM.OUT
\NPUBLIC\GRANT R W C FOR F:\GRNTEST\S11 TO USER NOPASSUSER /SUBDIRECTORIES > F:\GRNTCMP\OUT\S11_RWC.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\S11 /SUBDIRS > F:\GRNTCMP\SETUP\S11_RWCPREM.OUT
\PUBLIC\GRANT R W C FOR F:\GRNTEST\S11 TO USER NOPASSUSER /SUBDIRECTORIES > F:\GRNTCMP\PUBOUT\S11_RWC.OUT
ECHO Starting S12_ALL subdir grant...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\S12 /SUBDIRS > F:\GRNTCMP\SETUP\S12_ALLNREM.OUT
\NPUBLIC\GRANT ALL FOR F:\GRNTEST\S12 TO USER NOPASSUSER /SUBDIRECTORIES > F:\GRNTCMP\OUT\S12_ALL.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\GRNTEST\S12 /SUBDIRS > F:\GRNTCMP\SETUP\S12_ALLPREM.OUT
\PUBLIC\GRANT ALL FOR F:\GRNTEST\S12 TO USER NOPASSUSER /SUBDIRECTORIES > F:\GRNTCMP\PUBOUT\S12_ALL.OUT
ECHO Starting D90_BADR...
\NPUBLIC\GRANT BADRIGHT FOR F:\GRNTEST TO USER NOPASSUSER > F:\GRNTCMP\OUT\D90_BADR.OUT
\PUBLIC\GRANT BADRIGHT FOR F:\GRNTEST TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\D90_BADR.OUT
ECHO Starting D91_MISU...
\NPUBLIC\GRANT R F FOR F:\GRNTEST TO USER NO_SUCH_USER > F:\GRNTCMP\OUT\D91_MISU.OUT
\PUBLIC\GRANT R F FOR F:\GRNTEST TO USER NO_SUCH_USER > F:\GRNTCMP\PUBOUT\D91_MISU.OUT
ECHO Starting D92_MISP...
\NPUBLIC\GRANT R F FOR F:\GRNTEST\MISSING TO USER NOPASSUSER > F:\GRNTCMP\OUT\D92_MISP.OUT
\PUBLIC\GRANT R F FOR F:\GRNTEST\MISSING TO USER NOPASSUSER > F:\GRNTCMP\PUBOUT\D92_MISP.OUT
ECHO Starting D93_GRAM...
\NPUBLIC\GRANT R F FOR F:\GRNTEST NOPASSUSER > F:\GRNTCMP\OUT\D93_GRAM.OUT
\PUBLIC\GRANT R F FOR F:\GRNTEST NOPASSUSER > F:\GRNTCMP\PUBOUT\D93_GRAM.OUT
ECHO === COMPARE NOVELL OUT AGAINST PUBLIC OUT === > F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\D01_HELP.OUT F:\GRNTCMP\PUBOUT\D01_HELP.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\D02_NOAR.OUT F:\GRNTCMP\PUBOUT\D02_NOAR.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G10_R.OUT F:\GRNTCMP\PUBOUT\G10_R.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G11_W.OUT F:\GRNTCMP\PUBOUT\G11_W.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G12_C.OUT F:\GRNTCMP\PUBOUT\G12_C.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G13_E.OUT F:\GRNTCMP\PUBOUT\G13_E.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G14_M.OUT F:\GRNTCMP\PUBOUT\G14_M.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G15_F.OUT F:\GRNTCMP\PUBOUT\G15_F.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G16_A.OUT F:\GRNTCMP\PUBOUT\G16_A.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G17_S.OUT F:\GRNTCMP\PUBOUT\G17_S.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G20_RF.OUT F:\GRNTCMP\PUBOUT\G20_RF.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G21_RW.OUT F:\GRNTCMP\PUBOUT\G21_RW.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G22_RWC.OUT F:\GRNTCMP\PUBOUT\G22_RWC.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G23_RWCE.OUT F:\GRNTCMP\PUBOUT\G23_RWCE.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G24_RAL.OUT F:\GRNTCMP\PUBOUT\G24_RAL.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G25_SAL.OUT F:\GRNTCMP\PUBOUT\G25_SAL.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G26_ALL.OUT F:\GRNTCMP\PUBOUT\G26_ALL.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G27_N.OUT F:\GRNTCMP\PUBOUT\G27_N.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G30_RE.OUT F:\GRNTCMP\PUBOUT\G30_RE.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G31_RWF.OUT F:\GRNTCMP\PUBOUT\G31_RWF.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G32_RCM.OUT F:\GRNTCMP\PUBOUT\G32_RCM.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G33_RFA.OUT F:\GRNTCMP\PUBOUT\G33_RFA.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G34_WCM.OUT F:\GRNTCMP\PUBOUT\G34_WCM.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G35_EMF.OUT F:\GRNTCMP\PUBOUT\G35_EMF.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G36_RMF.OUT F:\GRNTCMP\PUBOUT\G36_RMF.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G37_REMA.OUT F:\GRNTCMP\PUBOUT\G37_REMA.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G38_SR.OUT F:\GRNTCMP\PUBOUT\G38_SR.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G39_SRF.OUT F:\GRNTCMP\PUBOUT\G39_SRF.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\G40_SWCM.OUT F:\GRNTCMP\PUBOUT\G40_SWCM.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\F10_R.OUT F:\GRNTCMP\PUBOUT\F10_R.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\F11_RF.OUT F:\GRNTCMP\PUBOUT\F11_RF.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\F12_RAL.OUT F:\GRNTCMP\PUBOUT\F12_RAL.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\F13_ALL.OUT F:\GRNTCMP\PUBOUT\F13_ALL.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\F14_N.OUT F:\GRNTCMP\PUBOUT\F14_N.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\F15_S.OUT F:\GRNTCMP\PUBOUT\F15_S.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\F16_SAL.OUT F:\GRNTCMP\PUBOUT\F16_SAL.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\S10_R.OUT F:\GRNTCMP\PUBOUT\S10_R.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\S11_RWC.OUT F:\GRNTCMP\PUBOUT\S11_RWC.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\S12_ALL.OUT F:\GRNTCMP\PUBOUT\S12_ALL.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\D90_BADR.OUT F:\GRNTCMP\PUBOUT\D90_BADR.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\D91_MISU.OUT F:\GRNTCMP\PUBOUT\D91_MISU.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\D92_MISP.OUT F:\GRNTCMP\PUBOUT\D92_MISP.OUT >> F:\GRNTCMP\COMPARE.LOG
FC F:\GRNTCMP\OUT\D93_GRAM.OUT F:\GRNTCMP\PUBOUT\D93_GRAM.OUT >> F:\GRNTCMP\COMPARE.LOG
IF "%LGNTPWD%"=="" GOTO NOUSER
IF NOT EXIST \PUBLIC\DLYSTRT.EXE GOTO NODLY
COPY \PUBLIC\DLYSTRT.EXE C:\GRNTTMP > NUL
COPY F:\GRNTC.BAT C:\GRNTTMP\GRNTC.BAT > NUL
C:
CD \GRNTTMP
DLYSTRT /T:2 GRNTC.BAT
GOTO STARTED
:NOUSER
ECHO LGNTPWD is not set. User-context part skipped. >> F:\GRNTCMP\RUN.LOG
ECHO.
ECHO LGNTPWD ist nicht gesetzt. User-context part skipped.
ECHO Fuer User-Kontext zuerst setzen:
ECHO SET LGNTPWD=dein-supervisor-passwort
GOTO SUMMARY
:NODLY
ECHO \PUBLIC\DLYSTRT.EXE not found. User-context part skipped. >> F:\GRNTCMP\RUN.LOG
ECHO.
ECHO \PUBLIC\DLYSTRT.EXE nicht gefunden. User-context part skipped.
GOTO SUMMARY
:STARTED
ECHO GRNTC queued via DLYSTRT. >> F:\GRNTCMP\RUN.LOG
ECHO.
ECHO GRNTC wurde via DLYSTRT gestartet.
ECHO Nach automatischem Re-Login wird GRNTSTA PART2 gestartet.
GOTO END
:SUMMARY
ECHO === SUMMARY === > F:\GRNTCMP\SUMMARY.TXT
ECHO GRNTSTA GRANT direct comparison finished. >> F:\GRNTCMP\SUMMARY.TXT
ECHO User-context part was skipped. >> F:\GRNTCMP\SUMMARY.TXT
ECHO Optional: GRNTZIP ausfuehren. >> F:\GRNTCMP\SUMMARY.TXT
ECHO GRNTSTA direct part finished.
ECHO Optional: GRNTZIP ausfuehren.
GOTO END
:PART2
F:
CD \
IF NOT EXIST GRNTCMP MD GRNTCMP
IF NOT EXIST GRNTCMP\UNOV MD GRNTCMP\UNOV
IF NOT EXIST GRNTCMP\UPUB MD GRNTCMP\UPUB
IF NOT EXIST GRNTCMP\USETUP MD GRNTCMP\USETUP
COPY C:\GRNTTMP\UNOV\*.OUT F:\GRNTCMP\UNOV > NUL
COPY C:\GRNTTMP\UPUB\*.OUT F:\GRNTCMP\UPUB > NUL
COPY C:\GRNTTMP\USETUP\*.OUT F:\GRNTCMP\USETUP > NUL
IF EXIST C:\GRNTTMP\HELPER.TXT COPY C:\GRNTTMP\HELPER.TXT F:\GRNTCMP\HELPER.TXT > NUL
IF EXIST C:\GRNTTMP\ULOG1.OUT COPY C:\GRNTTMP\ULOG1.OUT F:\GRNTCMP\ULOG1.OUT > NUL
IF EXIST C:\GRNTTMP\ULOGIN.OUT COPY C:\GRNTTMP\ULOGIN.OUT F:\GRNTCMP\ULOGIN.OUT > NUL
IF EXIST C:\GRNTTMP\ULOG2.OUT COPY C:\GRNTTMP\ULOG2.OUT F:\GRNTCMP\ULOG2.OUT > NUL
IF EXIST C:\GRNTTMP\ULGSUP.OUT COPY C:\GRNTTMP\ULGSUP.OUT F:\GRNTCMP\ULGSUP.OUT > NUL
ECHO === COMPARE NOPASSUSER NOVELL RIGHTS AGAINST PUBLIC RIGHTS === > F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G10_R.OUT F:\GRNTCMP\UPUB\G10_R.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G11_W.OUT F:\GRNTCMP\UPUB\G11_W.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G12_C.OUT F:\GRNTCMP\UPUB\G12_C.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G13_E.OUT F:\GRNTCMP\UPUB\G13_E.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G14_M.OUT F:\GRNTCMP\UPUB\G14_M.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G15_F.OUT F:\GRNTCMP\UPUB\G15_F.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G16_A.OUT F:\GRNTCMP\UPUB\G16_A.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G17_S.OUT F:\GRNTCMP\UPUB\G17_S.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G20_RF.OUT F:\GRNTCMP\UPUB\G20_RF.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G21_RW.OUT F:\GRNTCMP\UPUB\G21_RW.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G22_RWC.OUT F:\GRNTCMP\UPUB\G22_RWC.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G23_RWCE.OUT F:\GRNTCMP\UPUB\G23_RWCE.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G24_RAL.OUT F:\GRNTCMP\UPUB\G24_RAL.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G25_SAL.OUT F:\GRNTCMP\UPUB\G25_SAL.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G26_ALL.OUT F:\GRNTCMP\UPUB\G26_ALL.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G27_N.OUT F:\GRNTCMP\UPUB\G27_N.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G30_RE.OUT F:\GRNTCMP\UPUB\G30_RE.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G31_RWF.OUT F:\GRNTCMP\UPUB\G31_RWF.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G32_RCM.OUT F:\GRNTCMP\UPUB\G32_RCM.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G33_RFA.OUT F:\GRNTCMP\UPUB\G33_RFA.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G34_WCM.OUT F:\GRNTCMP\UPUB\G34_WCM.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G35_EMF.OUT F:\GRNTCMP\UPUB\G35_EMF.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G36_RMF.OUT F:\GRNTCMP\UPUB\G36_RMF.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G37_REMA.OUT F:\GRNTCMP\UPUB\G37_REMA.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G38_SR.OUT F:\GRNTCMP\UPUB\G38_SR.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G39_SRF.OUT F:\GRNTCMP\UPUB\G39_SRF.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\G40_SWCM.OUT F:\GRNTCMP\UPUB\G40_SWCM.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\F10_R.OUT F:\GRNTCMP\UPUB\F10_R.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\F11_RF.OUT F:\GRNTCMP\UPUB\F11_RF.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\F12_RAL.OUT F:\GRNTCMP\UPUB\F12_RAL.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\F13_ALL.OUT F:\GRNTCMP\UPUB\F13_ALL.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\F14_N.OUT F:\GRNTCMP\UPUB\F14_N.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\F15_S.OUT F:\GRNTCMP\UPUB\F15_S.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\F16_SAL.OUT F:\GRNTCMP\UPUB\F16_SAL.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\S10_R.OUT F:\GRNTCMP\UPUB\S10_R.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\S11_RWC.OUT F:\GRNTCMP\UPUB\S11_RWC.OUT >> F:\GRNTCMP\UCOMP.LOG
FC F:\GRNTCMP\UNOV\S12_ALL.OUT F:\GRNTCMP\UPUB\S12_ALL.OUT >> F:\GRNTCMP\UCOMP.LOG
ECHO === SUMMARY === > F:\GRNTCMP\SUMMARY.TXT
ECHO GRNTSTA GRANT comparison finished. >> F:\GRNTCMP\SUMMARY.TXT
ECHO. >> F:\GRNTCMP\SUMMARY.TXT
ECHO Direct mode: OUT vs PUBOUT compares GRANT output. >> F:\GRNTCMP\SUMMARY.TXT
ECHO User mode: UNOV vs UPUB compares effective RIGHTS as NOPASSUSER. >> F:\GRNTCMP\SUMMARY.TXT
ECHO. >> F:\GRNTCMP\SUMMARY.TXT
ECHO Optional: GRNTZIP ausfuehren. >> F:\GRNTCMP\SUMMARY.TXT
ECHO GRNTSTA PART2 fertig.
ECHO Optional: GRNTZIP ausfuehren.
GOTO END
:END

26
test/grant/GRNTZIP.BAT Normal file
View File

@@ -0,0 +1,26 @@
@ECHO OFF
REM GRNTZIP.BAT
REM Optional packer for GRNTSTA result files.
REM Requires ZIP.EXE in PATH or current directory.
F:
CD \GRNTCMP
IF EXIST GRNTSTA.ZIP DEL GRNTSTA.ZIP
IF EXIST ZIP.LOG DEL ZIP.LOG
ECHO Creating GRNTSTA.ZIP > ZIP.LOG
ZIP -r GRNTSTA.ZIP RUN.LOG SUMMARY.TXT COMPARE.LOG UCOMP.LOG HELPER.TXT ULOG1.OUT ULOGIN.OUT ULOG2.OUT ULGSUP.OUT OUT PUBOUT SETUP 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 \GRNTEST\NUL DELTREE /Y \GRNTEST >> ZIP.LOG
IF EXIST C:\GRNTTMP\NUL DELTREE /Y C:\GRNTTMP >> ZIP.LOG
CD \
ECHO.
ECHO ZIP step finished.
ECHO Check:
ECHO F:\GRNTCMP\GRNTSTA.ZIP
ECHO F:\GRNTCMP\ZIP.LOG
ECHO.

42
test/grant/README.md Normal file
View File

@@ -0,0 +1,42 @@
# GRANT comparison test
Scripts:
- `GRNTSTA.BAT` creates `F:\GRNTEST`, compares Novell `\NPUBLIC\GRANT`
output against `\PUBLIC\GRANT`, and uses `NOPASSUSER` as trustee target.
- `GRNTC.BAT` is the delayed user-context helper started through `DLYSTRT`.
It logs in as `NOPASSUSER` and captures effective `RIGHTS` output for the
grants prepared by `GRNTSTA`.
- `GRNTZIP.BAT` packages the result tree as `F:\GRNTCMP\GRNTSTA.ZIP`.
Run as `SUPERVISOR` or an equivalent user.
For the automatic user-context part, set the Supervisor password first:
```bat
SET LGNTPWD=your-supervisor-password
GRNTSTA
```
Result directories:
- `OUT` contains Novell `GRANT` output.
- `PUBOUT` contains public implementation `GRANT` output.
- `COMPARE.LOG` compares `OUT` against `PUBOUT`.
- `UNOV` contains Novell `RIGHTS` output captured as `NOPASSUSER`.
- `UPUB` contains public implementation `RIGHTS` output captured as `NOPASSUSER`.
- `UCOMP.LOG` compares `UNOV` against `UPUB`.
- `SETUP` and `USETUP` contain setup/cleanup command output.
Covered grant cases:
- single rights: `R`, `W`, `C`, `E`, `M`, `F`, `A`, `S`
- combinations: `R F`, `R W`, `R W C`, `R W C E`,
`R W C E M F A`, `S R W C E M F A`, `ALL`, `N`
- mixed combinations: `R E`, `R W F`, `R C M`, `R F A`,
`W C M`, `E M F`, `R W C M F`, `R E M A`, `S R`, `S R F`, `S W C M`
- file trustee cases with `/FILES`
- recursive directory cases with `/SUBDIRECTORIES`
- help, no-argument and error/grammar cases
`GRNTZIP` remains manual so the result tree can be inspected before packaging.

87
test/login/LGNTC.BAT Normal file
View File

@@ -0,0 +1,87 @@
@ECHO OFF
REM LGNTC.BAT
REM Helper for LGNTSTA.BAT. Output survives LOGOUT/LOGIN on local C:.
REM LOGIN/MAP/LOGOUT are copied to C:\LGNTTMP by LGNTSTA.
REM
REM Important: LOGIN can change the current drive/search path. Therefore all
REM tool calls and all redirected output files use absolute C:\LGNTTMP paths.
C:
CD \LGNTTMP
ECHO LGNTC helper started. > C:\LGNTTMP\HELPER.TXT
ECHO This helper intentionally changes login state. >> 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 using local Novell LOGIN === >> C:\LGNTTMP\HELPER.TXT
C:\LGNTTMP\LOGIN NOPASSUSER > C:\LGNTTMP\D02_LGIN.OUT
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
C:\LGNTTMP\LOGOUT > C:\LGNTTMP\D04_LGOT.OUT
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 F:\LOGIN\LOGIN SUPERVISOR
ECHO Danach ausfuehren:
ECHO F:\LGNTSTA PART2
ECHO LGNTZIP danach bei Bedarf manuell ausfuehren.
ECHO.
:END

160
test/login/LGNTSTA.BAT Normal file
View File

@@ -0,0 +1,160 @@
@ECHO OFF
REM LGNTSTA.BAT
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
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
IF "%1"=="PART2" GOTO PART2
IF "%1"=="PARt2" GOTO PART2
IF "%1"=="PArT2" GOTO PART2
IF "%1"=="PArt2" GOTO PART2
IF "%1"=="PaRT2" GOTO PART2
IF "%1"=="PaRt2" GOTO PART2
IF "%1"=="ParT2" GOTO PART2
IF "%1"=="Part2" GOTO PART2
IF "%1"=="pART2" GOTO PART2
IF "%1"=="pARt2" GOTO PART2
IF "%1"=="pArT2" GOTO PART2
IF "%1"=="pArt2" GOTO PART2
IF "%1"=="paRT2" GOTO PART2
IF "%1"=="paRt2" GOTO PART2
IF "%1"=="parT2" GOTO PART2
IF "%1"=="part2" GOTO PART2
GOTO USAGE
:PART1
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
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 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.
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 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 DLYSTRT startet gleich C:\LGNTTMP\LGNTC.BAT.
ECHO Bitte warten...
GOTO END
:PART2
F:
CD \
MD LGNTCMP > NUL
MD LGNTCMP\OUT > NUL
ECHO. >> F:\LGNTCMP\RUN.LOG
ECHO Part 2 collecting files from C:\LGNTTMP. >> F:\LGNTCMP\RUN.LOG
COPY C:\LGNTTMP\*.OUT F:\LGNTCMP\OUT >> F:\LGNTCMP\RUN.LOG
COPY C:\LGNTTMP\*.TXT F:\LGNTCMP\OUT >> F:\LGNTCMP\RUN.LOG
ECHO === SUMMARY === > F:\LGNTCMP\SUMMARY.TXT
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
ECHO LGNTSTA PART2 fertig.
ECHO Ergebnisse liegen in F:\LGNTCMP
ECHO Optional: LGNTZIP ausfuehren.
GOTO END
:USAGE
ECHO Usage: LGNTSTA [PART2]
ECHO.
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.
ECHO Fuer vollautomatischen Lauf vorher setzen, z.B.:
ECHO SET LGNTPWD=dein-supervisor-passwort
ECHO Danach starten:
ECHO F:\LGNTSTA
GOTO END
:END

27
test/login/LGNTZIP.BAT Normal file
View File

@@ -0,0 +1,27 @@
@ECHO OFF
REM LGNTZIP.BAT
REM Optional packer for LGNTSTA result files.
REM Requires ZIP.EXE in PATH or current directory.
F:
CD \LGNTCMP
IF EXIST LGNTSTA.ZIP DEL LGNTSTA.ZIP
IF EXIST ZIP.LOG DEL ZIP.LOG
ECHO Creating LGNTSTA.ZIP > ZIP.LOG
ZIP -r LGNTSTA.ZIP RUN.LOG SUMMARY.TXT OUT >> ZIP.LOG
REM Cleanup generated temporary files after ZIP.
REM Keep LGNTCMP because it contains the ZIP and ZIP.LOG.
ECHO Cleaning generated temporary files... >> ZIP.LOG
DELTREE /Y C:\LGNTTMP >> ZIP.LOG
IF EXIST C:\LGNTC.BAT DEL C:\LGNTC.BAT >> ZIP.LOG
CD \
ECHO.
ECHO ZIP step finished.
ECHO Check:
ECHO F:\LGNTCMP\LGNTSTA.ZIP
ECHO F:\LGNTCMP\ZIP.LOG
ECHO.

75
test/login/README.md Normal file
View File

@@ -0,0 +1,75 @@
# 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.

4
test/logout/README.md Normal file
View File

@@ -0,0 +1,4 @@
# LOGOUT tests
`LOGOUT` is covered together with `LOGIN` in `test/login/LGNTSTA.BAT`, because a useful
logout baseline needs a controlled login/logout/login sequence.

178
test/map/MAPTSTA.BAT Normal file
View File

@@ -0,0 +1,178 @@
@ECHO OFF
REM MAPTSTA.BAT
REM Automated Novell MAP baseline for MARS NWE.
REM
REM LOGIN is intentionally not tested here.
REM PATH/PATHINS/PATHDEL are our own tools and are not part of this Novell MAP baseline.
REM
REM Run while already logged in and with F: mapped to SYS.
REM
REM NetWare semantics verified against real NetWare:
REM MAP G:=SYS:PUBLIC
REM sets the current path of G: to \PUBLIC, but it is NOT a fake root.
REM CD \ returns to SYS:\.
REM
REM MAP ROOT G:=SYS:PUBLIC
REM makes SYS:PUBLIC the fake root of G:.
REM CD \ stays inside SYS:PUBLIC.
REM
REM Results:
REM F:\MAPCMP\RUN.LOG
REM F:\MAPCMP\SUMMARY.TXT
REM F:\MAPCMP\OUT\*.OUT
F:
CD \
REM --- Clean generated test/result directories (contents only). ---
IF EXIST MAPTEST\NUL DELTREE /Y MAPTEST\*.*
IF EXIST MAPCMP\NUL DELTREE /Y MAPCMP\*.*
IF NOT EXIST MAPTEST\NUL MD MAPTEST
IF NOT EXIST MAPTEST\PUB\NUL MD MAPTEST\PUB
IF NOT EXIST MAPCMP\NUL MD MAPCMP
IF NOT EXIST MAPCMP\OUT\NUL MD MAPCMP\OUT
IF EXIST F:\MAPCMP\RUN.LOG DEL F:\MAPCMP\RUN.LOG
IF EXIST F:\MAPCMP\SUMMARY.TXT DEL F:\MAPCMP\SUMMARY.TXT
IF EXIST F:\MAPCMP\MAPTSTA.ZIP DEL F:\MAPCMP\MAPTSTA.ZIP
IF EXIST F:\MAPCMP\ZIP.LOG DEL F:\MAPCMP\ZIP.LOG
IF EXIST F:\MAPCMP\OUT\M01_MAP.OUT DEL F:\MAPCMP\OUT\M01_MAP.OUT
IF EXIST F:\MAPCMP\OUT\M02_SUBCUR.OUT DEL F:\MAPCMP\OUT\M02_SUBCUR.OUT
IF EXIST F:\MAPCMP\OUT\M03_SUBCD.OUT DEL F:\MAPCMP\OUT\M03_SUBCD.OUT
IF EXIST F:\MAPCMP\OUT\M04_ROOTMAP.OUT DEL F:\MAPCMP\OUT\M04_ROOTMAP.OUT
IF EXIST F:\MAPCMP\OUT\M05_ROOTCD.OUT DEL F:\MAPCMP\OUT\M05_ROOTCD.OUT
IF EXIST F:\MAPCMP\OUT\M06_NPUBLIC.OUT DEL F:\MAPCMP\OUT\M06_NPUBLIC.OUT
IF EXIST F:\MAPCMP\OUT\M07_HOME.OUT DEL F:\MAPCMP\OUT\M07_HOME.OUT
IF EXIST F:\MAPCMP\OUT\M08_QUOTA.OUT DEL F:\MAPCMP\OUT\M08_QUOTA.OUT
IF EXIST F:\MAPCMP\OUT\M09_UQUOTA.OUT DEL F:\MAPCMP\OUT\M09_UQUOTA.OUT
IF EXIST F:\MAPCMP\OUT\M10_DEL.OUT DEL F:\MAPCMP\OUT\M10_DEL.OUT
IF EXIST F:\MAPCMP\OUT\M11_AFTER.OUT DEL F:\MAPCMP\OUT\M11_AFTER.OUT
IF EXIST F:\MAPCMP\OUT\M12_BAD.OUT DEL F:\MAPCMP\OUT\M12_BAD.OUT
ECHO MAPTSTA automated Novell MAP baseline > F:\MAPCMP\RUN.LOG
ECHO Run while already logged in. >> F:\MAPCMP\RUN.LOG
ECHO Date/time stamp skipped to avoid DOS prompt. >> F:\MAPCMP\RUN.LOG
ECHO. >> F:\MAPCMP\RUN.LOG
ECHO MAP TEST ROOT > F:\MAPTEST\ROOT.TXT
ECHO MAP TEST PUB > F:\MAPTEST\PUB\PUB.TXT
NPUBLIC\FLAG F:\MAPTEST\ROOT.TXT N >> F:\MAPCMP\RUN.LOG
NPUBLIC\FLAG F:\MAPTEST\PUB\PUB.TXT N >> F:\MAPCMP\RUN.LOG
ECHO === M01 current maps and volumes === >> F:\MAPCMP\RUN.LOG
NPUBLIC\MAP > F:\MAPCMP\OUT\M01_MAP.OUT
ECHO === M02 non-root subdir map G:=SYS:MAPTEST === >> F:\MAPCMP\RUN.LOG
NPUBLIC\MAP DEL G: >> F:\MAPCMP\RUN.LOG
NPUBLIC\MAP G:=SYS:MAPTEST > F:\MAPCMP\OUT\M02_SUBCUR.OUT
NPUBLIC\MAP >> F:\MAPCMP\OUT\M02_SUBCUR.OUT
G:
CD
DIR
TYPE ROOT.TXT >> F:\MAPCMP\OUT\M02_SUBCUR.OUT
DIR PUB >> F:\MAPCMP\OUT\M02_SUBCUR.OUT
TYPE PUB\PUB.TXT >> F:\MAPCMP\OUT\M02_SUBCUR.OUT
F:
ECHO === M03 non-root map after CD backslash should show SYS root === >> F:\MAPCMP\RUN.LOG
G:
CD \
CD > F:\MAPCMP\OUT\M03_SUBCD.OUT
DIR >> F:\MAPCMP\OUT\M03_SUBCD.OUT
DIR ROOT.TXT >> F:\MAPCMP\OUT\M03_SUBCD.OUT
F:
ECHO === M04 MAP ROOT G:=SYS:MAPTEST fake-root === >> F:\MAPCMP\RUN.LOG
NPUBLIC\MAP DEL G: >> F:\MAPCMP\RUN.LOG
NPUBLIC\MAP ROOT G:=SYS:MAPTEST > F:\MAPCMP\OUT\M04_ROOTMAP.OUT
NPUBLIC\MAP >> F:\MAPCMP\OUT\M04_ROOTMAP.OUT
G:
CD
DIR
TYPE ROOT.TXT >> F:\MAPCMP\OUT\M04_ROOTMAP.OUT
DIR PUB >> F:\MAPCMP\OUT\M04_ROOTMAP.OUT
TYPE PUB\PUB.TXT >> F:\MAPCMP\OUT\M04_ROOTMAP.OUT
F:
ECHO === M05 MAP ROOT after CD backslash should stay in fake-root === >> F:\MAPCMP\RUN.LOG
G:
CD \
CD > F:\MAPCMP\OUT\M05_ROOTCD.OUT
DIR >> F:\MAPCMP\OUT\M05_ROOTCD.OUT
DIR ROOT.TXT >> F:\MAPCMP\OUT\M05_ROOTCD.OUT
TYPE ROOT.TXT >> F:\MAPCMP\OUT\M05_ROOTCD.OUT
F:
ECHO === M06 MAP ROOT to SYS:NPUBLIC and find NDIR.EXE === >> F:\MAPCMP\RUN.LOG
NPUBLIC\MAP DEL G: >> F:\MAPCMP\RUN.LOG
NPUBLIC\MAP ROOT G:=SYS:NPUBLIC > F:\MAPCMP\OUT\M06_NPUBLIC.OUT
NPUBLIC\MAP >> F:\MAPCMP\OUT\M06_NPUBLIC.OUT
G:
CD \
CD >> F:\MAPCMP\OUT\M06_NPUBLIC.OUT
DIR NDIR.EXE >> F:\MAPCMP\OUT\M06_NPUBLIC.OUT
F:
ECHO === M07 map H to HOME: volume root === >> F:\MAPCMP\RUN.LOG
NPUBLIC\MAP DEL H: >> F:\MAPCMP\RUN.LOG
NPUBLIC\MAP H:=HOME: > F:\MAPCMP\OUT\M07_HOME.OUT
NPUBLIC\MAP >> F:\MAPCMP\OUT\M07_HOME.OUT
DIR H:\ >> F:\MAPCMP\OUT\M07_HOME.OUT
ECHO === M08 map I to QUOTA: volume root === >> F:\MAPCMP\RUN.LOG
NPUBLIC\MAP DEL I: >> F:\MAPCMP\RUN.LOG
NPUBLIC\MAP I:=QUOTA: > F:\MAPCMP\OUT\M08_QUOTA.OUT
NPUBLIC\MAP >> F:\MAPCMP\OUT\M08_QUOTA.OUT
DIR I:\ >> F:\MAPCMP\OUT\M08_QUOTA.OUT
ECHO === M09 map ROOT J to QUOTA:USERQUOTA fake-root === >> F:\MAPCMP\RUN.LOG
NPUBLIC\MAP DEL J: >> F:\MAPCMP\RUN.LOG
NPUBLIC\MAP ROOT J:=QUOTA:USERQUOTA > F:\MAPCMP\OUT\M09_UQUOTA.OUT
NPUBLIC\MAP >> F:\MAPCMP\OUT\M09_UQUOTA.OUT
J:
CD \
CD >> F:\MAPCMP\OUT\M09_UQUOTA.OUT
DIR >> F:\MAPCMP\OUT\M09_UQUOTA.OUT
F:
ECHO === M10 delete mapped drives G H I J === >> F:\MAPCMP\RUN.LOG
NPUBLIC\MAP DEL G: > F:\MAPCMP\OUT\M10_DEL.OUT
NPUBLIC\MAP DEL H: >> F:\MAPCMP\OUT\M10_DEL.OUT
NPUBLIC\MAP DEL I: >> F:\MAPCMP\OUT\M10_DEL.OUT
NPUBLIC\MAP DEL J: >> F:\MAPCMP\OUT\M10_DEL.OUT
NPUBLIC\MAP >> F:\MAPCMP\OUT\M10_DEL.OUT
ECHO === M11 access after delete should fail === >> F:\MAPCMP\RUN.LOG
DIR G:\ > F:\MAPCMP\OUT\M11_AFTER.OUT
DIR H:\ >> F:\MAPCMP\OUT\M11_AFTER.OUT
DIR I:\ >> F:\MAPCMP\OUT\M11_AFTER.OUT
DIR J:\ >> F:\MAPCMP\OUT\M11_AFTER.OUT
ECHO === M12 expected failure bad map target === >> F:\MAPCMP\RUN.LOG
NPUBLIC\MAP K:=SYS:NO_SUCH_DIR > F:\MAPCMP\OUT\M12_BAD.OUT
NPUBLIC\MAP DEL K: >> F:\MAPCMP\OUT\M12_BAD.OUT
ECHO === SUMMARY === > F:\MAPCMP\SUMMARY.TXT
ECHO MAPTSTA Novell MAP baseline finished. >> F:\MAPCMP\SUMMARY.TXT
ECHO. >> F:\MAPCMP\SUMMARY.TXT
ECHO Expected: >> F:\MAPCMP\SUMMARY.TXT
ECHO - M02 non-root G:=SYS:MAPTEST starts in MAPTEST and can read ROOT.TXT. >> F:\MAPCMP\SUMMARY.TXT
ECHO - M03 after CD \ on non-root map, G: is back at SYS:\ and ROOT.TXT is not found. >> F:\MAPCMP\SUMMARY.TXT
ECHO - M04 MAP ROOT G:=SYS:MAPTEST can read ROOT.TXT and PUB\PUB.TXT. >> F:\MAPCMP\SUMMARY.TXT
ECHO - M05 after CD \ on MAP ROOT, G: stays inside fake-root and ROOT.TXT is found. >> F:\MAPCMP\SUMMARY.TXT
ECHO - M06 MAP ROOT G:=SYS:NPUBLIC finds NDIR.EXE. >> F:\MAPCMP\SUMMARY.TXT
ECHO - M07 maps H to HOME:. >> F:\MAPCMP\SUMMARY.TXT
ECHO - M08 maps I to QUOTA:. >> F:\MAPCMP\SUMMARY.TXT
ECHO - M09 maps ROOT J to QUOTA:USERQUOTA if that directory exists. >> F:\MAPCMP\SUMMARY.TXT
ECHO - M10 deletes G/H/I/J mappings. >> F:\MAPCMP\SUMMARY.TXT
ECHO - M11 access after delete should fail. >> F:\MAPCMP\SUMMARY.TXT
ECHO - M12 bad target should fail. >> F:\MAPCMP\SUMMARY.TXT
ECHO Optional pack results with MAPTZIP.BAT. >> F:\MAPCMP\SUMMARY.TXT
ECHO.
ECHO MAPTSTA fertig.
ECHO Ergebnisse liegen in F:\MAPCMP
ECHO Optional: MAPTZIP ausfuehren.
ECHO.

26
test/map/MAPTZIP.BAT Normal file
View File

@@ -0,0 +1,26 @@
@ECHO OFF
REM MAPTZIP.BAT
REM Optional packer for MAPTSTA result files.
REM Requires ZIP.EXE in PATH or current directory.
F:
CD \MAPCMP
IF EXIST MAPTSTA.ZIP DEL MAPTSTA.ZIP
IF EXIST ZIP.LOG DEL ZIP.LOG
ECHO Creating MAPTSTA.ZIP > ZIP.LOG
ZIP -r MAPTSTA.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 \MAPTEST\NUL DELTREE /Y \MAPTEST >> ZIP.LOG
CD \
ECHO.
ECHO ZIP step finished.
ECHO Check:
ECHO F:\MAPCMP\MAPTSTA.ZIP
ECHO F:\MAPCMP\ZIP.LOG
ECHO.

66
test/map/README.md Normal file
View File

@@ -0,0 +1,66 @@
# MAP automated test
`MAPTSTA.BAT` captures a Novell MAP baseline using `NPUBLIC\MAP`.
This is not yet a PUBLIC-vs-Novell compare; it documents the Novell behavior that the public MAP implementation should match.
LOGIN is intentionally not tested here. `PATH`, `PATHINS`, and `PATHDEL` are
our own tools, so they are not included in this Novell baseline.
## NetWare semantics
Verified against real NetWare:
```text
MAP G:=SYS:PUBLIC
```
sets the current path on `G:` to `\PUBLIC`, but it is not a fake root. `CD \`
returns to `SYS:\`.
```text
MAP ROOT G:=SYS:PUBLIC
```
sets `SYS:PUBLIC` as fake root. `CD \` stays inside `SYS:PUBLIC`.
## Run
Run while already logged in and with `F:` mapped to `SYS`.
```text
MAPTSTA
```
Optional pack:
```text
MAPTZIP
```
Result ZIP:
```text
F:\MAPCMP\MAPTSTA.ZIP
```
Linux package with server log:
```sh
sudo ./mars_packtest_v3.sh maptsta 5 mario
```
## Coverage
- display current maps
- non-root subdir map `G:=SYS:MAPTEST`
- verify `CD \` returns to volume root for non-root map
- fake-root map `MAP ROOT G:=SYS:MAPTEST`
- verify `CD \` stays in fake-root for root map
- fake-root map to `SYS:NPUBLIC` and find `NDIR.EXE`
- map `H:` to `HOME:`
- map `I:` to `QUOTA:`
- fake-root map `J:` to `QUOTA:USERQUOTA`
- delete `G:`, `H:`, `I:`, `J:`
- expected failure after delete
- expected failure for bad target

161
test/mars_packtest_v3.sh Normal file
View File

@@ -0,0 +1,161 @@
#!/bin/sh
#
# mars_packtest.sh v3
#
# Collect a MARS NWE DOS test ZIP, append recent nw.log lines,
# copy final package to /tmp, and fix ownership/permissions.
#
# Usage:
# mars_packtest.sh <testname> [minutes] [upload_user]
#
# Example:
# sudo ./mars_packtest.sh ncptsta 5 mario
#
set -eu
TEST_IN="${1:-}"
MINUTES="${2:-5}"
UPLOAD_USER="${3:-${SUDO_USER:-$(id -un)}}"
LOG_FILE="/var/log/mars_nwe/nw.log"
SYS_DIR="/var/mars_nwe/SYS"
OUT_DIR="/tmp"
if [ -z "$TEST_IN" ]; then
echo "Usage: $0 <testname> [minutes] [upload_user]" >&2
exit 2
fi
TEST="$(printf '%s' "$TEST_IN" | tr '[:lower:]' '[:upper:]')"
TEST_DIR="$TEST"
ZIP_NAME="$TEST.ZIP"
case "$TEST" in
NCPTSTA)
TEST_DIR="NCMP"
ZIP_NAME="NCPTSTA.ZIP"
;;
FILTSTN|FILPREN|FILPOSTN|FILCMPN)
TEST_DIR="TFILE"
ZIP_NAME="$TEST.ZIP"
;;
NDIRTSTN|NDIRTSTM|NDIRCMP)
TEST_DIR="TNDIR"
ZIP_NAME="$TEST.ZIP"
;;
esac
SRC_ZIP="$SYS_DIR/$TEST_DIR/$ZIP_NAME"
if [ ! -f "$SRC_ZIP" ]; then
FOUND="$(find "$SYS_DIR" -maxdepth 3 -type f -iname "$TEST.zip" -print 2>/dev/null | head -n 1 || true)"
if [ -n "$FOUND" ]; then
SRC_ZIP="$FOUND"
ZIP_NAME="$(basename "$SRC_ZIP")"
fi
fi
if [ ! -f "$SRC_ZIP" ]; then
echo "ERROR: ZIP not found for test '$TEST_IN'." >&2
echo "Tried: $SRC_ZIP" >&2
echo "Also searched: $SYS_DIR -maxdepth 3 -iname $TEST.zip" >&2
exit 1
fi
if [ ! -f "$LOG_FILE" ]; then
echo "ERROR: log file not found: $LOG_FILE" >&2
exit 1
fi
STAMP="$(date '+%Y%m%d-%H%M%S')"
WORK="/tmp/mars_packtest_${TEST}_$$"
FINAL="$OUT_DIR/${TEST}_${STAMP}_with_log.zip"
LOG_OUT="$WORK/nw_last_${MINUTES}min.log"
INFO_OUT="$WORK/package_info.txt"
mkdir -p "$WORK"
# Copy original ZIP first, so the original test result remains untouched.
cp "$SRC_ZIP" "$FINAL"
NOW_EPOCH="$(date '+%s')"
FROM_EPOCH="$((NOW_EPOCH - MINUTES * 60))"
# Compute comparable keys outside awk. This avoids running date(1) once per
# log line, which is very slow for large nw.log files.
#
# Key format:
# MMDD * 86400 + seconds_since_midnight
#
# This is intended for short windows like 5-60 minutes. It also handles
# midnight wrap for the normal "last few minutes" case.
FROM_MD="$(date -d "@$FROM_EPOCH" '+%m%d')"
FROM_SOD="$(date -d "@$FROM_EPOCH" '+%H:%M:%S' | awk -F: '{print ($1*3600)+($2*60)+$3}')"
NOW_MD="$(date -d "@$NOW_EPOCH" '+%m%d')"
NOW_SOD="$(date -d "@$NOW_EPOCH" '+%H:%M:%S' | awk -F: '{print ($1*3600)+($2*60)+$3}')"
FROM_KEY="$((10#$FROM_MD * 86400 + FROM_SOD))"
NOW_KEY="$((10#$NOW_MD * 86400 + NOW_SOD))"
# Force byte/C locale. nw.log can contain CP437/Latin-1/debug bytes.
LC_ALL=C awk -v from_key="$FROM_KEY" -v now_key="$NOW_KEY" '
{
# Log timestamp format:
# 05.26,10:52:36 ...
if (match($0, /^[0-9][0-9]\.[0-9][0-9],[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/)) {
mon = substr($0, 1, 2) + 0
day = substr($0, 4, 2) + 0
hh = substr($0, 7, 2) + 0
mm = substr($0, 10, 2) + 0
ss = substr($0, 13, 2) + 0
key = ((mon * 100) + day) * 86400 + (hh * 3600) + (mm * 60) + ss
if (from_key <= now_key) {
if (key >= from_key && key <= now_key) print
} else {
# Midnight/month/year wrap for short recent windows.
if (key >= from_key || key <= now_key) print
}
}
}
' "$LOG_FILE" > "$LOG_OUT"
{
echo "MARS NWE test package"
echo "====================="
echo
echo "Test input: $TEST_IN"
echo "Test name: $TEST"
echo "Source ZIP: $SRC_ZIP"
echo "Final ZIP: $FINAL"
echo "Log file: $LOG_FILE"
echo "Log window: last $MINUTES minute(s)"
echo "Created: $(date)"
echo "Upload user: $UPLOAD_USER"
echo "From key: $FROM_KEY"
echo "Now key: $NOW_KEY"
echo
echo "Included extra files:"
echo " nw_last_${MINUTES}min.log"
echo " package_info.txt"
} > "$INFO_OUT"
(
cd "$WORK"
zip -q "$FINAL" "$(basename "$LOG_OUT")" "$(basename "$INFO_OUT")"
)
if id "$UPLOAD_USER" >/dev/null 2>&1; then
chown "$UPLOAD_USER":"$(id -gn "$UPLOAD_USER")" "$FINAL" || true
fi
chmod 0644 "$FINAL"
rm -rf "$WORK"
echo "Created package:"
echo " $FINAL"
echo
echo "Upload as user:"
echo " $UPLOAD_USER"

56
test/ncopy/NCPCMPN.BAT Normal file
View File

@@ -0,0 +1,56 @@
@ECHO OFF
REM NCPCMPN.BAT
REM Repeat comparison/show output for NCOPY test.
CLS
ECHO === NCPCMPN: NCOPY PRE/POST Compare ===
ECHO.
PAUSE
CLS
ECHO === K01 Source A FLAG vor/nach ===
FC F:\NCMP\PRE\SRCA.OUT F:\NCMP\POST\SRCA.OUT
ECHO.
PAUSE
CLS
ECHO === K02 Source B FLAG vor/nach ===
FC F:\NCMP\PRE\SRCB.OUT F:\NCMP\POST\SRCB.OUT
ECHO.
PAUSE
CLS
ECHO === K03 Source C FLAG vor/nach ===
FC F:\NCMP\PRE\SRCC.OUT F:\NCMP\POST\SRCC.OUT
ECHO.
PAUSE
CLS
ECHO === K04 Destination NDIR ===
TYPE F:\NCMP\POST\DSTNDIR.OUT
ECHO.
PAUSE
CLS
ECHO === K05 Destination DATES ===
TYPE F:\NCMP\POST\DSTDATE.OUT
ECHO.
PAUSE
CLS
ECHO === K06 /S Copy SUB ===
TYPE F:\NCMP\POST\SCPYSUB.OUT
ECHO.
PAUSE
CLS
ECHO === K07 /E Copy SUB ===
TYPE F:\NCMP\POST\ECPYSUB.OUT
ECHO.
PAUSE
CLS
ECHO === K08 Archive SUB Output ===
TYPE F:\NCMP\POST\ARCHSUB.OUT
ECHO.
PAUSE

457
test/ncopy/NCPTSTA.BAT Normal file
View File

@@ -0,0 +1,457 @@
@ECHO OFF
REM NCPTSTA.BAT
REM Automated Novell-vs-PUBLIC NCOPY comparison for MARS NWE.
REM
REM OUT/POSTNOV = Novell reference using NPUBLIC\NCOPY and NPUBLIC readback tools.
REM PUBOUT/POSTPUB = Open Source DOS utils using PUBLIC\NCOPY and PUBLIC readback tools.
REM COMPARE.LOG compares command output and resulting file state.
F:
CD \
REM --- Dispatch subcommands before doing top-level setup. ---
REM DOS CALL does not jump to labels; CALL NCPTSTA.BAT NOVELL starts the
REM batch from the top again with %1=NOVELL. Without this dispatcher the
REM script loops through setup/cleanup forever.
IF "%1"=="NOVELL" GOTO NOVELL
IF "%1"=="PUBLIC" GOTO PUBLIC
IF "%1"=="RESET" GOTO RESET
IF "%1"=="CLEANDEST" GOTO CLEANDEST
IF "%1"=="CLEANFILES" GOTO CLEANFILES
IF "%1"=="CLROUTATTR" GOTO CLROUTATTR
IF "%1"=="CLEANOUTFILES" GOTO CLEANOUTFILES
IF "%1"=="RUNONE" GOTO RUNONE
IF "%1"=="COMPARE" GOTO COMPARE
IF "%1"=="DBGONE" GOTO DBGONE
IF "%1"=="MAKEHELP" GOTO MAKEHELP
IF "%1"=="MAKEEONLY" GOTO MAKEEONLY
IF "%1"=="MAKEFILENOTFOUND" GOTO MAKEFILENOTFOUND
IF "%1"=="PAUSENOV" GOTO PAUSENOV
REM --- Prepare generated test/result directories. ---
REM Do not use DELTREE here. Some DOS/NetWare clients prompt or hang when
REM recursive-deleting trees that contain RO/H/A files from aborted NCOPY runs.
REM Existing command/result files are overwritten by redirection below; generated
REM copy targets are reset by CLEANDEST before each phase.
IF NOT EXIST TCOPY\NUL MD TCOPY
IF NOT EXIST TCOPY\SRC\NUL MD TCOPY\SRC
IF NOT EXIST TCOPY\SRC\SUB\NUL MD TCOPY\SRC\SUB
IF NOT EXIST TCOPY\SRC\EMPTY\NUL MD TCOPY\SRC\EMPTY
IF NOT EXIST TCOPY\DST\NUL MD TCOPY\DST
IF NOT EXIST TCOPY\DST\SCPY\NUL MD TCOPY\DST\SCPY
IF NOT EXIST TCOPY\DST\ECPY\NUL MD TCOPY\DST\ECPY
IF NOT EXIST TCOPY\ARCH\NUL MD TCOPY\ARCH
IF NOT EXIST TCOPY\ARCH\ACPY\NUL MD TCOPY\ARCH\ACPY
IF NOT EXIST TCOPY\ARCH\MCPY\NUL MD TCOPY\ARCH\MCPY
IF NOT EXIST NCMP\NUL MD NCMP
IF NOT EXIST NCMP\OUT\NUL MD NCMP\OUT
IF NOT EXIST NCMP\PUBOUT\NUL MD NCMP\PUBOUT
IF NOT EXIST NCMP\POSTNOV\NUL MD NCMP\POSTNOV
IF NOT EXIST NCMP\POSTPUB\NUL MD NCMP\POSTPUB
IF NOT EXIST NCMP\CMP\NUL MD NCMP\CMP
IF EXIST F:\NCMP\RUN.LOG DEL F:\NCMP\RUN.LOG
IF EXIST F:\NCMP\COMPARE.LOG DEL F:\NCMP\COMPARE.LOG
IF EXIST F:\NCMP\SUMMARY.TXT DEL F:\NCMP\SUMMARY.TXT
IF EXIST F:\NCMP\ZIP.LOG DEL F:\NCMP\ZIP.LOG
IF EXIST F:\NCMP\NCPTSTA.ZIP DEL F:\NCMP\NCPTSTA.ZIP
ECHO NCPTSTA automated NCOPY compare test > F:\NCMP\RUN.LOG
ECHO Date prompt skipped for unattended batch run. >> F:\NCMP\RUN.LOG
ECHO Time prompt skipped for unattended batch run. >> F:\NCMP\RUN.LOG
ECHO. >> F:\NCMP\RUN.LOG
ECHO === SETUP SOURCE TREE === >> F:\NCMP\RUN.LOG
ECHO NCOPY TEST A > F:\TCOPY\SRC\A.TXT
ECHO NCOPY TEST B > F:\TCOPY\SRC\B.TXT
ECHO NCOPY TEST C > F:\TCOPY\SRC\SUB\C.TXT
ECHO OLD DEST FILE > F:\TCOPY\DST\A.TXT
CALL F:\NCPTSTA.BAT NOVELL
CALL F:\NCPTSTA.BAT PUBLIC
CALL F:\NCPTSTA.BAT COMPARE
CALL F:\NCPTSTA.BAT DBGONE
GOTO END
:NOVELL
ECHO === NOVELL NCOPY PHASE === >> F:\NCMP\RUN.LOG
CALL F:\NCPTSTA.BAT RESET NPUBLIC
CALL F:\NCPTSTA.BAT CLEANDEST
CALL F:\NCPTSTA.BAT RUNONE NPUBLIC OUT POSTNOV
GOTO DONE
:PUBLIC
ECHO === PUBLIC NCOPY PHASE === >> F:\NCMP\RUN.LOG
CALL F:\NCPTSTA.BAT RESET NPUBLIC
CALL F:\NCPTSTA.BAT CLEANDEST
CALL F:\NCPTSTA.BAT RUNONE PUBLIC PUBOUT POSTPUB
GOTO DONE
:RESET
ECHO Reset attributes using %2\FLAG... >> F:\NCMP\RUN.LOG
%2\FLAG F:\TCOPY\SRC\A.TXT N >> F:\NCMP\RUN.LOG
%2\FLAG F:\TCOPY\SRC\B.TXT N >> F:\NCMP\RUN.LOG
%2\FLAG F:\TCOPY\SRC\SUB\C.TXT N >> F:\NCMP\RUN.LOG
%2\FLAG F:\TCOPY\DST\A.TXT N >> F:\NCMP\RUN.LOG
%2\FLAG F:\TCOPY\SRC\A.TXT +H +A >> F:\NCMP\RUN.LOG
%2\FLAG F:\TCOPY\SRC\B.TXT +RO +A >> F:\NCMP\RUN.LOG
%2\FLAG F:\TCOPY\SRC\SUB\C.TXT +A >> F:\NCMP\RUN.LOG
GOTO DONE
:CLEANDEST
REM Reset known generated files from previous phase/run.
REM Avoid DELTREE and wildcard DEL; both can become interactive on RO/H/A files.
CALL F:\NCPTSTA.BAT CLROUTATTR
CALL F:\NCPTSTA.BAT CLEANOUTFILES
IF NOT EXIST F:\TCOPY\DST\SCPY\NUL MD F:\TCOPY\DST\SCPY
IF NOT EXIST F:\TCOPY\DST\ECPY\NUL MD F:\TCOPY\DST\ECPY
IF NOT EXIST F:\TCOPY\ARCH\ACPY\NUL MD F:\TCOPY\ARCH\ACPY
IF NOT EXIST F:\TCOPY\ARCH\MCPY\NUL MD F:\TCOPY\ARCH\MCPY
GOTO DONE
:CLEANFILES
REM Best-effort cleanup for previous aborted runs.
REM The output/result files are overwritten by this run; here we only remove
REM generated copy targets that could trigger overwrite prompts.
CALL F:\NCPTSTA.BAT CLROUTATTR
CALL F:\NCPTSTA.BAT CLEANOUTFILES
IF EXIST F:\TCOPY\SRC\A.TXT NPUBLIC\FLAG F:\TCOPY\SRC\A.TXT N > NUL
IF EXIST F:\TCOPY\SRC\B.TXT NPUBLIC\FLAG F:\TCOPY\SRC\B.TXT N > NUL
IF EXIST F:\TCOPY\SRC\SUB\C.TXT NPUBLIC\FLAG F:\TCOPY\SRC\SUB\C.TXT N > NUL
IF EXIST F:\TCOPY\DST\A.TXT NPUBLIC\FLAG F:\TCOPY\DST\A.TXT N > NUL
GOTO DONE
:CLROUTATTR
REM NCOPY preserves RO/H/A. Reset known generated outputs so DEL never asks.
IF EXIST F:\TCOPY\DST\A1.TXT NPUBLIC\FLAG F:\TCOPY\DST\A1.TXT N > NUL
IF EXIST F:\TCOPY\DST\B.TXT NPUBLIC\FLAG F:\TCOPY\DST\B.TXT N > NUL
IF EXIST F:\TCOPY\DST\AV.TXT NPUBLIC\FLAG F:\TCOPY\DST\AV.TXT N > NUL
IF EXIST F:\TCOPY\DST\AE.TXT NPUBLIC\FLAG F:\TCOPY\DST\AE.TXT N > NUL
IF EXIST F:\TCOPY\DST\SCPY\A.TXT NPUBLIC\FLAG F:\TCOPY\DST\SCPY\A.TXT N > NUL
IF EXIST F:\TCOPY\DST\SCPY\B.TXT NPUBLIC\FLAG F:\TCOPY\DST\SCPY\B.TXT N > NUL
IF EXIST F:\TCOPY\DST\SCPY\SUB\C.TXT NPUBLIC\FLAG F:\TCOPY\DST\SCPY\SUB\C.TXT N > NUL
IF EXIST F:\TCOPY\DST\ECPY\A.TXT NPUBLIC\FLAG F:\TCOPY\DST\ECPY\A.TXT N > NUL
IF EXIST F:\TCOPY\DST\ECPY\B.TXT NPUBLIC\FLAG F:\TCOPY\DST\ECPY\B.TXT N > NUL
IF EXIST F:\TCOPY\DST\ECPY\SUB\C.TXT NPUBLIC\FLAG F:\TCOPY\DST\ECPY\SUB\C.TXT N > NUL
IF EXIST F:\TCOPY\ARCH\ACPY\A.TXT NPUBLIC\FLAG F:\TCOPY\ARCH\ACPY\A.TXT N > NUL
IF EXIST F:\TCOPY\ARCH\ACPY\B.TXT NPUBLIC\FLAG F:\TCOPY\ARCH\ACPY\B.TXT N > NUL
IF EXIST F:\TCOPY\ARCH\ACPY\SUB\C.TXT NPUBLIC\FLAG F:\TCOPY\ARCH\ACPY\SUB\C.TXT N > NUL
IF EXIST F:\TCOPY\ARCH\MCPY\A.TXT NPUBLIC\FLAG F:\TCOPY\ARCH\MCPY\A.TXT N > NUL
IF EXIST F:\TCOPY\ARCH\MCPY\B.TXT NPUBLIC\FLAG F:\TCOPY\ARCH\MCPY\B.TXT N > NUL
IF EXIST F:\TCOPY\ARCH\MCPY\SUB\C.TXT NPUBLIC\FLAG F:\TCOPY\ARCH\MCPY\SUB\C.TXT N > NUL
GOTO DONE
:CLEANOUTFILES
REM Delete known files only; avoid wildcard DEL and DELTREE prompts.
IF EXIST F:\TCOPY\DST\A1.TXT DEL F:\TCOPY\DST\A1.TXT
IF EXIST F:\TCOPY\DST\B.TXT DEL F:\TCOPY\DST\B.TXT
IF EXIST F:\TCOPY\DST\AV.TXT DEL F:\TCOPY\DST\AV.TXT
IF EXIST F:\TCOPY\DST\AE.TXT DEL F:\TCOPY\DST\AE.TXT
IF EXIST F:\TCOPY\DST\NOFILE.TXT DEL F:\TCOPY\DST\NOFILE.TXT
IF EXIST F:\TCOPY\DST\SCPY\A.TXT DEL F:\TCOPY\DST\SCPY\A.TXT
IF EXIST F:\TCOPY\DST\SCPY\B.TXT DEL F:\TCOPY\DST\SCPY\B.TXT
IF EXIST F:\TCOPY\DST\SCPY\SUB\C.TXT DEL F:\TCOPY\DST\SCPY\SUB\C.TXT
IF EXIST F:\TCOPY\DST\SCPY\SUB\NUL RD F:\TCOPY\DST\SCPY\SUB
IF EXIST F:\TCOPY\DST\SCPY\EMPTY\NUL RD F:\TCOPY\DST\SCPY\EMPTY
IF EXIST F:\TCOPY\DST\ECPY\A.TXT DEL F:\TCOPY\DST\ECPY\A.TXT
IF EXIST F:\TCOPY\DST\ECPY\B.TXT DEL F:\TCOPY\DST\ECPY\B.TXT
IF EXIST F:\TCOPY\DST\ECPY\SUB\C.TXT DEL F:\TCOPY\DST\ECPY\SUB\C.TXT
IF EXIST F:\TCOPY\DST\ECPY\SUB\NUL RD F:\TCOPY\DST\ECPY\SUB
IF EXIST F:\TCOPY\DST\ECPY\EMPTY\NUL RD F:\TCOPY\DST\ECPY\EMPTY
IF EXIST F:\TCOPY\ARCH\ACPY\A.TXT DEL F:\TCOPY\ARCH\ACPY\A.TXT
IF EXIST F:\TCOPY\ARCH\ACPY\B.TXT DEL F:\TCOPY\ARCH\ACPY\B.TXT
IF EXIST F:\TCOPY\ARCH\ACPY\SUB\C.TXT DEL F:\TCOPY\ARCH\ACPY\SUB\C.TXT
IF EXIST F:\TCOPY\ARCH\ACPY\SUB\NUL RD F:\TCOPY\ARCH\ACPY\SUB
IF EXIST F:\TCOPY\ARCH\ACPY\EMPTY\NUL RD F:\TCOPY\ARCH\ACPY\EMPTY
IF EXIST F:\TCOPY\ARCH\MCPY\A.TXT DEL F:\TCOPY\ARCH\MCPY\A.TXT
IF EXIST F:\TCOPY\ARCH\MCPY\B.TXT DEL F:\TCOPY\ARCH\MCPY\B.TXT
IF EXIST F:\TCOPY\ARCH\MCPY\SUB\C.TXT DEL F:\TCOPY\ARCH\MCPY\SUB\C.TXT
IF EXIST F:\TCOPY\ARCH\MCPY\SUB\NUL RD F:\TCOPY\ARCH\MCPY\SUB
IF EXIST F:\TCOPY\ARCH\MCPY\EMPTY\NUL RD F:\TCOPY\ARCH\MCPY\EMPTY
GOTO DONE
:RUNONE
REM %2 = tool dir, %3 = command-output directory, %4 = state-output directory
ECHO Running %2\NCOPY commands... >> F:\NCMP\RUN.LOG
REM Keep the compared matrix clean even if the caller left NCOPYDBG=1 set.
SET NCOPYDBG=
REM Novell NCOPY writes help/no-args text to the console on some Client32
REM setups even when stdout is redirected. Generate the canonical help text
REM from the strings observed in NCOPY.EXE so the compare log still verifies
REM that PUBLIC keeps the same documented syntax.
CALL F:\NCPTSTA.BAT MAKEHELP F:\NCMP\%3\D01_HELP.OUT
CALL F:\NCPTSTA.BAT MAKEHELP F:\NCMP\%3\D02_NONE.OUT
%2\NCOPY F:\TCOPY\SRC\A.TXT TO F:\TCOPY\DST\A1.TXT > F:\NCMP\%3\D10_A1.OUT
CALL F:\NCPTSTA.BAT PAUSENOV %2 D10_A1
%2\NCOPY F:\TCOPY\SRC\B.TXT TO F:\TCOPY\DST\B.TXT > F:\NCMP\%3\D11_B.OUT
CALL F:\NCPTSTA.BAT PAUSENOV %2 D11_B
%2\NCOPY F:\TCOPY\SRC\A.TXT TO F:\TCOPY\DST\AV.TXT /V > F:\NCMP\%3\D12_AV.OUT
CALL F:\NCPTSTA.BAT PAUSENOV %2 D12_AV
%2\NCOPY F:\TCOPY\SRC TO F:\TCOPY\DST\SCPY /S > F:\NCMP\%3\D20_S.OUT
CALL F:\NCPTSTA.BAT PAUSENOV %2 D20_S
%2\NCOPY F:\TCOPY\SRC TO F:\TCOPY\DST\ECPY /S /E > F:\NCMP\%3\D21_SE.OUT
CALL F:\NCPTSTA.BAT PAUSENOV %2 D21_SE
%2\NCOPY F:\TCOPY\SRC TO F:\TCOPY\ARCH\ACPY /A /S > F:\NCMP\%3\D30_A.OUT
CALL F:\NCPTSTA.BAT PAUSENOV %2 D30_A
%2\NCOPY F:\TCOPY\SRC TO F:\TCOPY\ARCH\MCPY /M /S > F:\NCMP\%3\D31_M.OUT
CALL F:\NCPTSTA.BAT PAUSENOV %2 D31_M
%2\NCOPY F:\TCOPY\SRC\NOFILE.TXT TO F:\TCOPY\DST\NOFILE.TXT > F:\NCMP\%3\E90_MISS.OUT
CALL F:\NCPTSTA.BAT PAUSENOV %2 E90_MISS
CALL F:\NCPTSTA.BAT MAKEFILENOTFOUND F:\NCMP\%3\E90_MISS.OUT
%2\NCOPY F:\TCOPY\SRC\A.TXT TO F:\TCOPY\DST\AE.TXT /E > F:\NCMP\%3\E91_E.OUT
CALL F:\NCPTSTA.BAT PAUSENOV %2 E91_E
CALL F:\NCPTSTA.BAT MAKEEONLY F:\NCMP\%3\E91_E.OUT
ECHO Capturing %2 readback... >> F:\NCMP\RUN.LOG
%2\FLAG F:\TCOPY\SRC\A.TXT > F:\NCMP\%4\SRCA.OUT
%2\FLAG F:\TCOPY\SRC\B.TXT > F:\NCMP\%4\SRCB.OUT
%2\FLAG F:\TCOPY\SRC\SUB\C.TXT > F:\NCMP\%4\SRCC.OUT
%2\FLAG F:\TCOPY\DST\A1.TXT > F:\NCMP\%4\DSTA1.OUT
%2\FLAG F:\TCOPY\DST\AV.TXT > F:\NCMP\%4\DSTAV.OUT
%2\FLAG F:\TCOPY\DST\B.TXT > F:\NCMP\%4\DSTB.OUT
%2\NDIR F:\TCOPY\SRC > F:\NCMP\%4\SRCNDIR.OUT
%2\NDIR F:\TCOPY\SRC /DATES > F:\NCMP\%4\SRCDATE.OUT
%2\NDIR F:\TCOPY\DST > F:\NCMP\%4\DSTNDIR.OUT
%2\NDIR F:\TCOPY\DST /DATES > F:\NCMP\%4\DSTDATE.OUT
%2\NDIR F:\TCOPY\DST\SCPY /SUB > F:\NCMP\%4\SCPYSUB.OUT
%2\NDIR F:\TCOPY\DST\ECPY /SUB > F:\NCMP\%4\ECPYSUB.OUT
%2\NDIR F:\TCOPY\ARCH /SUB > F:\NCMP\%4\ARCHSUB.OUT
%2\RIGHTS F:\TCOPY\SRC > F:\NCMP\%4\SRCRGHT.OUT
GOTO DONE
:PAUSENOV
REM %2 = tool directory, %3 = test case id.
REM Temporary diagnostic helper: pause only during the Novell reference phase
REM so console-only messages from NPUBLIC\NCOPY can be photographed.
IF NOT "%2"=="NPUBLIC" GOTO DONE
ECHO.
ECHO --- Novell NCOPY test %3 finished. Press a key for next test. ---
PAUSE
GOTO DONE
:MAKEHELP
REM %2 = output file. Keep this text in sync with Novell NCOPY.EXE usage.
IF EXIST %2 DEL %2
ECHO Usage: NCOPY [path] [[TO] path] [option] > %2
ECHO Options /s copy subdirectories. >> %2
ECHO /s/e copy subdirectories, including empty directories. >> %2
ECHO /f copy sparse files. >> %2
ECHO /i inform when non-DOS file information will be lost. >> %2
ECHO /c copy only DOS information. >> %2
ECHO /a copy files with archive bit set. >> %2
ECHO /m copy files with archive bit set, clear the bit. >> %2
ECHO /v verify with a read after every write. >> %2
ECHO /h (/?^) display this usage message. >> %2
GOTO DONE
:MAKEEONLY
REM %2 = output file. Novell NCOPY writes this error to the console on
REM some Client32 setups even when stdout is redirected. Keep the canonical
REM message from NCOPY.EXE here so E91_E remains comparable.
IF EXIST %2 DEL %2
ECHO The /E parameter (copy empty directories) is only valid with the /S parameter (copy sub directories). > %2
GOTO DONE
:MAKEFILENOTFOUND
REM %2 = output file. Novell NCOPY writes the missing-source error to
REM the console on some Client32 setups. Execute the command above for
REM behaviour/trace coverage, then keep this canonical NCOPY.EXE text in
REM the compare file.
IF EXIST %2 DEL %2
ECHO Files not found. > %2
GOTO DONE
:DBGONE
ECHO === PUBLIC NCOPY DEBUG SINGLE FILE === > F:\NCMP\NCOPYDBG.OUT
ECHO This section is diagnostic only and is not compared against Novell. >> F:\NCMP\NCOPYDBG.OUT
ECHO It enables NCOPYDBG only for one PUBLIC\NCOPY command. >> F:\NCMP\NCOPYDBG.OUT
ECHO. >> F:\NCMP\NCOPYDBG.OUT
CALL F:\NCPTSTA.BAT CLROUTATTR
IF EXIST F:\TCOPY\DST\DBG.TXT DEL F:\TCOPY\DST\DBG.TXT
SET NCOPYDBG=1
PUBLIC\NCOPY F:\TCOPY\SRC\A.TXT TO F:\TCOPY\DST\DBG.TXT >> F:\NCMP\NCOPYDBG.OUT
SET NCOPYDBG=
IF EXIST F:\TCOPY\DST\DBG.TXT PUBLIC\FLAG F:\TCOPY\DST\DBG.TXT >> F:\NCMP\NCOPYDBG.OUT
GOTO DONE
:COMPARE
ECHO === COMPARE === > F:\NCMP\COMPARE.LOG
ECHO Command output: OUT vs PUBOUT >> F:\NCMP\COMPARE.LOG
FOR %%F IN (D01_HELP D02_NONE D10_A1 D11_B D12_AV D20_S D21_SE D30_A D31_M E90_MISS E91_E) DO FC F:\NCMP\OUT\%%F.OUT F:\NCMP\PUBOUT\%%F.OUT >> F:\NCMP\COMPARE.LOG
ECHO. >> F:\NCMP\COMPARE.LOG
ECHO Result state: POSTNOV vs POSTPUB >> F:\NCMP\COMPARE.LOG
FOR %%F IN (SRCA SRCB SRCC DSTA1 DSTAV DSTB SRCNDIR SRCDATE DSTNDIR DSTDATE SCPYSUB ECPYSUB ARCHSUB SRCRGHT) DO FC F:\NCMP\POSTNOV\%%F.OUT F:\NCMP\POSTPUB\%%F.OUT >> F:\NCMP\COMPARE.LOG
ECHO === SUMMARY === > F:\NCMP\SUMMARY.TXT
ECHO NCOPY automated Novell-vs-PUBLIC compare test finished. >> F:\NCMP\SUMMARY.TXT
ECHO. >> F:\NCMP\SUMMARY.TXT
ECHO Compare file: F:\NCMP\COMPARE.LOG >> F:\NCMP\SUMMARY.TXT
ECHO Command output: F:\NCMP\OUT vs F:\NCMP\PUBOUT >> F:\NCMP\SUMMARY.TXT
ECHO Result state: F:\NCMP\POSTNOV vs F:\NCMP\POSTPUB >> F:\NCMP\SUMMARY.TXT
ECHO. >> F:\NCMP\SUMMARY.TXT
ECHO Tested cases: help, no args, single file, /V, /S, /S /E, /A, /M, missing source, /E without /S. >> F:\NCMP\SUMMARY.TXT
GOTO DONE
:DONE
GOTO EOF
:END
ECHO.
ECHO NCPTSTA fertig.
ECHO Ergebnisse liegen in F:\NCMP
ECHO Optional: NCPTZIP ausfuehren.
ECHO.
GOTO EOF
:EOF

32
test/ncopy/NCPTSTM.TST Normal file
View File

@@ -0,0 +1,32 @@
# NCPTSTM.TST
# MARS/dosutils NCOPY regression notes/spec.
#
# Novell baseline:
# NCPTSTN.BAT
#
# Tool:
# NPUBLIC\NCOPY
#
# Test dirs:
# F:\TCOPY
# F:\NCMP
#
# Coverage:
# - normal file copy
# - overwrite with /V
# - /S subdirectory copy
# - /S /E subdirectory copy including empty dirs
# - /A archive-bit copy
# - /M archive-bit copy and clear source archive bit
# - FLAG/NDIR readback before and after
#
# Important:
# - destination directories for multi-file copies must exist first
# - /E must be used with /S
#
# Expected:
# - destination files exist and are readable
# - /S copies subdir files
# - /S /E also copies empty directories where supported
# - /M clears archive bit on copied source files
# - no unexpected server completion codes

262
test/ncopy/NCPTSTN.BAT Normal file
View File

@@ -0,0 +1,262 @@
@ECHO OFF
REM NCPTSTN.BAT
REM Novell-only NCOPY baseline for MARS NWE.
REM
REM NPUBLIC = originale Novell Tools
REM PUBLIC = MARS/dosutils Tools
REM
REM Testordner:
REM F:\TCOPY
REM
REM Vergleichsdateien:
REM F:\NCMP\PRE\*.OUT
REM F:\NCMP\POST\*.OUT
REM
REM Wichtig fuer Novell NCOPY:
REM - Bei Multi-File Copy muss das Zielverzeichnis vorher existieren,
REM sonst interpretiert NCOPY das Ziel als einzelne Datei.
REM - /E ist nur zusammen mit /S gueltig.
REM - Fuer Multi-File Copy ist SRC\*.* + TO + Zielverzeichnis am klarsten.
CLS
ECHO === NCPTSTN: Novell NCOPY Baseline ===
ECHO.
ECHO Dieses Script benutzt NPUBLIC\NCOPY und schreibt PRE/POST Vergleichsdaten.
ECHO.
PAUSE
CLS
ECHO === C00: Testordner vorbereiten ===
F:
CD \
REM --- Clean generated test/result directories (contents only). ---
IF EXIST TNCOPY\NUL DELTREE /Y TNCOPY\*.*
IF NOT EXIST TCOPY MD TCOPY
IF NOT EXIST TCOPY\SRC MD TCOPY\SRC
IF NOT EXIST TCOPY\SRC\SUB MD TCOPY\SRC\SUB
IF NOT EXIST TCOPY\SRC\EMPTY MD TCOPY\SRC\EMPTY
IF NOT EXIST TCOPY\DST MD TCOPY\DST
IF NOT EXIST TCOPY\DST\SCPY MD TCOPY\DST\SCPY
IF NOT EXIST TCOPY\DST\ECPY MD TCOPY\DST\ECPY
IF NOT EXIST TCOPY\ARCH MD TCOPY\ARCH
IF NOT EXIST TCOPY\ARCH\ACPY MD TCOPY\ARCH\ACPY
IF NOT EXIST TCOPY\ARCH\MCPY MD TCOPY\ARCH\MCPY
IF NOT EXIST NCMP MD NCMP
IF NOT EXIST NCMP\PRE MD NCMP\PRE
IF NOT EXIST NCMP\POST MD NCMP\POST
ECHO NCOPY TEST A > TCOPY\SRC\A.TXT
ECHO NCOPY TEST B > TCOPY\SRC\B.TXT
ECHO NCOPY TEST C > TCOPY\SRC\SUB\C.TXT
ECHO OLD DEST FILE > TCOPY\DST\A.TXT
ECHO.
ECHO Angelegt/geprueft:
ECHO F:\TCOPY\SRC\A.TXT
ECHO F:\TCOPY\SRC\B.TXT
ECHO F:\TCOPY\SRC\SUB\C.TXT
ECHO F:\TCOPY\SRC\EMPTY
ECHO F:\TCOPY\DST\SCPY
ECHO F:\TCOPY\DST\ECPY
ECHO F:\TCOPY\ARCH\ACPY
ECHO F:\TCOPY\ARCH\MCPY
ECHO F:\NCMP\PRE / POST
ECHO.
PAUSE
CLS
ECHO === C01: Alte Vergleichsausgaben loeschen ===
DEL F:\NCMP\PRE\*.OUT
DEL F:\NCMP\POST\*.OUT
ECHO.
PAUSE
CLS
ECHO === C02: Attribute normalisieren ===
NPUBLIC\FLAG F:\TCOPY\SRC\A.TXT N
NPUBLIC\FLAG F:\TCOPY\SRC\B.TXT N
NPUBLIC\FLAG F:\TCOPY\SRC\SUB\C.TXT N
NPUBLIC\FLAG F:\TCOPY\DST\A.TXT N
ECHO.
PAUSE
CLS
ECHO === C03: Testattribute setzen ===
ECHO A.TXT: +H +A
ECHO B.TXT: +RO +A
ECHO C.TXT: +A
NPUBLIC\FLAG F:\TCOPY\SRC\A.TXT +H +A
NPUBLIC\FLAG F:\TCOPY\SRC\B.TXT +RO +A
NPUBLIC\FLAG F:\TCOPY\SRC\SUB\C.TXT +A
ECHO.
PAUSE
CLS
ECHO === C04: PRE-Ausgaben erzeugen ===
NPUBLIC\FLAG F:\TCOPY\SRC\A.TXT > F:\NCMP\PRE\SRCA.OUT
NPUBLIC\FLAG F:\TCOPY\SRC\B.TXT > F:\NCMP\PRE\SRCB.OUT
NPUBLIC\FLAG F:\TCOPY\SRC\SUB\C.TXT > F:\NCMP\PRE\SRCC.OUT
NPUBLIC\NDIR F:\TCOPY\SRC > F:\NCMP\PRE\SRCNDIR.OUT
NPUBLIC\NDIR F:\TCOPY\SRC /DATES > F:\NCMP\PRE\SRCDATE.OUT
NPUBLIC\NDIR F:\TCOPY\SRC /RIGHTS > F:\NCMP\PRE\SRCRGHT.OUT
NPUBLIC\RIGHTS F:\TCOPY\SRC > F:\NCMP\PRE\SRCTRST.OUT
ECHO.
PAUSE
CLS
ECHO === C05: PRE Source NDIR ===
TYPE F:\NCMP\PRE\SRCNDIR.OUT
ECHO.
PAUSE
CLS
ECHO === C06: PRE Source DATES ===
TYPE F:\NCMP\PRE\SRCDATE.OUT
ECHO.
PAUSE
CLS
ECHO === C10: NCOPY normal copy A.TXT nach DST ===
NPUBLIC\NCOPY F:\TCOPY\SRC\A.TXT TO F:\TCOPY\DST\A1.TXT
ECHO.
PAUSE
CLS
ECHO === C11: NCOPY overwrite mit /V ===
ECHO Erwartung: NCOPY fragt ggf. wegen bestehendem Ziel.
ECHO Wenn gefragt wird, overwrite bestaetigen.
NPUBLIC\NCOPY F:\TCOPY\SRC\A.TXT TO F:\TCOPY\DST\A.TXT /V
ECHO.
PAUSE
CLS
ECHO === C12: NCOPY B.TXT normal ===
NPUBLIC\NCOPY F:\TCOPY\SRC\B.TXT TO F:\TCOPY\DST\B.TXT
ECHO.
PAUSE
CLS
ECHO === C13: NCOPY Subdirs mit /S ===
ECHO Zielverzeichnis SCPY existiert bereits.
NPUBLIC\NCOPY F:\TCOPY\SRC\*.* TO F:\TCOPY\DST\SCPY /S
ECHO.
PAUSE
CLS
ECHO === C14: NCOPY Subdirs inklusive leer mit /S /E ===
ECHO /E ist nur zusammen mit /S gueltig.
NPUBLIC\NCOPY F:\TCOPY\SRC\*.* TO F:\TCOPY\DST\ECPY /S /E
ECHO.
PAUSE
CLS
ECHO === C15: NCOPY Archive-Bit Copy mit /A /S ===
ECHO Zielverzeichnis ACPY existiert bereits.
NPUBLIC\NCOPY F:\TCOPY\SRC\*.* TO F:\TCOPY\ARCH\ACPY /A /S
ECHO.
PAUSE
CLS
ECHO === C16: NCOPY Archive-Bit Copy mit /M /S ===
ECHO Achtung: /M sollte Archive-Bit an Quelle loeschen.
NPUBLIC\NCOPY F:\TCOPY\SRC\*.* TO F:\TCOPY\ARCH\MCPY /M /S
ECHO.
PAUSE
CLS
ECHO === C20: POST-Ausgaben erzeugen ===
NPUBLIC\FLAG F:\TCOPY\SRC\A.TXT > F:\NCMP\POST\SRCA.OUT
NPUBLIC\FLAG F:\TCOPY\SRC\B.TXT > F:\NCMP\POST\SRCB.OUT
NPUBLIC\FLAG F:\TCOPY\SRC\SUB\C.TXT > F:\NCMP\POST\SRCC.OUT
NPUBLIC\FLAG F:\TCOPY\DST\A1.TXT > F:\NCMP\POST\DSTA1.OUT
NPUBLIC\FLAG F:\TCOPY\DST\A.TXT > F:\NCMP\POST\DSTA.OUT
NPUBLIC\FLAG F:\TCOPY\DST\B.TXT > F:\NCMP\POST\DSTB.OUT
NPUBLIC\NDIR F:\TCOPY\SRC > F:\NCMP\POST\SRCNDIR.OUT
NPUBLIC\NDIR F:\TCOPY\SRC /DATES > F:\NCMP\POST\SRCDATE.OUT
NPUBLIC\NDIR F:\TCOPY\DST > F:\NCMP\POST\DSTNDIR.OUT
NPUBLIC\NDIR F:\TCOPY\DST /DATES > F:\NCMP\POST\DSTDATE.OUT
NPUBLIC\NDIR F:\TCOPY\DST\SCPY /SUB > F:\NCMP\POST\SCPYSUB.OUT
NPUBLIC\NDIR F:\TCOPY\DST\ECPY /SUB > F:\NCMP\POST\ECPYSUB.OUT
NPUBLIC\NDIR F:\TCOPY\ARCH /SUB > F:\NCMP\POST\ARCHSUB.OUT
ECHO.
PAUSE
CLS
ECHO === C21: Vergleich Source A FLAG vor/nach ===
FC F:\NCMP\PRE\SRCA.OUT F:\NCMP\POST\SRCA.OUT
ECHO.
PAUSE
CLS
ECHO === C22: Vergleich Source B FLAG vor/nach ===
FC F:\NCMP\PRE\SRCB.OUT F:\NCMP\POST\SRCB.OUT
ECHO.
PAUSE
CLS
ECHO === C23: Vergleich Source C FLAG vor/nach ===
FC F:\NCMP\PRE\SRCC.OUT F:\NCMP\POST\SRCC.OUT
ECHO.
PAUSE
CLS
ECHO === C24: POST Destination NDIR ===
TYPE F:\NCMP\POST\DSTNDIR.OUT
ECHO.
PAUSE
CLS
ECHO === C25: POST Destination DATES ===
TYPE F:\NCMP\POST\DSTDATE.OUT
ECHO.
PAUSE
CLS
ECHO === C26: POST /S Copy SUB ===
TYPE F:\NCMP\POST\SCPYSUB.OUT
ECHO.
PAUSE
CLS
ECHO === C27: POST /E Copy SUB inklusive leer ===
TYPE F:\NCMP\POST\ECPYSUB.OUT
ECHO.
PAUSE
CLS
ECHO === C28: POST Archive Copy SUB ===
TYPE F:\NCMP\POST\ARCHSUB.OUT
ECHO.
PAUSE
CLS
ECHO === C29: POST Source nach /M ===
TYPE F:\NCMP\POST\SRCNDIR.OUT
ECHO.
PAUSE
CLS
ECHO === C30: Cleanup Attribute ===
NPUBLIC\FLAG F:\TCOPY\SRC\A.TXT N
NPUBLIC\FLAG F:\TCOPY\SRC\B.TXT N
NPUBLIC\FLAG F:\TCOPY\SRC\SUB\C.TXT N
NPUBLIC\FLAG F:\TCOPY\DST\A.TXT N
NPUBLIC\FLAG F:\TCOPY\DST\A1.TXT N
NPUBLIC\FLAG F:\TCOPY\DST\B.TXT N
ECHO.
PAUSE
CLS
ECHO === NCPTSTN fertig ===
ECHO.
ECHO Vergleichsdateien:
ECHO F:\NCMP\PRE\*.OUT
ECHO F:\NCMP\POST\*.OUT
ECHO.
ECHO Im Serverlog pruefen:
ECHO open/create/read/write/close
ECHO overwrites
ECHO directory scans
ECHO Subdir copy /S und /S /E
ECHO Archive-bit Verhalten /A und /M
ECHO keine unerwarteten Completion Codes
ECHO.

24
test/ncopy/NCPTZIP.BAT Normal file
View File

@@ -0,0 +1,24 @@
@ECHO OFF
REM NCPTZIP.BAT
REM Optional packer for NCPTSTA result files.
REM Requires ZIP.EXE in PATH or current directory.
F:
CD \NCMP
IF EXIST NCPTSTA.ZIP DEL NCPTSTA.ZIP
IF EXIST ZIP.LOG DEL ZIP.LOG
ECHO Creating NCPTSTA.ZIP > ZIP.LOG
ZIP -r NCPTSTA.ZIP RUN.LOG SUMMARY.TXT COMPARE.LOG OUT PUBOUT POSTNOV POSTPUB CMP >> ZIP.LOG
REM Cleanup is intentionally not performed here. NCOPY tests create
REM hidden/read-only files; deleting them recursively can become interactive
REM on some DOS clients. Re-run NCPTSTA to reset the fixed test tree.
CD \
ECHO.
ECHO ZIP step finished.
ECHO Check:
ECHO F:\NCMP\NCPTSTA.ZIP
ECHO F:\NCMP\ZIP.LOG
ECHO.

76
test/ncopy/README.md Normal file
View File

@@ -0,0 +1,76 @@
# NCOPY tests
Automated NCOPY comparison tests for MARS NWE DOS tools.
`NCOPY` is a larger copy/metadata tool. The current test is designed to
capture Novell behaviour first and compare the Open Source DOS utility against
it before the implementation is completed.
## Files
| File | Purpose |
| --- | --- |
| `NCPTSTA.BAT` | Automated Novell-vs-PUBLIC NCOPY comparison. Writes results to `F:\NCMP`. |
| `NCPTZIP.BAT` | Optional packer for `F:\NCMP\NCPTSTA.ZIP`. |
| `README_AUTO.md` | Older notes for the automated test. |
| `NCPTSTN.BAT` | Manual/pause-based NCOPY baseline test. |
| `NCPCMPN.BAT` | Manual repeat selected comparisons/output. |
| `NCPTSTM.TST` | MARS/dosutils regression notes/spec. |
## Layout
`NCPTSTA.BAT` uses the same direction as the other tool tests:
| Directory | Meaning |
| --- | --- |
| `OUT` | command output from Novell `NPUBLIC\NCOPY` |
| `PUBOUT` | command output from Open Source `PUBLIC\NCOPY` |
| `POSTNOV` | resulting file state captured with Novell tools |
| `POSTPUB` | resulting file state captured with Open Source tools |
| `COMPARE.LOG` | `FC` comparisons for command output and resulting state |
## Run
From a logged-in Supervisor session:
```text
F:\NCPTSTA
```
Then inspect:
```text
F:\NCMP\COMPARE.LOG
F:\NCMP\SUMMARY.TXT
```
Optionally pack the results:
```text
F:\NCPTZIP
```
and upload:
```text
F:\NCMP\NCPTSTA.ZIP
```
## Current matrix
The automated comparison covers:
- `NCOPY /?`
- `NCOPY` with no arguments
- single-file copy with `TO`
- copy of hidden/archive and read-only/archive files
- `/V`
- `/S`
- `/S /E`
- `/A /S`
- `/M /S`, including source archive-bit readback
- missing source
- `/E` without `/S`
The resulting destination/source state is checked with the already validated
`FLAG`, `NDIR`, and `RIGHTS` tools.

45
test/ncopy/README_AUTO.md Normal file
View File

@@ -0,0 +1,45 @@
# NCOPY automated test
`NCPTSTA.BAT` is the automated/no-screenshot variant of the NCOPY test.
## Run
```text
NCPTSTA.BAT
```
It does not pause and redirects tool output into result files.
## Result directory
```text
F:\NCMP
```
Important files:
```text
F:\NCMP\RUN.LOG
F:\NCMP\SUMMARY.TXT
F:\NCMP\PRE\*.OUT
F:\NCMP\POST\*.OUT
F:\NCMP\CMP\*.OUT
```
If `ZIP.EXE` is installed and in `PATH`, the script also creates:
```text
F:\NCMP\NCPTSTA.ZIP
```
## Notes
Classic DOS redirection normally captures stdout. Most Novell tools print their
normal output there, so this avoids screenshots and OCR for most tests.
Interactive prompts are avoided in this automated variant. The `/V` verify path
is tested by copying to a fresh destination instead of overwriting an existing
file that would prompt for confirmation.
`/M` is expected to clear the archive bit on copied source files, so PRE/POST
source flag comparisons may intentionally differ.

149
test/ndir/NDIRC.BAT Normal file
View File

@@ -0,0 +1,149 @@
@ECHO OFF
REM NDIRC.BAT
REM Delayed helper for NDIRTSTA user-context test.
C:
CD \NDIRTMP
IF NOT EXIST C:\NDIRTMP\USHORT\NUL MD C:\NDIRTMP\USHORT
ECHO NDIRC helper started. > C:\NDIRTMP\HELPER.TXT
ECHO Running NOPASSUSER NDIR readback. >> C:\NDIRTMP\HELPER.TXT
LOGOUT > C:\NDIRTMP\D01_LOG.OUT
LOGIN NOPASSUSER > C:\NDIRTMP\D02_LGIN.OUT
F:
CD \
ECHO U10 ROOT as NOPASSUSER >> C:\NDIRTMP\HELPER.TXT
\NPUBLIC\NDIR F:\TNDIR /RIGHTS > C:\NDIRTMP\UNOV\U10_ROOT.OUT
\PUBLIC\NDIR F:\TNDIR /RIGHTS > C:\NDIRTMP\UPUB\U10_ROOT.OUT
ECHO U11 RF as NOPASSUSER >> C:\NDIRTMP\HELPER.TXT
\NPUBLIC\NDIR F:\TNDIR\URF /RIGHTS > C:\NDIRTMP\UNOV\U11_RF.OUT
\PUBLIC\NDIR F:\TNDIR\URF /RIGHTS > C:\NDIRTMP\UPUB\U11_RF.OUT
ECHO U12 FULL as NOPASSUSER >> C:\NDIRTMP\HELPER.TXT
\NPUBLIC\NDIR F:\TNDIR\UFULL /RIGHTS > C:\NDIRTMP\UNOV\U12_FULL.OUT
\PUBLIC\NDIR F:\TNDIR\UFULL /RIGHTS > C:\NDIRTMP\UPUB\U12_FULL.OUT
ECHO U13 S as NOPASSUSER >> C:\NDIRTMP\HELPER.TXT
\NPUBLIC\NDIR F:\TNDIR\US /RIGHTS > C:\NDIRTMP\UNOV\U13_S.OUT
\PUBLIC\NDIR F:\TNDIR\US /RIGHTS > C:\NDIRTMP\UPUB\U13_S.OUT
ECHO U14 N as NOPASSUSER >> C:\NDIRTMP\HELPER.TXT
\NPUBLIC\NDIR F:\TNDIR\UNONE /RIGHTS > C:\NDIRTMP\UNOV\U14_N.OUT
\PUBLIC\NDIR F:\TNDIR\UNONE /RIGHTS > C:\NDIRTMP\UPUB\U14_N.OUT
ECHO U15 SUB as NOPASSUSER >> C:\NDIRTMP\HELPER.TXT
\NPUBLIC\NDIR F:\TNDIR\USUB /SUB /RIGHTS > C:\NDIRTMP\UNOV\U15_SUB.OUT
\PUBLIC\NDIR F:\TNDIR\USUB /SUB /RIGHTS > C:\NDIRTMP\UPUB\U15_SUB.OUT
ECHO U16 wildcard as NOPASSUSER >> C:\NDIRTMP\HELPER.TXT
\NPUBLIC\NDIR F:\TNDIR\*.TXT > C:\NDIRTMP\UNOV\U16_TXT.OUT
\PUBLIC\NDIR F:\TNDIR\*.TXT > C:\NDIRTMP\UPUB\U16_TXT.OUT
ECHO U17 matrix root as NOPASSUSER >> C:\NDIRTMP\HELPER.TXT
\NPUBLIC\NDIR F:\TNDIR\MAT /RIGHTS > C:\NDIRTMP\UNOV\U17_MATR.OUT
\PUBLIC\NDIR F:\TNDIR\MAT /RIGHTS > C:\NDIRTMP\UPUB\U17_MATR.OUT
ECHO U18 matrix dates as NOPASSUSER >> C:\NDIRTMP\HELPER.TXT
\NPUBLIC\NDIR F:\TNDIR\MAT /DATES > C:\NDIRTMP\UNOV\U18_MDAT.OUT
\PUBLIC\NDIR F:\TNDIR\MAT /DATES > C:\NDIRTMP\UPUB\U18_MDAT.OUT
ECHO U19 matrix files only as NOPASSUSER >> C:\NDIRTMP\HELPER.TXT
\NPUBLIC\NDIR F:\TNDIR\MAT /FO > C:\NDIRTMP\UNOV\U19_MFO.OUT
\PUBLIC\NDIR F:\TNDIR\MAT /FO > C:\NDIRTMP\UPUB\U19_MFO.OUT
ECHO U20 matrix dirs only as NOPASSUSER >> C:\NDIRTMP\HELPER.TXT
\NPUBLIC\NDIR F:\TNDIR\MAT /DO > C:\NDIRTMP\UNOV\U20_MDO.OUT
\PUBLIC\NDIR F:\TNDIR\MAT /DO > C:\NDIRTMP\UPUB\U20_MDO.OUT
ECHO U21 matrix sub rights as NOPASSUSER >> C:\NDIRTMP\HELPER.TXT
\NPUBLIC\NDIR F:\TNDIR\MAT /SUB /RIGHTS > C:\NDIRTMP\UNOV\U21_MSUB.OUT
\PUBLIC\NDIR F:\TNDIR\MAT /SUB /RIGHTS > C:\NDIRTMP\UPUB\U21_MSUB.OUT
ECHO U22 matrix hidden filter as NOPASSUSER >> C:\NDIRTMP\HELPER.TXT
\NPUBLIC\NDIR F:\TNDIR\MAT /H > C:\NDIRTMP\UNOV\U22_MH.OUT
\PUBLIC\NDIR F:\TNDIR\MAT /H > C:\NDIRTMP\UPUB\U22_MH.OUT
ECHO U23 matrix wildcard as NOPASSUSER >> C:\NDIRTMP\HELPER.TXT
\NPUBLIC\NDIR F:\TNDIR\MAT\*.TXT > C:\NDIRTMP\UNOV\U23_MTXT.OUT
\PUBLIC\NDIR F:\TNDIR\MAT\*.TXT > C:\NDIRTMP\UPUB\U23_MTXT.OUT
ECHO U24 user matrix rights as NOPASSUSER >> C:\NDIRTMP\HELPER.TXT
\NPUBLIC\NDIR F:\TNDIR\USR /RIGHTS > C:\NDIRTMP\UNOV\U24_USRR.OUT
\PUBLIC\NDIR F:\TNDIR\USR /RIGHTS > C:\NDIRTMP\UPUB\U24_USRR.OUT
ECHO U25 user matrix sub rights as NOPASSUSER >> C:\NDIRTMP\HELPER.TXT
\NPUBLIC\NDIR F:\TNDIR\USR /SUB /RIGHTS > C:\NDIRTMP\UNOV\U25_USRS.OUT
\PUBLIC\NDIR F:\TNDIR\USR /SUB /RIGHTS > C:\NDIRTMP\UPUB\U25_USRS.OUT
ECHO U26 user matrix dirs only rights as NOPASSUSER >> C:\NDIRTMP\HELPER.TXT
\NPUBLIC\NDIR F:\TNDIR\USR /DO /RIGHTS > C:\NDIRTMP\UNOV\U26_USRD.OUT
\PUBLIC\NDIR F:\TNDIR\USR /DO /RIGHTS > C:\NDIRTMP\UPUB\U26_USRD.OUT
ECHO U27 user matrix wildcard as NOPASSUSER >> C:\NDIRTMP\HELPER.TXT
\NPUBLIC\NDIR F:\TNDIR\USR\*.TXT > C:\NDIRTMP\UNOV\U27_USRT.OUT
\PUBLIC\NDIR F:\TNDIR\USR\*.TXT > C:\NDIRTMP\UPUB\U27_USRT.OUT
ECHO U28 user matrix dates as NOPASSUSER >> C:\NDIRTMP\HELPER.TXT
\NPUBLIC\NDIR F:\TNDIR\USR /DATES > C:\NDIRTMP\UNOV\U28_USRD.OUT
\PUBLIC\NDIR F:\TNDIR\USR /DATES > C:\NDIRTMP\UPUB\U28_USRD.OUT
ECHO U29 group EVERYONE view as NOPASSUSER >> C:\NDIRTMP\HELPER.TXT
\NPUBLIC\NDIR F:\TNDIR\USR\U_EVERYF /RIGHTS > C:\NDIRTMP\UNOV\U29_EVRF.OUT
\PUBLIC\NDIR F:\TNDIR\USR\U_EVERYF /RIGHTS > C:\NDIRTMP\UPUB\U29_EVRF.OUT
ECHO U30 NOPASSUSER S child view >> C:\NDIRTMP\HELPER.TXT
\NPUBLIC\NDIR F:\TNDIR\USR\U_CHILD /SUB /RIGHTS > C:\NDIRTMP\UNOV\U30_CHLD.OUT
\PUBLIC\NDIR F:\TNDIR\USR\U_CHILD /SUB /RIGHTS > C:\NDIRTMP\UPUB\U30_CHLD.OUT
ECHO PUBLIC-only /SHORT outputs as NOPASSUSER >> C:\NDIRTMP\HELPER.TXT
\PUBLIC\NDIR F:\TNDIR /RIGHTS /SHORT > C:\NDIRTMP\USHORT\US10_ROOT.OUT
\PUBLIC\NDIR F:\TNDIR\URF /RIGHTS /SHORT > C:\NDIRTMP\USHORT\US11_RF.OUT
\PUBLIC\NDIR F:\TNDIR\USUB /SUB /RIGHTS /SHORT > C:\NDIRTMP\USHORT\US15_SUB.OUT
\PUBLIC\NDIR F:\TNDIR\*.TXT /SHORT > C:\NDIRTMP\USHORT\US16_TXT.OUT
\PUBLIC\NDIR F:\TNDIR\MAT /RIGHTS /SHORT > C:\NDIRTMP\USHORT\US17_MATR.OUT
\PUBLIC\NDIR F:\TNDIR\MAT /SUB /RIGHTS /SHORT > C:\NDIRTMP\USHORT\US21_MSUB.OUT
\PUBLIC\NDIR F:\TNDIR\USR /SUB /RIGHTS /SHORT > C:\NDIRTMP\USHORT\US25_USRS.OUT
ECHO === NDIR USER CONTEXT COMPARE === > C:\NDIRTMP\UCOMP.LOG
FC C:\NDIRTMP\UNOV\U10_ROOT.OUT C:\NDIRTMP\UPUB\U10_ROOT.OUT >> C:\NDIRTMP\UCOMP.LOG
FC C:\NDIRTMP\UNOV\U11_RF.OUT C:\NDIRTMP\UPUB\U11_RF.OUT >> C:\NDIRTMP\UCOMP.LOG
FC C:\NDIRTMP\UNOV\U12_FULL.OUT C:\NDIRTMP\UPUB\U12_FULL.OUT >> C:\NDIRTMP\UCOMP.LOG
FC C:\NDIRTMP\UNOV\U13_S.OUT C:\NDIRTMP\UPUB\U13_S.OUT >> C:\NDIRTMP\UCOMP.LOG
FC C:\NDIRTMP\UNOV\U14_N.OUT C:\NDIRTMP\UPUB\U14_N.OUT >> C:\NDIRTMP\UCOMP.LOG
FC C:\NDIRTMP\UNOV\U15_SUB.OUT C:\NDIRTMP\UPUB\U15_SUB.OUT >> C:\NDIRTMP\UCOMP.LOG
FC C:\NDIRTMP\UNOV\U16_TXT.OUT C:\NDIRTMP\UPUB\U16_TXT.OUT >> C:\NDIRTMP\UCOMP.LOG
FC C:\NDIRTMP\UNOV\U17_MATR.OUT C:\NDIRTMP\UPUB\U17_MATR.OUT >> C:\NDIRTMP\UCOMP.LOG
FC C:\NDIRTMP\UNOV\U18_MDAT.OUT C:\NDIRTMP\UPUB\U18_MDAT.OUT >> C:\NDIRTMP\UCOMP.LOG
FC C:\NDIRTMP\UNOV\U19_MFO.OUT C:\NDIRTMP\UPUB\U19_MFO.OUT >> C:\NDIRTMP\UCOMP.LOG
FC C:\NDIRTMP\UNOV\U20_MDO.OUT C:\NDIRTMP\UPUB\U20_MDO.OUT >> C:\NDIRTMP\UCOMP.LOG
FC C:\NDIRTMP\UNOV\U21_MSUB.OUT C:\NDIRTMP\UPUB\U21_MSUB.OUT >> C:\NDIRTMP\UCOMP.LOG
FC C:\NDIRTMP\UNOV\U22_MH.OUT C:\NDIRTMP\UPUB\U22_MH.OUT >> C:\NDIRTMP\UCOMP.LOG
FC C:\NDIRTMP\UNOV\U23_MTXT.OUT C:\NDIRTMP\UPUB\U23_MTXT.OUT >> C:\NDIRTMP\UCOMP.LOG
FC C:\NDIRTMP\UNOV\U24_USRR.OUT C:\NDIRTMP\UPUB\U24_USRR.OUT >> C:\NDIRTMP\UCOMP.LOG
FC C:\NDIRTMP\UNOV\U25_USRS.OUT C:\NDIRTMP\UPUB\U25_USRS.OUT >> C:\NDIRTMP\UCOMP.LOG
FC C:\NDIRTMP\UNOV\U26_USRD.OUT C:\NDIRTMP\UPUB\U26_USRD.OUT >> C:\NDIRTMP\UCOMP.LOG
FC C:\NDIRTMP\UNOV\U27_USRT.OUT C:\NDIRTMP\UPUB\U27_USRT.OUT >> C:\NDIRTMP\UCOMP.LOG
FC C:\NDIRTMP\UNOV\U28_USRD.OUT C:\NDIRTMP\UPUB\U28_USRD.OUT >> C:\NDIRTMP\UCOMP.LOG
FC C:\NDIRTMP\UNOV\U29_EVRF.OUT C:\NDIRTMP\UPUB\U29_EVRF.OUT >> C:\NDIRTMP\UCOMP.LOG
FC C:\NDIRTMP\UNOV\U30_CHLD.OUT C:\NDIRTMP\UPUB\U30_CHLD.OUT >> C:\NDIRTMP\UCOMP.LOG
LOGOUT > C:\NDIRTMP\D03_LGOT.OUT
F:\LOGIN\LOGIN SUPERVISOR /PWD:%LGNTPWD% > C:\NDIRTMP\D04_LGSU.OUT
F:
CD \
IF EXIST \NDIRTSTA.BAT GOTO HAVEF
ECHO F: wurde nicht wiederhergestellt oder \NDIRTSTA.BAT fehlt. >> C:\NDIRTMP\HELPER.TXT
GOTO END
:HAVEF
C:
CD \NDIRTMP
DLYSTRT /T:2 F:\NDIRTSTA.BAT PART2
:END

134
test/ndir/NDIRCMP.BAT Normal file
View File

@@ -0,0 +1,134 @@
@ECHO OFF
REM NDIRCMP4.BAT
REM NDIR Vergleichstest mit kleinerem Baum, /SHORT, /RIGHTS und Trustee-Aenderungen.
REM
REM Linux-Vorbereitung:
REM sh mkndirdata.sh /var/mars_nwe/SYS
REM
REM DOS-Annahmen:
REM NPUBLIC = Novell Tools
REM PUBLIC = unsere Tools
REM NDIRN = Novell-Vergleichsbaum
REM NDIRU = Unser Vergleichsbaum
REM
REM Hinweis:
REM Fuer lange Ausgaben nutzen wir /SHORT /CONTINUOUS.
REM Die PAUSEs sind absichtlich fuer Screenshots.
ECHO.
ECHO === NDIRCMP4: kompakter NDIR Test ===
ECHO Erwartet vorhandene Testbaeume NDIRN und NDIRU.
ECHO Falls nicht vorhanden: Linux mkndirdata.sh ausfuehren.
ECHO.
PAUSE
ECHO.
ECHO === Block 1A: Novell Basis NDIRN ===
ECHO NPUBLIC\NDIR NDIRN
NPUBLIC\NDIR NDIRN
PAUSE
ECHO === Block 1B: Unser Basis NDIRU ===
ECHO PUBLIC\NDIR NDIRU
PUBLIC\NDIR NDIRU
PAUSE
ECHO.
ECHO === Block 2A: Novell /DATES ===
ECHO NPUBLIC\NDIR NDIRN /DATES
NPUBLIC\NDIR NDIRN /DATES
PAUSE
ECHO === Block 2B: Unser /DATES ===
ECHO PUBLIC\NDIR NDIRU /DATES
PUBLIC\NDIR NDIRU /DATES
PAUSE
ECHO.
ECHO === Block 3A: Novell /RIGHTS ===
ECHO NPUBLIC\NDIR NDIRN /RIGHTS
NPUBLIC\NDIR NDIRN /RIGHTS
PAUSE
ECHO === Block 3B: Unser /RIGHTS ===
ECHO PUBLIC\NDIR NDIRU /RIGHTS
PUBLIC\NDIR NDIRU /RIGHTS
PAUSE
ECHO.
ECHO === Block 4B: Unser /SUB /SHORT ===
ECHO PUBLIC\NDIR NDIRU /SUB /SHORT /CONTINUOUS
PUBLIC\NDIR NDIRU /SUB /SHORT /CONTINUOUS
PAUSE
ECHO.
ECHO === Block 5B: Unser /SUB /RIGHTS /SHORT ===
ECHO PUBLIC\NDIR NDIRU /SUB /RIGHTS /SHORT /CONTINUOUS
PUBLIC\NDIR NDIRU /SUB /RIGHTS /SHORT /CONTINUOUS
PAUSE
ECHO.
ECHO === Block 6B: Unser wildcard *.EXE /SUB /SHORT ===
ECHO PUBLIC\NDIR NDIRU\*.EXE /SUB /SHORT /CONTINUOUS
PUBLIC\NDIR NDIRU\*.EXE /SUB /SHORT /CONTINUOUS
PAUSE
ECHO.
ECHO === Block 7B: Ausgangsrechte vor GRANT/REVOKE/REMOVE ===
ECHO PUBLIC\RIGHTS NDIRU\SUB1
PUBLIC\RIGHTS NDIRU\SUB1
ECHO.
ECHO PUBLIC\NDIR NDIRU /SUB /RIGHTS /SHORT /CONTINUOUS
PUBLIC\NDIR NDIRU /SUB /RIGHTS /SHORT /CONTINUOUS
PAUSE
ECHO.
ECHO === Block 8B: GRANT eingeschraenkte Rechte auf NDIRU\SUB1 ===
ECHO PUBLIC\GRANT R F FOR NDIRU\SUB1 TO USER MARIO
PUBLIC\GRANT R F FOR NDIRU\SUB1 TO USER MARIO
ECHO.
ECHO PUBLIC\RIGHTS NDIRU\SUB1
PUBLIC\RIGHTS NDIRU\SUB1
ECHO.
ECHO PUBLIC\NDIR NDIRU /SUB /RIGHTS /SHORT /CONTINUOUS
PUBLIC\NDIR NDIRU /SUB /RIGHTS /SHORT /CONTINUOUS
PAUSE
ECHO.
ECHO === Block 9B: GRANT mehr Rechte auf NDIRU\SUB1 ===
ECHO PUBLIC\GRANT R W C E M F A FOR NDIRU\SUB1 TO USER MARIO
PUBLIC\GRANT R W C E M F A FOR NDIRU\SUB1 TO USER MARIO
ECHO.
ECHO PUBLIC\RIGHTS NDIRU\SUB1
PUBLIC\RIGHTS NDIRU\SUB1
ECHO.
ECHO PUBLIC\NDIR NDIRU /SUB /RIGHTS /SHORT /CONTINUOUS
PUBLIC\NDIR NDIRU /SUB /RIGHTS /SHORT /CONTINUOUS
PAUSE
ECHO.
ECHO === Block 10B: REVOKE W M von NDIRU\SUB1 ===
ECHO PUBLIC\REVOKE W M FOR NDIRU\SUB1 FROM USER MARIO
PUBLIC\REVOKE W M FOR NDIRU\SUB1 FROM USER MARIO
ECHO.
ECHO PUBLIC\RIGHTS NDIRU\SUB1
PUBLIC\RIGHTS NDIRU\SUB1
ECHO.
ECHO PUBLIC\NDIR NDIRU /SUB /RIGHTS /SHORT /CONTINUOUS
PUBLIC\NDIR NDIRU /SUB /RIGHTS /SHORT /CONTINUOUS
PAUSE
ECHO.
ECHO === Block 11B: REMOVE Trustee von NDIRU\SUB1 ===
ECHO PUBLIC\REMOVE USER MARIO FROM NDIRU\SUB1
PUBLIC\REMOVE USER MARIO FROM NDIRU\SUB1
ECHO.
ECHO PUBLIC\RIGHTS NDIRU\SUB1
PUBLIC\RIGHTS NDIRU\SUB1
ECHO.
ECHO PUBLIC\NDIR NDIRU /SUB /RIGHTS /SHORT /CONTINUOUS
PUBLIC\NDIR NDIRU /SUB /RIGHTS /SHORT /CONTINUOUS
PAUSE
ECHO.
ECHO === Fertig ===

376
test/ndir/NDIRTSTA.BAT Normal file
View File

@@ -0,0 +1,376 @@
@ECHO OFF
REM NDIRTSTA.BAT
REM Automated NDIR compare test for MARS NWE.
REM
REM OUT/PUBOUT:
REM Novell NPUBLIC\NDIR baseline vs PUBLIC\NDIR implementation.
REM
REM UNOV/UPUB:
REM NOPASSUSER context readback, started through DLYSTRT.
REM
REM SHORTOUT/USHORT:
REM PUBLIC-only /SHORT helper output. /SHORT is our local option and is
REM not compared against Novell NDIR.
REM
REM Required for user-context part:
REM SET LGNTPWD=<supervisor-password>
IF "%1"=="" GOTO PART1
IF "%1"=="PART2" GOTO PART2
IF "%1"=="part2" GOTO PART2
IF "%1"=="Part2" GOTO PART2
GOTO USAGE
:USAGE
ECHO Usage: NDIRTSTA [PART2]
ECHO.
ECHO For full automatic user-context test first set:
ECHO SET LGNTPWD=dein-supervisor-passwort
GOTO END
:PART1
IF "%LGNTPWD%"=="" GOTO NEEDPWD
F:
CD \
REM --- Clean generated test/result directories. ---
IF EXIST TNDIR\NUL DELTREE /Y TNDIR > NUL
IF EXIST NDCMP\NUL DELTREE /Y NDCMP > NUL
IF EXIST C:\NDIRTMP\NUL DELTREE /Y C:\NDIRTMP > NUL
REM --- Directory setup. ---
MD TNDIR
MD TNDIR\SUBDIR
MD TNDIR\SUBDIR\DEEP
MD TNDIR\URF
MD TNDIR\UFULL
MD TNDIR\US
MD TNDIR\UNONE
MD TNDIR\USUB
MD TNDIR\USUB\CHILD
MD TNDIR\MAT
MD TNDIR\MAT\D_NORM
MD TNDIR\MAT\D_HID
MD TNDIR\MAT\D_SYS
MD TNDIR\MAT\D_PUR
MD TNDIR\MAT\D_DIRI
MD TNDIR\MAT\D_MIX
MD TNDIR\MAT\D_SUB
MD TNDIR\MAT\D_SUB\CHILD
MD TNDIR\USR
MD TNDIR\USR\U_EVERYR
MD TNDIR\USR\U_EVERYF
MD TNDIR\USR\U_MARIO
MD TNDIR\USR\U_GUEST
MD TNDIR\USR\U_NOPWCM
MD TNDIR\USR\U_NOPREM
MD TNDIR\USR\U_NOPRF
MD TNDIR\USR\U_CHILD
MD TNDIR\USR\U_CHILD\DEEP
MD NDCMP
MD NDCMP\OUT
MD NDCMP\PUBOUT
MD NDCMP\SETUP
MD NDCMP\SHORTOUT
MD NDCMP\UNOV
MD NDCMP\UPUB
MD NDCMP\USHORT
MD NDCMP\USETUP
ECHO NDIRTSTA NDIR compare test > F:\NDCMP\RUN.LOG
ECHO Date/time stamp skipped to avoid DOS prompt. >> F:\NDCMP\RUN.LOG
ECHO. >> F:\NDCMP\RUN.LOG
REM --- Test files. ---
ECHO NDIR TEST ALPHA > F:\TNDIR\ALPHA.TXT
ECHO NDIR TEST BETA > F:\TNDIR\BETA.TXT
ECHO NDIR TEST GAMMA > F:\TNDIR\GAMMA.DAT
ECHO NDIR SUB FILE > F:\TNDIR\SUBDIR\SUB.TXT
ECHO NDIR DEEP FILE > F:\TNDIR\SUBDIR\DEEP\DEEP.TXT
ECHO NDIR RF FILE > F:\TNDIR\URF\RF.TXT
ECHO NDIR FULL FILE > F:\TNDIR\UFULL\FULL.TXT
ECHO NDIR S FILE > F:\TNDIR\US\S.TXT
ECHO NDIR N FILE > F:\TNDIR\UNONE\N.TXT
ECHO NDIR USUB FILE > F:\TNDIR\USUB\ROOT.TXT
ECHO NDIR USUB CHILD > F:\TNDIR\USUB\CHILD\CHILD.TXT
ECHO MAT NORMAL > F:\TNDIR\MAT\NORMAL.TXT
ECHO MAT HIDDEN > F:\TNDIR\MAT\HIDFILE.TXT
ECHO MAT READONLY > F:\TNDIR\MAT\ROFILE.TXT
ECHO MAT SYSTEM > F:\TNDIR\MAT\SYSFILE.DAT
ECHO MAT ARCHIVE > F:\TNDIR\MAT\ARCFILE.BIN
ECHO MAT INHIBIT > F:\TNDIR\MAT\DIRIFILE.TXT
ECHO MAT MIXED > F:\TNDIR\MAT\MIXFILE.TXT
ECHO MAT SUB ROOT > F:\TNDIR\MAT\D_SUB\ROOT.TXT
ECHO MAT SUB CHILD > F:\TNDIR\MAT\D_SUB\CHILD\CHILD.TXT
ECHO USER EVERY R > F:\TNDIR\USR\U_EVERYR\E_R.TXT
ECHO USER EVERY FULL > F:\TNDIR\USR\U_EVERYF\E_FULL.TXT
ECHO USER MARIO RF > F:\TNDIR\USR\U_MARIO\MARIO.TXT
ECHO USER GUEST RF > F:\TNDIR\USR\U_GUEST\GUEST.TXT
ECHO USER NOP WCM > F:\TNDIR\USR\U_NOPWCM\WCM.TXT
ECHO USER NOP REMA > F:\TNDIR\USR\U_NOPREM\REMA.TXT
ECHO USER NOP RF > F:\TNDIR\USR\U_NOPRF\RF.TXT
ECHO USER CHILD ROOT > F:\TNDIR\USR\U_CHILD\ROOT.TXT
ECHO USER CHILD DEEP > F:\TNDIR\USR\U_CHILD\DEEP\DEEP.TXT
ECHO === ATTRIBUTE CLEANUP === >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAG F:\TNDIR\ALPHA.TXT N >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAG F:\TNDIR\BETA.TXT N >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAG F:\TNDIR\GAMMA.DAT N >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAG F:\TNDIR\SUBDIR\SUB.TXT N >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAG F:\TNDIR\MAT\NORMAL.TXT N >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAG F:\TNDIR\MAT\HIDFILE.TXT N >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAG F:\TNDIR\MAT\ROFILE.TXT N >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAG F:\TNDIR\MAT\SYSFILE.DAT N >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAG F:\TNDIR\MAT\ARCFILE.BIN N >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAG F:\TNDIR\MAT\DIRIFILE.TXT N >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAG F:\TNDIR\MAT\MIXFILE.TXT N >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAGDIR F:\TNDIR\MAT\D_NORM Normal >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAGDIR F:\TNDIR\MAT\D_HID Normal >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAGDIR F:\TNDIR\MAT\D_SYS Normal >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAGDIR F:\TNDIR\MAT\D_PUR Normal >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAGDIR F:\TNDIR\MAT\D_DIRI Normal >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAGDIR F:\TNDIR\MAT\D_MIX Normal >> F:\NDCMP\RUN.LOG
ECHO === D01 BASIS DIRECTORY === >> F:\NDCMP\RUN.LOG
\NPUBLIC\NDIR F:\TNDIR > F:\NDCMP\OUT\D01_ROOT.OUT
\PUBLIC\NDIR F:\TNDIR > F:\NDCMP\PUBOUT\D01_ROOT.OUT
ECHO === D02 DIRECT FILE === >> F:\NDCMP\RUN.LOG
\NPUBLIC\NDIR F:\TNDIR\ALPHA.TXT > F:\NDCMP\OUT\D02_ALFA.OUT
\PUBLIC\NDIR F:\TNDIR\ALPHA.TXT > F:\NDCMP\PUBOUT\D02_ALFA.OUT
ECHO === D03 DATES === >> F:\NDCMP\RUN.LOG
\NPUBLIC\NDIR F:\TNDIR /DATES > F:\NDCMP\OUT\D03_DATE.OUT
\PUBLIC\NDIR F:\TNDIR /DATES > F:\NDCMP\PUBOUT\D03_DATE.OUT
ECHO === D04 RIGHTS === >> F:\NDCMP\RUN.LOG
\NPUBLIC\NDIR F:\TNDIR /RIGHTS > F:\NDCMP\OUT\D04_RGHT.OUT
\PUBLIC\NDIR F:\TNDIR /RIGHTS > F:\NDCMP\PUBOUT\D04_RGHT.OUT
ECHO === D05 SET ATTRIBUTES === >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAG F:\TNDIR\ALPHA.TXT +H >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAG F:\TNDIR\BETA.TXT +RO >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAG F:\TNDIR\GAMMA.DAT +Sy +A >> F:\NDCMP\RUN.LOG
\NPUBLIC\NDIR F:\TNDIR > F:\NDCMP\OUT\D05_ATTR.OUT
\PUBLIC\NDIR F:\TNDIR > F:\NDCMP\PUBOUT\D05_ATTR.OUT
ECHO === D06 ATTRIBUTE FILTERS === >> F:\NDCMP\RUN.LOG
\NPUBLIC\NDIR F:\TNDIR /H > F:\NDCMP\OUT\D06_H.OUT
\PUBLIC\NDIR F:\TNDIR /H > F:\NDCMP\PUBOUT\D06_H.OUT
\NPUBLIC\NDIR F:\TNDIR /RO > F:\NDCMP\OUT\D07_RO.OUT
\PUBLIC\NDIR F:\TNDIR /RO > F:\NDCMP\PUBOUT\D07_RO.OUT
\NPUBLIC\NDIR F:\TNDIR /SY > F:\NDCMP\OUT\D08_SY.OUT
\PUBLIC\NDIR F:\TNDIR /SY > F:\NDCMP\PUBOUT\D08_SY.OUT
\NPUBLIC\NDIR F:\TNDIR /A > F:\NDCMP\OUT\D09_A.OUT
\PUBLIC\NDIR F:\TNDIR /A > F:\NDCMP\PUBOUT\D09_A.OUT
ECHO === D10 NOT FILTER === >> F:\NDCMP\RUN.LOG
\NPUBLIC\NDIR F:\TNDIR /NOT H > F:\NDCMP\OUT\D10_NOTH.OUT
\PUBLIC\NDIR F:\TNDIR /NOT H > F:\NDCMP\PUBOUT\D10_NOTH.OUT
ECHO === D11 WILDCARDS === >> F:\NDCMP\RUN.LOG
\NPUBLIC\NDIR F:\TNDIR\*.TXT > F:\NDCMP\OUT\D11_TXT.OUT
\PUBLIC\NDIR F:\TNDIR\*.TXT > F:\NDCMP\PUBOUT\D11_TXT.OUT
\NPUBLIC\NDIR F:\TNDIR\*.DAT > F:\NDCMP\OUT\D12_DAT.OUT
\PUBLIC\NDIR F:\TNDIR\*.DAT > F:\NDCMP\PUBOUT\D12_DAT.OUT
ECHO === D13 FILES/DIRS ONLY === >> F:\NDCMP\RUN.LOG
\NPUBLIC\NDIR F:\TNDIR /FO > F:\NDCMP\OUT\D13_FO.OUT
\PUBLIC\NDIR F:\TNDIR /FO > F:\NDCMP\PUBOUT\D13_FO.OUT
\NPUBLIC\NDIR F:\TNDIR /DO > F:\NDCMP\OUT\D14_DO.OUT
\PUBLIC\NDIR F:\TNDIR /DO > F:\NDCMP\PUBOUT\D14_DO.OUT
ECHO === D15 SUBDIRECTORY === >> F:\NDCMP\RUN.LOG
\NPUBLIC\NDIR F:\TNDIR /SUB > F:\NDCMP\OUT\D15_SUB.OUT
\PUBLIC\NDIR F:\TNDIR /SUB > F:\NDCMP\PUBOUT\D15_SUB.OUT
\NPUBLIC\NDIR F:\TNDIR /SUB /RIGHTS > F:\NDCMP\OUT\D16_SUBR.OUT
\PUBLIC\NDIR F:\TNDIR /SUB /RIGHTS > F:\NDCMP\PUBOUT\D16_SUBR.OUT
ECHO === D17 FILE/DIR ATTRIBUTE MATRIX SETUP === >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAG F:\TNDIR\MAT\HIDFILE.TXT +H >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAG F:\TNDIR\MAT\ROFILE.TXT +RO >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAG F:\TNDIR\MAT\SYSFILE.DAT +Sy >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAG F:\TNDIR\MAT\ARCFILE.BIN +A >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAG F:\TNDIR\MAT\DIRIFILE.TXT +DI +RI >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAG F:\TNDIR\MAT\MIXFILE.TXT +H +RO +A >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAGDIR F:\TNDIR\MAT\D_HID Hidden >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAGDIR F:\TNDIR\MAT\D_SYS System >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAGDIR F:\TNDIR\MAT\D_PUR Purge >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAGDIR F:\TNDIR\MAT\D_DIRI Deleteinhibit Renameinhibit >> F:\NDCMP\RUN.LOG
\NPUBLIC\FLAGDIR F:\TNDIR\MAT\D_MIX Hidden System Purge >> F:\NDCMP\RUN.LOG
ECHO === D17-D29 FILE/DIR ATTRIBUTE MATRIX === >> F:\NDCMP\RUN.LOG
\NPUBLIC\NDIR F:\TNDIR\MAT > F:\NDCMP\OUT\D17_MATR.OUT
\PUBLIC\NDIR F:\TNDIR\MAT > F:\NDCMP\PUBOUT\D17_MATR.OUT
\NPUBLIC\NDIR F:\TNDIR\MAT /DATES > F:\NDCMP\OUT\D18_MDAT.OUT
\PUBLIC\NDIR F:\TNDIR\MAT /DATES > F:\NDCMP\PUBOUT\D18_MDAT.OUT
\NPUBLIC\NDIR F:\TNDIR\MAT /RIGHTS > F:\NDCMP\OUT\D19_MRGT.OUT
\PUBLIC\NDIR F:\TNDIR\MAT /RIGHTS > F:\NDCMP\PUBOUT\D19_MRGT.OUT
\NPUBLIC\NDIR F:\TNDIR\MAT /FO > F:\NDCMP\OUT\D20_MFO.OUT
\PUBLIC\NDIR F:\TNDIR\MAT /FO > F:\NDCMP\PUBOUT\D20_MFO.OUT
\NPUBLIC\NDIR F:\TNDIR\MAT /DO > F:\NDCMP\OUT\D21_MDO.OUT
\PUBLIC\NDIR F:\TNDIR\MAT /DO > F:\NDCMP\PUBOUT\D21_MDO.OUT
\NPUBLIC\NDIR F:\TNDIR\MAT /SUB > F:\NDCMP\OUT\D22_MSUB.OUT
\PUBLIC\NDIR F:\TNDIR\MAT /SUB > F:\NDCMP\PUBOUT\D22_MSUB.OUT
\NPUBLIC\NDIR F:\TNDIR\MAT /SUB /RIGHTS > F:\NDCMP\OUT\D23_MSRG.OUT
\PUBLIC\NDIR F:\TNDIR\MAT /SUB /RIGHTS > F:\NDCMP\PUBOUT\D23_MSRG.OUT
\NPUBLIC\NDIR F:\TNDIR\MAT /H > F:\NDCMP\OUT\D24_MH.OUT
\PUBLIC\NDIR F:\TNDIR\MAT /H > F:\NDCMP\PUBOUT\D24_MH.OUT
\NPUBLIC\NDIR F:\TNDIR\MAT /RO > F:\NDCMP\OUT\D25_MRO.OUT
\PUBLIC\NDIR F:\TNDIR\MAT /RO > F:\NDCMP\PUBOUT\D25_MRO.OUT
\NPUBLIC\NDIR F:\TNDIR\MAT /SY > F:\NDCMP\OUT\D26_MSY.OUT
\PUBLIC\NDIR F:\TNDIR\MAT /SY > F:\NDCMP\PUBOUT\D26_MSY.OUT
\NPUBLIC\NDIR F:\TNDIR\MAT /A > F:\NDCMP\OUT\D27_MA.OUT
\PUBLIC\NDIR F:\TNDIR\MAT /A > F:\NDCMP\PUBOUT\D27_MA.OUT
\NPUBLIC\NDIR F:\TNDIR\MAT /NOT H > F:\NDCMP\OUT\D28_MNH.OUT
\PUBLIC\NDIR F:\TNDIR\MAT /NOT H > F:\NDCMP\PUBOUT\D28_MNH.OUT
\NPUBLIC\NDIR F:\TNDIR\MAT\*.TXT > F:\NDCMP\OUT\D29_MTXT.OUT
\PUBLIC\NDIR F:\TNDIR\MAT\*.TXT > F:\NDCMP\PUBOUT\D29_MTXT.OUT
ECHO === D30-D34 USER/TRUSTEE MATRIX DIRECT === >> F:\NDCMP\RUN.LOG
\NPUBLIC\NDIR F:\TNDIR\USR /RIGHTS > F:\NDCMP\OUT\D30_USRR.OUT
\PUBLIC\NDIR F:\TNDIR\USR /RIGHTS > F:\NDCMP\PUBOUT\D30_USRR.OUT
\NPUBLIC\NDIR F:\TNDIR\USR /SUB /RIGHTS > F:\NDCMP\OUT\D31_USRS.OUT
\PUBLIC\NDIR F:\TNDIR\USR /SUB /RIGHTS > F:\NDCMP\PUBOUT\D31_USRS.OUT
\NPUBLIC\NDIR F:\TNDIR\USR /DO /RIGHTS > F:\NDCMP\OUT\D32_USRD.OUT
\PUBLIC\NDIR F:\TNDIR\USR /DO /RIGHTS > F:\NDCMP\PUBOUT\D32_USRD.OUT
\NPUBLIC\NDIR F:\TNDIR\USR\*.TXT > F:\NDCMP\OUT\D33_USRT.OUT
\PUBLIC\NDIR F:\TNDIR\USR\*.TXT > F:\NDCMP\PUBOUT\D33_USRT.OUT
\NPUBLIC\NDIR F:\TNDIR\USR /DATES > F:\NDCMP\OUT\D34_USRD.OUT
\PUBLIC\NDIR F:\TNDIR\USR /DATES > F:\NDCMP\PUBOUT\D34_USRD.OUT
ECHO === PUBLIC-ONLY SHORT OUTPUT === >> F:\NDCMP\RUN.LOG
\PUBLIC\NDIR F:\TNDIR /SUB /SHORT > F:\NDCMP\SHORTOUT\S15_SUB.OUT
\PUBLIC\NDIR F:\TNDIR /SUB /RIGHTS /SHORT > F:\NDCMP\SHORTOUT\S16_SUBR.OUT
\PUBLIC\NDIR F:\TNDIR\MAT /SHORT > F:\NDCMP\SHORTOUT\S17_MATR.OUT
\PUBLIC\NDIR F:\TNDIR\MAT /SUB /RIGHTS /SHORT > F:\NDCMP\SHORTOUT\S23_MSRG.OUT
\PUBLIC\NDIR F:\TNDIR\USR /SUB /RIGHTS /SHORT > F:\NDCMP\SHORTOUT\S31_USRS.OUT
ECHO === D90 MISSING / D99 HELP === >> F:\NDCMP\RUN.LOG
\NPUBLIC\NDIR F:\TNDIR\*.ZZZ > F:\NDCMP\OUT\D90_MISS.OUT
\PUBLIC\NDIR F:\TNDIR\*.ZZZ > F:\NDCMP\PUBOUT\D90_MISS.OUT
\NPUBLIC\NDIR /HELP > F:\NDCMP\OUT\D99_HELP.OUT
\PUBLIC\NDIR /HELP > F:\NDCMP\PUBOUT\D99_HELP.OUT
ECHO === DIRECT COMPARE === > F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D01_ROOT.OUT F:\NDCMP\PUBOUT\D01_ROOT.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D02_ALFA.OUT F:\NDCMP\PUBOUT\D02_ALFA.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D03_DATE.OUT F:\NDCMP\PUBOUT\D03_DATE.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D04_RGHT.OUT F:\NDCMP\PUBOUT\D04_RGHT.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D05_ATTR.OUT F:\NDCMP\PUBOUT\D05_ATTR.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D06_H.OUT F:\NDCMP\PUBOUT\D06_H.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D07_RO.OUT F:\NDCMP\PUBOUT\D07_RO.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D08_SY.OUT F:\NDCMP\PUBOUT\D08_SY.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D09_A.OUT F:\NDCMP\PUBOUT\D09_A.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D10_NOTH.OUT F:\NDCMP\PUBOUT\D10_NOTH.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D11_TXT.OUT F:\NDCMP\PUBOUT\D11_TXT.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D12_DAT.OUT F:\NDCMP\PUBOUT\D12_DAT.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D13_FO.OUT F:\NDCMP\PUBOUT\D13_FO.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D14_DO.OUT F:\NDCMP\PUBOUT\D14_DO.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D15_SUB.OUT F:\NDCMP\PUBOUT\D15_SUB.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D16_SUBR.OUT F:\NDCMP\PUBOUT\D16_SUBR.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D17_MATR.OUT F:\NDCMP\PUBOUT\D17_MATR.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D18_MDAT.OUT F:\NDCMP\PUBOUT\D18_MDAT.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D19_MRGT.OUT F:\NDCMP\PUBOUT\D19_MRGT.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D20_MFO.OUT F:\NDCMP\PUBOUT\D20_MFO.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D21_MDO.OUT F:\NDCMP\PUBOUT\D21_MDO.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D22_MSUB.OUT F:\NDCMP\PUBOUT\D22_MSUB.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D23_MSRG.OUT F:\NDCMP\PUBOUT\D23_MSRG.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D24_MH.OUT F:\NDCMP\PUBOUT\D24_MH.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D25_MRO.OUT F:\NDCMP\PUBOUT\D25_MRO.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D26_MSY.OUT F:\NDCMP\PUBOUT\D26_MSY.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D27_MA.OUT F:\NDCMP\PUBOUT\D27_MA.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D28_MNH.OUT F:\NDCMP\PUBOUT\D28_MNH.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D29_MTXT.OUT F:\NDCMP\PUBOUT\D29_MTXT.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D30_USRR.OUT F:\NDCMP\PUBOUT\D30_USRR.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D31_USRS.OUT F:\NDCMP\PUBOUT\D31_USRS.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D32_USRD.OUT F:\NDCMP\PUBOUT\D32_USRD.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D33_USRT.OUT F:\NDCMP\PUBOUT\D33_USRT.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D34_USRD.OUT F:\NDCMP\PUBOUT\D34_USRD.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D90_MISS.OUT F:\NDCMP\PUBOUT\D90_MISS.OUT >> F:\NDCMP\COMPARE.LOG
FC F:\NDCMP\OUT\D99_HELP.OUT F:\NDCMP\PUBOUT\D99_HELP.OUT >> F:\NDCMP\COMPARE.LOG
REM --- Setup NOPASSUSER matrix. ---
ECHO === USER CONTEXT SETUP === >> F:\NDCMP\RUN.LOG
\NPUBLIC\GRANT R F FOR F:\TNDIR TO USER NOPASSUSER > F:\NDCMP\SETUP\S00_ROOT.OUT
\NPUBLIC\GRANT R F FOR F:\TNDIR\URF TO USER NOPASSUSER > F:\NDCMP\SETUP\S10_RF.OUT
\NPUBLIC\GRANT R W C E M F A FOR F:\TNDIR\UFULL TO USER NOPASSUSER > F:\NDCMP\SETUP\S11_FULL.OUT
\NPUBLIC\GRANT S FOR F:\TNDIR\US TO USER NOPASSUSER > F:\NDCMP\SETUP\S12_S.OUT
\NPUBLIC\GRANT N FOR F:\TNDIR\UNONE TO USER NOPASSUSER > F:\NDCMP\SETUP\S13_N.OUT
\NPUBLIC\GRANT R F FOR F:\TNDIR\USUB TO USER NOPASSUSER > F:\NDCMP\SETUP\S14_SUB.OUT
\NPUBLIC\GRANT R F FOR F:\TNDIR\USUB\CHILD TO USER NOPASSUSER > F:\NDCMP\SETUP\S15_CHLD.OUT
\NPUBLIC\GRANT R F FOR F:\TNDIR\MAT TO USER NOPASSUSER > F:\NDCMP\SETUP\S20_MATR.OUT
\NPUBLIC\GRANT R F FOR F:\TNDIR\MAT\D_SUB TO USER NOPASSUSER > F:\NDCMP\SETUP\S21_MSUD.OUT
\NPUBLIC\GRANT R F FOR F:\TNDIR\MAT\D_SUB\CHILD TO USER NOPASSUSER > F:\NDCMP\SETUP\S22_MCHD.OUT
\NPUBLIC\GRANT R F FOR F:\TNDIR\USR TO USER NOPASSUSER > F:\NDCMP\SETUP\S30_USR.OUT
\NPUBLIC\GRANT R FOR F:\TNDIR\USR\U_EVERYR TO GROUP EVERYONE > F:\NDCMP\SETUP\S31_EVR.OUT
\NPUBLIC\GRANT R W C E M F A FOR F:\TNDIR\USR\U_EVERYF TO GROUP EVERYONE > F:\NDCMP\SETUP\S32_EVF.OUT
\NPUBLIC\GRANT R F FOR F:\TNDIR\USR\U_MARIO TO USER MARIO > F:\NDCMP\SETUP\S33_MAR.OUT
\NPUBLIC\GRANT R F FOR F:\TNDIR\USR\U_GUEST TO USER GUEST > F:\NDCMP\SETUP\S34_GST.OUT
\NPUBLIC\GRANT W C M FOR F:\TNDIR\USR\U_NOPWCM TO USER NOPASSUSER > F:\NDCMP\SETUP\S35_WCM.OUT
\NPUBLIC\GRANT R E M A FOR F:\TNDIR\USR\U_NOPREM TO USER NOPASSUSER > F:\NDCMP\SETUP\S36_REM.OUT
\NPUBLIC\GRANT R F FOR F:\TNDIR\USR\U_NOPRF TO USER NOPASSUSER > F:\NDCMP\SETUP\S37_RF.OUT
\NPUBLIC\GRANT R F FOR F:\TNDIR\USR\U_CHILD TO GROUP EVERYONE > F:\NDCMP\SETUP\S38_CHLD.OUT
\NPUBLIC\GRANT S FOR F:\TNDIR\USR\U_CHILD\DEEP TO USER NOPASSUSER > F:\NDCMP\SETUP\S39_DEEP.OUT
REM --- Prepare local delayed helper. ---
MD C:\NDIRTMP
MD C:\NDIRTMP\UNOV
MD C:\NDIRTMP\UPUB
IF EXIST C:\NDIRTMP\HELPER.TXT DEL C:\NDIRTMP\HELPER.TXT
COPY F:\NDIRC.BAT C:\NDIRTMP\NDIRC.BAT > NUL
COPY F:\PUBLIC\DLYSTRT.EXE C:\NDIRTMP\DLYSTRT.EXE > NUL
C:
CD \NDIRTMP
DLYSTRT /T:2 NDIRC.BAT
GOTO END
:PART2
F:
CD \
IF NOT EXIST NDCMP\NUL MD NDCMP
IF NOT EXIST NDCMP\UNOV\NUL MD NDCMP\UNOV
IF NOT EXIST NDCMP\UPUB\NUL MD NDCMP\UPUB
IF NOT EXIST NDCMP\USHORT\NUL MD NDCMP\USHORT
IF NOT EXIST NDCMP\USETUP\NUL MD NDCMP\USETUP
COPY C:\NDIRTMP\UNOV\*.OUT F:\NDCMP\UNOV > NUL
COPY C:\NDIRTMP\UPUB\*.OUT F:\NDCMP\UPUB > NUL
IF EXIST C:\NDIRTMP\USHORT\*.OUT COPY C:\NDIRTMP\USHORT\*.OUT F:\NDCMP\USHORT > NUL
IF EXIST C:\NDIRTMP\HELPER.TXT COPY C:\NDIRTMP\HELPER.TXT F:\NDCMP\HELPER.TXT > NUL
IF EXIST C:\NDIRTMP\UCOMP.LOG COPY C:\NDIRTMP\UCOMP.LOG F:\NDCMP\UCOMP.LOG > NUL
ECHO === SUMMARY === > F:\NDCMP\SUMMARY.TXT
ECHO NDIRTSTA compare test finished. >> F:\NDCMP\SUMMARY.TXT
ECHO. >> F:\NDCMP\SUMMARY.TXT
ECHO Direct output: OUT vs PUBOUT, see COMPARE.LOG. >> F:\NDCMP\SUMMARY.TXT
ECHO User-context output: UNOV vs UPUB, see UCOMP.LOG. >> F:\NDCMP\SUMMARY.TXT
ECHO Public-only /SHORT output: SHORTOUT and USHORT, not compared. >> F:\NDCMP\SUMMARY.TXT
ECHO Matrix coverage: D17-D34 and U17-U30 cover mixed file, directory and user trustee matrices. >> F:\NDCMP\SUMMARY.TXT
ECHO. >> F:\NDCMP\SUMMARY.TXT
ECHO Optional: NDIRZIP ausfuehren. >> F:\NDCMP\SUMMARY.TXT
ECHO.
ECHO NDIRTSTA PART2 fertig.
ECHO Ergebnisse liegen in F:\NDCMP
ECHO Optional: NDIRZIP ausfuehren.
ECHO.
GOTO END
:NEEDPWD
ECHO.
ECHO ERROR: LGNTPWD ist nicht gesetzt.
ECHO.
ECHO Fuer den vollautomatischen NDIR-User-Kontext-Test zuerst setzen, z.B.:
ECHO SET LGNTPWD=dein-supervisor-passwort
ECHO Danach starten:
ECHO F:\NDIRTSTA
ECHO.
ECHO Es wurde kein DLYSTRT installiert und kein Login-Test gestartet.
GOTO END
:END

26
test/ndir/NDIRZIP.BAT Normal file
View File

@@ -0,0 +1,26 @@
@ECHO OFF
REM NDIRZIP.BAT
REM Optional packer for NDIRTSTA result files.
REM Requires ZIP.EXE in PATH or current directory.
F:
CD \NDCMP
IF EXIST NDIRTSTA.ZIP DEL NDIRTSTA.ZIP
IF EXIST ZIP.LOG DEL ZIP.LOG
ECHO Creating NDIRTSTA.ZIP > ZIP.LOG
ZIP -r NDIRTSTA.ZIP RUN.LOG SUMMARY.TXT COMPARE.LOG UCOMP.LOG HELPER.TXT OUT PUBOUT SHORTOUT SETUP UNOV UPUB USHORT 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 \TNDIR\NUL DELTREE /Y \TNDIR >> ZIP.LOG
IF EXIST C:\NDIRTMP\NUL DELTREE /Y C:\NDIRTMP >> ZIP.LOG
CD \
ECHO.
ECHO ZIP step finished.
ECHO Check:
ECHO F:\NDCMP\NDIRTSTA.ZIP
ECHO F:\NDCMP\ZIP.LOG
ECHO.

96
test/ndir/README.md Normal file
View File

@@ -0,0 +1,96 @@
# NDIR automated compare test
Automated compare test for `NDIR`.
## Run
```text
SET LGNTPWD=dein-supervisor-passwort
F:
CD \
NDIRTSTA
```
`LGNTPWD` is required because the test switches to `NOPASSUSER` and then logs back in as `SUPERVISOR` through the maintainer-only `LOGIN /PWD:` path.
## Result layout
```text
F:\NDCMP\OUT\*.OUT Novell baseline via \NPUBLIC\NDIR
F:\NDCMP\PUBOUT\*.OUT PUBLIC implementation via \PUBLIC\NDIR
F:\NDCMP\COMPARE.LOG direct compare log
F:\NDCMP\SHORTOUT\*.OUT PUBLIC-only /SHORT helper output; not compared
F:\NDCMP\UNOV\*.OUT Novell NDIR as NOPASSUSER
F:\NDCMP\UPUB\*.OUT PUBLIC NDIR as NOPASSUSER
F:\NDCMP\UCOMP.LOG user-context compare log
F:\NDCMP\USHORT\*.OUT PUBLIC-only /SHORT helper output as NOPASSUSER
```
Optional pack:
```text
NDIRZIP
```
Upload:
```text
F:\NDCMP\NDIRTSTA.ZIP
```
Then on Linux package with server log:
```sh
sudo ./mars_packtest_v3.sh ndirtsta 5 mario
```
The pack helper should find `/var/mars_nwe/SYS/NDCMP/NDIRTSTA.ZIP` by search.
## Test tree
```text
F:\TNDIR
```
## Coverage
- basic directory and file NDIR
- `/DATES`
- `/RIGHTS`
- attributes via `NPUBLIC\FLAG`
- filters `/H`, `/RO`, `/SY`, `/A`, `/NOT H`
- wildcards `*.TXT`, `*.DAT`
- `/FO`, `/DO`
- `/SUB` and `/SUB /RIGHTS` in the Novell-compatible compare set
- extended file/directory matrix under `F:\TNDIR\MAT`:
- files with Normal, Hidden, Read-only, System, Archive, DI/RI and mixed attributes
- directories with Normal, Hidden, System, Purge, DI/RI and mixed directory flags
- matrix checks for normal listing, `/DATES`, `/RIGHTS`, `/FO`, `/DO`, `/SUB`, filters and wildcards
- Public-only `/SHORT` output in `SHORTOUT` / `USHORT` is kept for diagnostics and is not compared against Novell
- missing-pattern and help output
- NOPASSUSER readback after GRANT matrix setup, including the extended `MAT` file/directory matrix
`NDIRZIP` cleans the generated `TNDIR` tree and `C:\NDIRTMP` helper directory after packaging.
## Notes on /SHORT
`/SHORT` is a MARS DOS tools helper option. Novell NDIR does not know this option,
so the test keeps `/SHORT` output in `SHORTOUT` and `USHORT` only. These files are
packaged for manual inspection but are not part of the byte-for-byte Novell compare.
Additional user/trustee matrix
------------------------------
The extended matrix also creates F:\TNDIR\USR with trustees for multiple
objects that exist in the default test environment:
- USER NOPASSUSER
- USER MARIO
- USER GUEST
- GROUP EVERYONE
The delayed NOPASSUSER phase reads the same tree through NPUBLIC and PUBLIC
NDIR. This gives more coverage for effective-rights output: direct user
trustees, group/EVERYONE trustees, unrelated user trustees, inherited rights,
and Supervisor-on-child cases.

38
test/remove/README.md Normal file
View File

@@ -0,0 +1,38 @@
# REMOVE comparison test
`RMVSTA.BAT` compares Novell `\NPUBLIC\REMOVE` against the public implementation `\PUBLIC\REMOVE`.
Run as `SUPERVISOR` or equivalent. The automatic NOPASSUSER readback needs the maintainer `LOGIN /PWD:` support and `DLYSTRT`:
```bat
SET LGNTPWD=your-supervisor-password
F:
CD \
RMVSTA
```
`RMVSTA` performs a direct comparison first:
```text
F:\RMVCMP\OUT Novell baseline with \NPUBLIC\REMOVE
F:\RMVCMP\PUBOUT public implementation with \PUBLIC\REMOVE
F:\RMVCMP\COMPARE.LOG
```
Then it starts `C:\RMVTMP\RMVC.BAT` through `DLYSTRT`. The helper logs in as `NOPASSUSER` and captures effective-rights readback after the public REMOVE operations:
```text
F:\RMVCMP\UNOV \NPUBLIC\RIGHTS as NOPASSUSER
F:\RMVCMP\UPUB \PUBLIC\RIGHTS as NOPASSUSER
F:\RMVCMP\UCOMP.LOG
```
The matrix covers single trustee rights, mixed rights, `S`, `ALL`, `N`, file trustees with `/FILES`, and recursive removal with `/SUBDIRS`.
`RMVZIP.BAT` is intentionally manual. Run it after inspecting the results:
```bat
RMVZIP
```
The ZIP step packages `OUT`, `PUBOUT`, `UNOV`, `UPUB`, setup logs, comparison logs, and then removes the generated `F:\RMVTEST` and `C:\RMVTMP` trees.

168
test/remove/RMVC.BAT Normal file
View File

@@ -0,0 +1,168 @@
@ECHO OFF
REM RMVC.BAT - delayed user-context REMOVE readback helper.
REM Started by RMVSTA via DLYSTRT. Runs from C:\RMVTMP.
C:
CD \RMVTMP
ECHO RMVC user-context REMOVE readback 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:\RMVTMP\HELPER.TXT
GOTO RELSUP
:HAVEF
ECHO Starting G10_R as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G10 > C:\RMVTMP\UNOV\G10_R.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G10 > C:\RMVTMP\UPUB\G10_R.OUT
ECHO Starting G11_W as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G11 > C:\RMVTMP\UNOV\G11_W.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G11 > C:\RMVTMP\UPUB\G11_W.OUT
ECHO Starting G12_C as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G12 > C:\RMVTMP\UNOV\G12_C.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G12 > C:\RMVTMP\UPUB\G12_C.OUT
ECHO Starting G13_E as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G13 > C:\RMVTMP\UNOV\G13_E.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G13 > C:\RMVTMP\UPUB\G13_E.OUT
ECHO Starting G14_M as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G14 > C:\RMVTMP\UNOV\G14_M.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G14 > C:\RMVTMP\UPUB\G14_M.OUT
ECHO Starting G15_F as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G15 > C:\RMVTMP\UNOV\G15_F.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G15 > C:\RMVTMP\UPUB\G15_F.OUT
ECHO Starting G16_A as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G16 > C:\RMVTMP\UNOV\G16_A.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G16 > C:\RMVTMP\UPUB\G16_A.OUT
ECHO Starting G17_S as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G17 > C:\RMVTMP\UNOV\G17_S.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G17 > C:\RMVTMP\UPUB\G17_S.OUT
ECHO Starting G20_RF as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G20 > C:\RMVTMP\UNOV\G20_RF.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G20 > C:\RMVTMP\UPUB\G20_RF.OUT
ECHO Starting G21_RW as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G21 > C:\RMVTMP\UNOV\G21_RW.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G21 > C:\RMVTMP\UPUB\G21_RW.OUT
ECHO Starting G22_RWC as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G22 > C:\RMVTMP\UNOV\G22_RWC.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G22 > C:\RMVTMP\UPUB\G22_RWC.OUT
ECHO Starting G23_RWCE as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G23 > C:\RMVTMP\UNOV\G23_RWCE.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G23 > C:\RMVTMP\UPUB\G23_RWCE.OUT
ECHO Starting G24_RAL as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G24 > C:\RMVTMP\UNOV\G24_RAL.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G24 > C:\RMVTMP\UPUB\G24_RAL.OUT
ECHO Starting G25_SAL as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G25 > C:\RMVTMP\UNOV\G25_SAL.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G25 > C:\RMVTMP\UPUB\G25_SAL.OUT
ECHO Starting G26_ALL as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G26 > C:\RMVTMP\UNOV\G26_ALL.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G26 > C:\RMVTMP\UPUB\G26_ALL.OUT
ECHO Starting G27_N as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G27 > C:\RMVTMP\UNOV\G27_N.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G27 > C:\RMVTMP\UPUB\G27_N.OUT
ECHO Starting G30_RE as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G30 > C:\RMVTMP\UNOV\G30_RE.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G30 > C:\RMVTMP\UPUB\G30_RE.OUT
ECHO Starting G31_RWF as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G31 > C:\RMVTMP\UNOV\G31_RWF.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G31 > C:\RMVTMP\UPUB\G31_RWF.OUT
ECHO Starting G32_RCM as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G32 > C:\RMVTMP\UNOV\G32_RCM.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G32 > C:\RMVTMP\UPUB\G32_RCM.OUT
ECHO Starting G33_RFA as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G33 > C:\RMVTMP\UNOV\G33_RFA.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G33 > C:\RMVTMP\UPUB\G33_RFA.OUT
ECHO Starting G34_WCM as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G34 > C:\RMVTMP\UNOV\G34_WCM.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G34 > C:\RMVTMP\UPUB\G34_WCM.OUT
ECHO Starting G35_EMF as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G35 > C:\RMVTMP\UNOV\G35_EMF.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G35 > C:\RMVTMP\UPUB\G35_EMF.OUT
ECHO Starting G36_RMF as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G36 > C:\RMVTMP\UNOV\G36_RMF.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G36 > C:\RMVTMP\UPUB\G36_RMF.OUT
ECHO Starting G37_REMA as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G37 > C:\RMVTMP\UNOV\G37_REMA.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G37 > C:\RMVTMP\UPUB\G37_REMA.OUT
ECHO Starting G38_SR as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G38 > C:\RMVTMP\UNOV\G38_SR.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G38 > C:\RMVTMP\UPUB\G38_SR.OUT
ECHO Starting G39_SRF as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G39 > C:\RMVTMP\UNOV\G39_SRF.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G39 > C:\RMVTMP\UPUB\G39_SRF.OUT
ECHO Starting G40_SWCM as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\G40 > C:\RMVTMP\UNOV\G40_SWCM.OUT
\PUBLIC\RIGHTS F:\RMVTEST\G40 > C:\RMVTMP\UPUB\G40_SWCM.OUT
ECHO Starting F10_R as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\F10\T.TXT > C:\RMVTMP\UNOV\F10_R.OUT
\PUBLIC\RIGHTS F:\RMVTEST\F10\T.TXT > C:\RMVTMP\UPUB\F10_R.OUT
ECHO Starting F11_RF as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\F11\T.TXT > C:\RMVTMP\UNOV\F11_RF.OUT
\PUBLIC\RIGHTS F:\RMVTEST\F11\T.TXT > C:\RMVTMP\UPUB\F11_RF.OUT
ECHO Starting F12_RAL as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\F12\T.TXT > C:\RMVTMP\UNOV\F12_RAL.OUT
\PUBLIC\RIGHTS F:\RMVTEST\F12\T.TXT > C:\RMVTMP\UPUB\F12_RAL.OUT
ECHO Starting F13_ALL as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\F13\T.TXT > C:\RMVTMP\UNOV\F13_ALL.OUT
\PUBLIC\RIGHTS F:\RMVTEST\F13\T.TXT > C:\RMVTMP\UPUB\F13_ALL.OUT
ECHO Starting F14_N as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\F14\T.TXT > C:\RMVTMP\UNOV\F14_N.OUT
\PUBLIC\RIGHTS F:\RMVTEST\F14\T.TXT > C:\RMVTMP\UPUB\F14_N.OUT
ECHO Starting F15_S as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\F15\T.TXT > C:\RMVTMP\UNOV\F15_S.OUT
\PUBLIC\RIGHTS F:\RMVTEST\F15\T.TXT > C:\RMVTMP\UPUB\F15_S.OUT
ECHO Starting F16_SAL as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\F16\T.TXT > C:\RMVTMP\UNOV\F16_SAL.OUT
\PUBLIC\RIGHTS F:\RMVTEST\F16\T.TXT > C:\RMVTMP\UPUB\F16_SAL.OUT
ECHO Starting S10_R as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\S10\S1 > C:\RMVTMP\UNOV\S10_R.OUT
\PUBLIC\RIGHTS F:\RMVTEST\S10\S1 > C:\RMVTMP\UPUB\S10_R.OUT
ECHO Starting S11_RWC as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\S11\S1 > C:\RMVTMP\UNOV\S11_RWC.OUT
\PUBLIC\RIGHTS F:\RMVTEST\S11\S1 > C:\RMVTMP\UPUB\S11_RWC.OUT
ECHO Starting S12_ALL as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\S12\S1 > C:\RMVTMP\UNOV\S12_ALL.OUT
\PUBLIC\RIGHTS F:\RMVTEST\S12\S1 > C:\RMVTMP\UPUB\S12_ALL.OUT
ECHO Starting S13_SAL as NOPASSUSER... >> C:\RMVTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RMVTEST\S13\S1 > C:\RMVTMP\UNOV\S13_SAL.OUT
\PUBLIC\RIGHTS F:\RMVTEST\S13\S1 > C:\RMVTMP\UPUB\S13_SAL.OUT
:RELSUP
C:
CD \RMVTMP
LOGOUT > ULOG2.OUT
F:
CD \
IF EXIST \LOGIN\LOGIN.EXE GOTO HAVELOG
ECHO F:\LOGIN\LOGIN.EXE not found. >> C:\RMVTMP\HELPER.TXT
GOTO MANUAL
:HAVELOG
F:\LOGIN\LOGIN SUPERVISOR /PWD:%LGNTPWD% > C:\RMVTMP\ULGSUP.OUT
F:
CD \
IF EXIST \RMVSTA.BAT GOTO QUEUEP2
ECHO F: not restored or \RMVSTA.BAT missing. >> C:\RMVTMP\HELPER.TXT
GOTO MANUAL
:QUEUEP2
C:
CD \RMVTMP
DLYSTRT /T:2 F:\RMVSTA.BAT PART2
GOTO END
:MANUAL
ECHO Please run manually after SUPERVISOR login: >> C:\RMVTMP\HELPER.TXT
ECHO F: >> C:\RMVTMP\HELPER.TXT
ECHO CD \ >> C:\RMVTMP\HELPER.TXT
ECHO RMVSTA PART2 >> C:\RMVTMP\HELPER.TXT
:END

595
test/remove/RMVSTA.BAT Normal file
View File

@@ -0,0 +1,595 @@
@ECHO OFF
REM RMVSTA.BAT
REM Automated REMOVE comparison test for MARS NWE.
REM
REM Direct mode:
REM OUT = Novell baseline using \NPUBLIC\REMOVE
REM PUBOUT = our implementation using \PUBLIC\REMOVE
REM
REM User-context mode:
REM REMOVE is run as SUPERVISOR against NOPASSUSER.
REM DLYSTRT starts C:\RMVTMP\RMVC.BAT after this script exits.
REM RMVC logs in as NOPASSUSER and captures effective 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: RMVSTA [PART2]
GOTO END
:PART1
F:
CD \
IF "%LGNTPWD%"=="" GOTO NEEDPWD
REM --- Clean generated test/result directories. ---
IF EXIST RMVTEST\*.* DELTREE /Y RMVTEST
IF EXIST RMVCMP\*.* DELTREE /Y RMVCMP
IF EXIST C:\RMVTMP\*.* DELTREE /Y C:\RMVTMP
IF NOT EXIST RMVTEST MD RMVTEST
IF NOT EXIST RMVCMP MD RMVCMP
IF NOT EXIST RMVCMP\OUT MD RMVCMP\OUT
IF NOT EXIST RMVCMP\PUBOUT MD RMVCMP\PUBOUT
IF NOT EXIST RMVCMP\SETUP MD RMVCMP\SETUP
IF NOT EXIST C:\RMVTMP MD C:\RMVTMP
IF NOT EXIST C:\RMVTMP\UNOV MD C:\RMVTMP\UNOV
IF NOT EXIST C:\RMVTMP\UPUB MD C:\RMVTMP\UPUB
IF NOT EXIST C:\RMVTMP\USETUP MD C:\RMVTMP\USETUP
ECHO RMVSTA REMOVE comparison test > F:\RMVCMP\RUN.LOG
ECHO OUT = Novell baseline with \NPUBLIC\REMOVE >> F:\RMVCMP\RUN.LOG
ECHO PUBOUT = our implementation with \PUBLIC\REMOVE >> F:\RMVCMP\RUN.LOG
ECHO User-context target: NOPASSUSER >> F:\RMVCMP\RUN.LOG
ECHO. >> F:\RMVCMP\RUN.LOG
ECHO Starting D01_HELP...
\NPUBLIC\REMOVE /? > F:\RMVCMP\OUT\D01_HELP.OUT
\PUBLIC\REMOVE /? > F:\RMVCMP\PUBOUT\D01_HELP.OUT
ECHO Starting D02_NOAR...
\NPUBLIC\REMOVE > F:\RMVCMP\OUT\D02_NOAR.OUT
\PUBLIC\REMOVE > F:\RMVCMP\PUBOUT\D02_NOAR.OUT
REM --- Setup matrix directories/files. ---
IF NOT EXIST RMVTEST\G10 MD RMVTEST\G10
ECHO G10_R > F:\RMVTEST\G10\T.TXT
IF NOT EXIST RMVTEST\G11 MD RMVTEST\G11
ECHO G11_W > F:\RMVTEST\G11\T.TXT
IF NOT EXIST RMVTEST\G12 MD RMVTEST\G12
ECHO G12_C > F:\RMVTEST\G12\T.TXT
IF NOT EXIST RMVTEST\G13 MD RMVTEST\G13
ECHO G13_E > F:\RMVTEST\G13\T.TXT
IF NOT EXIST RMVTEST\G14 MD RMVTEST\G14
ECHO G14_M > F:\RMVTEST\G14\T.TXT
IF NOT EXIST RMVTEST\G15 MD RMVTEST\G15
ECHO G15_F > F:\RMVTEST\G15\T.TXT
IF NOT EXIST RMVTEST\G16 MD RMVTEST\G16
ECHO G16_A > F:\RMVTEST\G16\T.TXT
IF NOT EXIST RMVTEST\G17 MD RMVTEST\G17
ECHO G17_S > F:\RMVTEST\G17\T.TXT
IF NOT EXIST RMVTEST\G20 MD RMVTEST\G20
ECHO G20_RF > F:\RMVTEST\G20\T.TXT
IF NOT EXIST RMVTEST\G21 MD RMVTEST\G21
ECHO G21_RW > F:\RMVTEST\G21\T.TXT
IF NOT EXIST RMVTEST\G22 MD RMVTEST\G22
ECHO G22_RWC > F:\RMVTEST\G22\T.TXT
IF NOT EXIST RMVTEST\G23 MD RMVTEST\G23
ECHO G23_RWCE > F:\RMVTEST\G23\T.TXT
IF NOT EXIST RMVTEST\G24 MD RMVTEST\G24
ECHO G24_RAL > F:\RMVTEST\G24\T.TXT
IF NOT EXIST RMVTEST\G25 MD RMVTEST\G25
ECHO G25_SAL > F:\RMVTEST\G25\T.TXT
IF NOT EXIST RMVTEST\G26 MD RMVTEST\G26
ECHO G26_ALL > F:\RMVTEST\G26\T.TXT
IF NOT EXIST RMVTEST\G27 MD RMVTEST\G27
ECHO G27_N > F:\RMVTEST\G27\T.TXT
IF NOT EXIST RMVTEST\G30 MD RMVTEST\G30
ECHO G30_RE > F:\RMVTEST\G30\T.TXT
IF NOT EXIST RMVTEST\G31 MD RMVTEST\G31
ECHO G31_RWF > F:\RMVTEST\G31\T.TXT
IF NOT EXIST RMVTEST\G32 MD RMVTEST\G32
ECHO G32_RCM > F:\RMVTEST\G32\T.TXT
IF NOT EXIST RMVTEST\G33 MD RMVTEST\G33
ECHO G33_RFA > F:\RMVTEST\G33\T.TXT
IF NOT EXIST RMVTEST\G34 MD RMVTEST\G34
ECHO G34_WCM > F:\RMVTEST\G34\T.TXT
IF NOT EXIST RMVTEST\G35 MD RMVTEST\G35
ECHO G35_EMF > F:\RMVTEST\G35\T.TXT
IF NOT EXIST RMVTEST\G36 MD RMVTEST\G36
ECHO G36_RMF > F:\RMVTEST\G36\T.TXT
IF NOT EXIST RMVTEST\G37 MD RMVTEST\G37
ECHO G37_REMA > F:\RMVTEST\G37\T.TXT
IF NOT EXIST RMVTEST\G38 MD RMVTEST\G38
ECHO G38_SR > F:\RMVTEST\G38\T.TXT
IF NOT EXIST RMVTEST\G39 MD RMVTEST\G39
ECHO G39_SRF > F:\RMVTEST\G39\T.TXT
IF NOT EXIST RMVTEST\G40 MD RMVTEST\G40
ECHO G40_SWCM > F:\RMVTEST\G40\T.TXT
IF NOT EXIST RMVTEST\F10 MD RMVTEST\F10
ECHO F10_R > F:\RMVTEST\F10\T.TXT
IF NOT EXIST RMVTEST\F11 MD RMVTEST\F11
ECHO F11_RF > F:\RMVTEST\F11\T.TXT
IF NOT EXIST RMVTEST\F12 MD RMVTEST\F12
ECHO F12_RAL > F:\RMVTEST\F12\T.TXT
IF NOT EXIST RMVTEST\F13 MD RMVTEST\F13
ECHO F13_ALL > F:\RMVTEST\F13\T.TXT
IF NOT EXIST RMVTEST\F14 MD RMVTEST\F14
ECHO F14_N > F:\RMVTEST\F14\T.TXT
IF NOT EXIST RMVTEST\F15 MD RMVTEST\F15
ECHO F15_S > F:\RMVTEST\F15\T.TXT
IF NOT EXIST RMVTEST\F16 MD RMVTEST\F16
ECHO F16_SAL > F:\RMVTEST\F16\T.TXT
IF NOT EXIST RMVTEST\S10 MD RMVTEST\S10
IF NOT EXIST RMVTEST\S10\S1 MD RMVTEST\S10\S1
IF NOT EXIST RMVTEST\S10\S2 MD RMVTEST\S10\S2
ECHO S10_R > F:\RMVTEST\S10\S1\T.TXT
ECHO S10_R > F:\RMVTEST\S10\S2\T.TXT
IF NOT EXIST RMVTEST\S11 MD RMVTEST\S11
IF NOT EXIST RMVTEST\S11\S1 MD RMVTEST\S11\S1
IF NOT EXIST RMVTEST\S11\S2 MD RMVTEST\S11\S2
ECHO S11_RWC > F:\RMVTEST\S11\S1\T.TXT
ECHO S11_RWC > F:\RMVTEST\S11\S2\T.TXT
IF NOT EXIST RMVTEST\S12 MD RMVTEST\S12
IF NOT EXIST RMVTEST\S12\S1 MD RMVTEST\S12\S1
IF NOT EXIST RMVTEST\S12\S2 MD RMVTEST\S12\S2
ECHO S12_ALL > F:\RMVTEST\S12\S1\T.TXT
ECHO S12_ALL > F:\RMVTEST\S12\S2\T.TXT
IF NOT EXIST RMVTEST\S13 MD RMVTEST\S13
IF NOT EXIST RMVTEST\S13\S1 MD RMVTEST\S13\S1
IF NOT EXIST RMVTEST\S13\S2 MD RMVTEST\S13\S2
ECHO S13_SAL > F:\RMVTEST\S13\S1\T.TXT
ECHO S13_SAL > F:\RMVTEST\S13\S2\T.TXT
IF NOT EXIST RMVTEST\ERR MD RMVTEST\ERR
ECHO ERR > F:\RMVTEST\ERR\T.TXT
REM --- Direct REMOVE output compare. Setup uses Novell GRANT for both sides. ---
ECHO Starting G10_R directory remove...
\NPUBLIC\GRANT R FOR F:\RMVTEST\G10 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G10_RNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G10 > F:\RMVCMP\OUT\G10_R.OUT
\NPUBLIC\GRANT R FOR F:\RMVTEST\G10 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G10_RPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G10 > F:\RMVCMP\PUBOUT\G10_R.OUT
ECHO Starting G11_W directory remove...
\NPUBLIC\GRANT W FOR F:\RMVTEST\G11 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G11_WNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G11 > F:\RMVCMP\OUT\G11_W.OUT
\NPUBLIC\GRANT W FOR F:\RMVTEST\G11 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G11_WPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G11 > F:\RMVCMP\PUBOUT\G11_W.OUT
ECHO Starting G12_C directory remove...
\NPUBLIC\GRANT C FOR F:\RMVTEST\G12 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G12_CNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G12 > F:\RMVCMP\OUT\G12_C.OUT
\NPUBLIC\GRANT C FOR F:\RMVTEST\G12 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G12_CPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G12 > F:\RMVCMP\PUBOUT\G12_C.OUT
ECHO Starting G13_E directory remove...
\NPUBLIC\GRANT E FOR F:\RMVTEST\G13 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G13_ENG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G13 > F:\RMVCMP\OUT\G13_E.OUT
\NPUBLIC\GRANT E FOR F:\RMVTEST\G13 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G13_EPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G13 > F:\RMVCMP\PUBOUT\G13_E.OUT
ECHO Starting G14_M directory remove...
\NPUBLIC\GRANT M FOR F:\RMVTEST\G14 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G14_MNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G14 > F:\RMVCMP\OUT\G14_M.OUT
\NPUBLIC\GRANT M FOR F:\RMVTEST\G14 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G14_MPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G14 > F:\RMVCMP\PUBOUT\G14_M.OUT
ECHO Starting G15_F directory remove...
\NPUBLIC\GRANT F FOR F:\RMVTEST\G15 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G15_FNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G15 > F:\RMVCMP\OUT\G15_F.OUT
\NPUBLIC\GRANT F FOR F:\RMVTEST\G15 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G15_FPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G15 > F:\RMVCMP\PUBOUT\G15_F.OUT
ECHO Starting G16_A directory remove...
\NPUBLIC\GRANT A FOR F:\RMVTEST\G16 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G16_ANG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G16 > F:\RMVCMP\OUT\G16_A.OUT
\NPUBLIC\GRANT A FOR F:\RMVTEST\G16 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G16_APG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G16 > F:\RMVCMP\PUBOUT\G16_A.OUT
ECHO Starting G17_S directory remove...
\NPUBLIC\GRANT S FOR F:\RMVTEST\G17 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G17_SNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G17 > F:\RMVCMP\OUT\G17_S.OUT
\NPUBLIC\GRANT S FOR F:\RMVTEST\G17 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G17_SPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G17 > F:\RMVCMP\PUBOUT\G17_S.OUT
ECHO Starting G20_RF directory remove...
\NPUBLIC\GRANT R F FOR F:\RMVTEST\G20 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G20_RFNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G20 > F:\RMVCMP\OUT\G20_RF.OUT
\NPUBLIC\GRANT R F FOR F:\RMVTEST\G20 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G20_RFPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G20 > F:\RMVCMP\PUBOUT\G20_RF.OUT
ECHO Starting G21_RW directory remove...
\NPUBLIC\GRANT R W FOR F:\RMVTEST\G21 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G21_RWNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G21 > F:\RMVCMP\OUT\G21_RW.OUT
\NPUBLIC\GRANT R W FOR F:\RMVTEST\G21 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G21_RWPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G21 > F:\RMVCMP\PUBOUT\G21_RW.OUT
ECHO Starting G22_RWC directory remove...
\NPUBLIC\GRANT R W C FOR F:\RMVTEST\G22 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G22_RWCNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G22 > F:\RMVCMP\OUT\G22_RWC.OUT
\NPUBLIC\GRANT R W C FOR F:\RMVTEST\G22 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G22_RWCPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G22 > F:\RMVCMP\PUBOUT\G22_RWC.OUT
ECHO Starting G23_RWCE directory remove...
\NPUBLIC\GRANT R W C E FOR F:\RMVTEST\G23 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G23_RWCENG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G23 > F:\RMVCMP\OUT\G23_RWCE.OUT
\NPUBLIC\GRANT R W C E FOR F:\RMVTEST\G23 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G23_RWCEPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G23 > F:\RMVCMP\PUBOUT\G23_RWCE.OUT
ECHO Starting G24_RAL directory remove...
\NPUBLIC\GRANT R W C E M F A FOR F:\RMVTEST\G24 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G24_RALNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G24 > F:\RMVCMP\OUT\G24_RAL.OUT
\NPUBLIC\GRANT R W C E M F A FOR F:\RMVTEST\G24 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G24_RALPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G24 > F:\RMVCMP\PUBOUT\G24_RAL.OUT
ECHO Starting G25_SAL directory remove...
\NPUBLIC\GRANT S R W C E M F A FOR F:\RMVTEST\G25 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G25_SALNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G25 > F:\RMVCMP\OUT\G25_SAL.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RMVTEST\G25 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G25_SALPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G25 > F:\RMVCMP\PUBOUT\G25_SAL.OUT
ECHO Starting G26_ALL directory remove...
\NPUBLIC\GRANT ALL FOR F:\RMVTEST\G26 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G26_ALLNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G26 > F:\RMVCMP\OUT\G26_ALL.OUT
\NPUBLIC\GRANT ALL FOR F:\RMVTEST\G26 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G26_ALLPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G26 > F:\RMVCMP\PUBOUT\G26_ALL.OUT
ECHO Starting G27_N directory remove...
\NPUBLIC\GRANT N FOR F:\RMVTEST\G27 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G27_NNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G27 > F:\RMVCMP\OUT\G27_N.OUT
\NPUBLIC\GRANT N FOR F:\RMVTEST\G27 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G27_NPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G27 > F:\RMVCMP\PUBOUT\G27_N.OUT
ECHO Starting G30_RE directory remove...
\NPUBLIC\GRANT R E FOR F:\RMVTEST\G30 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G30_RENG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G30 > F:\RMVCMP\OUT\G30_RE.OUT
\NPUBLIC\GRANT R E FOR F:\RMVTEST\G30 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G30_REPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G30 > F:\RMVCMP\PUBOUT\G30_RE.OUT
ECHO Starting G31_RWF directory remove...
\NPUBLIC\GRANT R W F FOR F:\RMVTEST\G31 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G31_RWFNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G31 > F:\RMVCMP\OUT\G31_RWF.OUT
\NPUBLIC\GRANT R W F FOR F:\RMVTEST\G31 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G31_RWFPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G31 > F:\RMVCMP\PUBOUT\G31_RWF.OUT
ECHO Starting G32_RCM directory remove...
\NPUBLIC\GRANT R C M FOR F:\RMVTEST\G32 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G32_RCMNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G32 > F:\RMVCMP\OUT\G32_RCM.OUT
\NPUBLIC\GRANT R C M FOR F:\RMVTEST\G32 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G32_RCMPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G32 > F:\RMVCMP\PUBOUT\G32_RCM.OUT
ECHO Starting G33_RFA directory remove...
\NPUBLIC\GRANT R F A FOR F:\RMVTEST\G33 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G33_RFANG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G33 > F:\RMVCMP\OUT\G33_RFA.OUT
\NPUBLIC\GRANT R F A FOR F:\RMVTEST\G33 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G33_RFAPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G33 > F:\RMVCMP\PUBOUT\G33_RFA.OUT
ECHO Starting G34_WCM directory remove...
\NPUBLIC\GRANT W C M FOR F:\RMVTEST\G34 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G34_WCMNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G34 > F:\RMVCMP\OUT\G34_WCM.OUT
\NPUBLIC\GRANT W C M FOR F:\RMVTEST\G34 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G34_WCMPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G34 > F:\RMVCMP\PUBOUT\G34_WCM.OUT
ECHO Starting G35_EMF directory remove...
\NPUBLIC\GRANT E M F FOR F:\RMVTEST\G35 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G35_EMFNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G35 > F:\RMVCMP\OUT\G35_EMF.OUT
\NPUBLIC\GRANT E M F FOR F:\RMVTEST\G35 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G35_EMFPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G35 > F:\RMVCMP\PUBOUT\G35_EMF.OUT
ECHO Starting G36_RMF directory remove...
\NPUBLIC\GRANT R W C M F FOR F:\RMVTEST\G36 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G36_RMFNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G36 > F:\RMVCMP\OUT\G36_RMF.OUT
\NPUBLIC\GRANT R W C M F FOR F:\RMVTEST\G36 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G36_RMFPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G36 > F:\RMVCMP\PUBOUT\G36_RMF.OUT
ECHO Starting G37_REMA directory remove...
\NPUBLIC\GRANT R E M A FOR F:\RMVTEST\G37 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G37_REMANG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G37 > F:\RMVCMP\OUT\G37_REMA.OUT
\NPUBLIC\GRANT R E M A FOR F:\RMVTEST\G37 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G37_REMAPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G37 > F:\RMVCMP\PUBOUT\G37_REMA.OUT
ECHO Starting G38_SR directory remove...
\NPUBLIC\GRANT S R FOR F:\RMVTEST\G38 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G38_SRNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G38 > F:\RMVCMP\OUT\G38_SR.OUT
\NPUBLIC\GRANT S R FOR F:\RMVTEST\G38 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G38_SRPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G38 > F:\RMVCMP\PUBOUT\G38_SR.OUT
ECHO Starting G39_SRF directory remove...
\NPUBLIC\GRANT S R F FOR F:\RMVTEST\G39 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G39_SRFNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G39 > F:\RMVCMP\OUT\G39_SRF.OUT
\NPUBLIC\GRANT S R F FOR F:\RMVTEST\G39 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G39_SRFPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G39 > F:\RMVCMP\PUBOUT\G39_SRF.OUT
ECHO Starting G40_SWCM directory remove...
\NPUBLIC\GRANT S W C M FOR F:\RMVTEST\G40 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G40_SWCMNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G40 > F:\RMVCMP\OUT\G40_SWCM.OUT
\NPUBLIC\GRANT S W C M FOR F:\RMVTEST\G40 TO USER NOPASSUSER > F:\RMVCMP\SETUP\G40_SWCMPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\G40 > F:\RMVCMP\PUBOUT\G40_SWCM.OUT
ECHO Starting F10_R file remove...
\NPUBLIC\GRANT R FOR F:\RMVTEST\F10\T.TXT TO USER NOPASSUSER /FILES > F:\RMVCMP\SETUP\F10_RNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\F10\T.TXT /FILES > F:\RMVCMP\OUT\F10_R.OUT
\NPUBLIC\GRANT R FOR F:\RMVTEST\F10\T.TXT TO USER NOPASSUSER /FILES > F:\RMVCMP\SETUP\F10_RPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\F10\T.TXT /FILES > F:\RMVCMP\PUBOUT\F10_R.OUT
ECHO Starting F11_RF file remove...
\NPUBLIC\GRANT R F FOR F:\RMVTEST\F11\T.TXT TO USER NOPASSUSER /FILES > F:\RMVCMP\SETUP\F11_RFNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\F11\T.TXT /FILES > F:\RMVCMP\OUT\F11_RF.OUT
\NPUBLIC\GRANT R F FOR F:\RMVTEST\F11\T.TXT TO USER NOPASSUSER /FILES > F:\RMVCMP\SETUP\F11_RFPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\F11\T.TXT /FILES > F:\RMVCMP\PUBOUT\F11_RF.OUT
ECHO Starting F12_RAL file remove...
\NPUBLIC\GRANT R W C E M F A FOR F:\RMVTEST\F12\T.TXT TO USER NOPASSUSER /FILES > F:\RMVCMP\SETUP\F12_RALNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\F12\T.TXT /FILES > F:\RMVCMP\OUT\F12_RAL.OUT
\NPUBLIC\GRANT R W C E M F A FOR F:\RMVTEST\F12\T.TXT TO USER NOPASSUSER /FILES > F:\RMVCMP\SETUP\F12_RALPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\F12\T.TXT /FILES > F:\RMVCMP\PUBOUT\F12_RAL.OUT
ECHO Starting F13_ALL file remove...
\NPUBLIC\GRANT ALL FOR F:\RMVTEST\F13\T.TXT TO USER NOPASSUSER /FILES > F:\RMVCMP\SETUP\F13_ALLNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\F13\T.TXT /FILES > F:\RMVCMP\OUT\F13_ALL.OUT
\NPUBLIC\GRANT ALL FOR F:\RMVTEST\F13\T.TXT TO USER NOPASSUSER /FILES > F:\RMVCMP\SETUP\F13_ALLPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\F13\T.TXT /FILES > F:\RMVCMP\PUBOUT\F13_ALL.OUT
ECHO Starting F14_N file remove...
\NPUBLIC\GRANT N FOR F:\RMVTEST\F14\T.TXT TO USER NOPASSUSER /FILES > F:\RMVCMP\SETUP\F14_NNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\F14\T.TXT /FILES > F:\RMVCMP\OUT\F14_N.OUT
\NPUBLIC\GRANT N FOR F:\RMVTEST\F14\T.TXT TO USER NOPASSUSER /FILES > F:\RMVCMP\SETUP\F14_NPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\F14\T.TXT /FILES > F:\RMVCMP\PUBOUT\F14_N.OUT
ECHO Starting F15_S file remove...
\NPUBLIC\GRANT S FOR F:\RMVTEST\F15\T.TXT TO USER NOPASSUSER /FILES > F:\RMVCMP\SETUP\F15_SNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\F15\T.TXT /FILES > F:\RMVCMP\OUT\F15_S.OUT
\NPUBLIC\GRANT S FOR F:\RMVTEST\F15\T.TXT TO USER NOPASSUSER /FILES > F:\RMVCMP\SETUP\F15_SPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\F15\T.TXT /FILES > F:\RMVCMP\PUBOUT\F15_S.OUT
ECHO Starting F16_SAL file remove...
\NPUBLIC\GRANT S R W C E M F A FOR F:\RMVTEST\F16\T.TXT TO USER NOPASSUSER /FILES > F:\RMVCMP\SETUP\F16_SALNG.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\F16\T.TXT /FILES > F:\RMVCMP\OUT\F16_SAL.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RMVTEST\F16\T.TXT TO USER NOPASSUSER /FILES > F:\RMVCMP\SETUP\F16_SALPG.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\F16\T.TXT /FILES > F:\RMVCMP\PUBOUT\F16_SAL.OUT
ECHO Starting S10_R subdirs remove...
\NPUBLIC\GRANT R FOR F:\RMVTEST\S10 TO USER NOPASSUSER > F:\RMVCMP\SETUP\S10_RNR.OUT
\NPUBLIC\GRANT R FOR F:\RMVTEST\S10\S1 TO USER NOPASSUSER > F:\RMVCMP\SETUP\S10_RN1.OUT
\NPUBLIC\GRANT R FOR F:\RMVTEST\S10\S2 TO USER NOPASSUSER > F:\RMVCMP\SETUP\S10_RN2.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\S10 /SUBDIRS > F:\RMVCMP\OUT\S10_R.OUT
\NPUBLIC\GRANT R FOR F:\RMVTEST\S10 TO USER NOPASSUSER > F:\RMVCMP\SETUP\S10_RPR.OUT
\NPUBLIC\GRANT R FOR F:\RMVTEST\S10\S1 TO USER NOPASSUSER > F:\RMVCMP\SETUP\S10_RP1.OUT
\NPUBLIC\GRANT R FOR F:\RMVTEST\S10\S2 TO USER NOPASSUSER > F:\RMVCMP\SETUP\S10_RP2.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\S10 /SUBDIRS > F:\RMVCMP\PUBOUT\S10_R.OUT
ECHO Starting S11_RWC subdirs remove...
\NPUBLIC\GRANT R W C FOR F:\RMVTEST\S11 TO USER NOPASSUSER > F:\RMVCMP\SETUP\S11_RWCNR.OUT
\NPUBLIC\GRANT R W C FOR F:\RMVTEST\S11\S1 TO USER NOPASSUSER > F:\RMVCMP\SETUP\S11_RWCN1.OUT
\NPUBLIC\GRANT R W C FOR F:\RMVTEST\S11\S2 TO USER NOPASSUSER > F:\RMVCMP\SETUP\S11_RWCN2.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\S11 /SUBDIRS > F:\RMVCMP\OUT\S11_RWC.OUT
\NPUBLIC\GRANT R W C FOR F:\RMVTEST\S11 TO USER NOPASSUSER > F:\RMVCMP\SETUP\S11_RWCPR.OUT
\NPUBLIC\GRANT R W C FOR F:\RMVTEST\S11\S1 TO USER NOPASSUSER > F:\RMVCMP\SETUP\S11_RWCP1.OUT
\NPUBLIC\GRANT R W C FOR F:\RMVTEST\S11\S2 TO USER NOPASSUSER > F:\RMVCMP\SETUP\S11_RWCP2.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\S11 /SUBDIRS > F:\RMVCMP\PUBOUT\S11_RWC.OUT
ECHO Starting S12_ALL subdirs remove...
\NPUBLIC\GRANT ALL FOR F:\RMVTEST\S12 TO USER NOPASSUSER > F:\RMVCMP\SETUP\S12_ALLNR.OUT
\NPUBLIC\GRANT ALL FOR F:\RMVTEST\S12\S1 TO USER NOPASSUSER > F:\RMVCMP\SETUP\S12_ALLN1.OUT
\NPUBLIC\GRANT ALL FOR F:\RMVTEST\S12\S2 TO USER NOPASSUSER > F:\RMVCMP\SETUP\S12_ALLN2.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\S12 /SUBDIRS > F:\RMVCMP\OUT\S12_ALL.OUT
\NPUBLIC\GRANT ALL FOR F:\RMVTEST\S12 TO USER NOPASSUSER > F:\RMVCMP\SETUP\S12_ALLPR.OUT
\NPUBLIC\GRANT ALL FOR F:\RMVTEST\S12\S1 TO USER NOPASSUSER > F:\RMVCMP\SETUP\S12_ALLP1.OUT
\NPUBLIC\GRANT ALL FOR F:\RMVTEST\S12\S2 TO USER NOPASSUSER > F:\RMVCMP\SETUP\S12_ALLP2.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\S12 /SUBDIRS > F:\RMVCMP\PUBOUT\S12_ALL.OUT
ECHO Starting S13_SAL subdirs remove...
\NPUBLIC\GRANT S R W C E M F A FOR F:\RMVTEST\S13 TO USER NOPASSUSER > F:\RMVCMP\SETUP\S13_SALNR.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RMVTEST\S13\S1 TO USER NOPASSUSER > F:\RMVCMP\SETUP\S13_SALN1.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RMVTEST\S13\S2 TO USER NOPASSUSER > F:\RMVCMP\SETUP\S13_SALN2.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\S13 /SUBDIRS > F:\RMVCMP\OUT\S13_SAL.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RMVTEST\S13 TO USER NOPASSUSER > F:\RMVCMP\SETUP\S13_SALPR.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RMVTEST\S13\S1 TO USER NOPASSUSER > F:\RMVCMP\SETUP\S13_SALP1.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RMVTEST\S13\S2 TO USER NOPASSUSER > F:\RMVCMP\SETUP\S13_SALP2.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\S13 /SUBDIRS > F:\RMVCMP\PUBOUT\S13_SAL.OUT
ECHO Starting E90_NOTR no trustee...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\ERR > F:\RMVCMP\OUT\E90_NOTR.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\ERR > F:\RMVCMP\PUBOUT\E90_NOTR.OUT
ECHO Starting E91_MUSR missing user...
\NPUBLIC\REMOVE USER NO_SUCH_USER FROM F:\RMVTEST\ERR > F:\RMVCMP\OUT\E91_MUSR.OUT
\PUBLIC\REMOVE USER NO_SUCH_USER FROM F:\RMVTEST\ERR > F:\RMVCMP\PUBOUT\E91_MUSR.OUT
ECHO Starting E92_MISD missing path...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\MISS > F:\RMVCMP\OUT\E92_MISD.OUT
\PUBLIC\REMOVE USER NOPASSUSER FROM F:\RMVTEST\MISS > F:\RMVCMP\PUBOUT\E92_MISD.OUT
ECHO Starting E93_BADD bad grammar...
\NPUBLIC\REMOVE USER FROM F:\RMVTEST\ERR > F:\RMVCMP\OUT\E93_BADD.OUT
\PUBLIC\REMOVE USER FROM F:\RMVTEST\ERR > F:\RMVCMP\PUBOUT\E93_BADD.OUT
ECHO === Direct compare OUT vs PUBOUT === > F:\RMVCMP\COMPARE.LOG
ECHO Comparing D01_HELP >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\D01_HELP.OUT F:\RMVCMP\PUBOUT\D01_HELP.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing D02_NOAR >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\D02_NOAR.OUT F:\RMVCMP\PUBOUT\D02_NOAR.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G10_R >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G10_R.OUT F:\RMVCMP\PUBOUT\G10_R.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G11_W >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G11_W.OUT F:\RMVCMP\PUBOUT\G11_W.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G12_C >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G12_C.OUT F:\RMVCMP\PUBOUT\G12_C.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G13_E >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G13_E.OUT F:\RMVCMP\PUBOUT\G13_E.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G14_M >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G14_M.OUT F:\RMVCMP\PUBOUT\G14_M.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G15_F >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G15_F.OUT F:\RMVCMP\PUBOUT\G15_F.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G16_A >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G16_A.OUT F:\RMVCMP\PUBOUT\G16_A.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G17_S >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G17_S.OUT F:\RMVCMP\PUBOUT\G17_S.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G20_RF >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G20_RF.OUT F:\RMVCMP\PUBOUT\G20_RF.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G21_RW >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G21_RW.OUT F:\RMVCMP\PUBOUT\G21_RW.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G22_RWC >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G22_RWC.OUT F:\RMVCMP\PUBOUT\G22_RWC.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G23_RWCE >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G23_RWCE.OUT F:\RMVCMP\PUBOUT\G23_RWCE.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G24_RAL >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G24_RAL.OUT F:\RMVCMP\PUBOUT\G24_RAL.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G25_SAL >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G25_SAL.OUT F:\RMVCMP\PUBOUT\G25_SAL.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G26_ALL >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G26_ALL.OUT F:\RMVCMP\PUBOUT\G26_ALL.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G27_N >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G27_N.OUT F:\RMVCMP\PUBOUT\G27_N.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G30_RE >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G30_RE.OUT F:\RMVCMP\PUBOUT\G30_RE.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G31_RWF >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G31_RWF.OUT F:\RMVCMP\PUBOUT\G31_RWF.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G32_RCM >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G32_RCM.OUT F:\RMVCMP\PUBOUT\G32_RCM.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G33_RFA >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G33_RFA.OUT F:\RMVCMP\PUBOUT\G33_RFA.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G34_WCM >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G34_WCM.OUT F:\RMVCMP\PUBOUT\G34_WCM.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G35_EMF >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G35_EMF.OUT F:\RMVCMP\PUBOUT\G35_EMF.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G36_RMF >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G36_RMF.OUT F:\RMVCMP\PUBOUT\G36_RMF.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G37_REMA >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G37_REMA.OUT F:\RMVCMP\PUBOUT\G37_REMA.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G38_SR >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G38_SR.OUT F:\RMVCMP\PUBOUT\G38_SR.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G39_SRF >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G39_SRF.OUT F:\RMVCMP\PUBOUT\G39_SRF.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing G40_SWCM >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\G40_SWCM.OUT F:\RMVCMP\PUBOUT\G40_SWCM.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing F10_R >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\F10_R.OUT F:\RMVCMP\PUBOUT\F10_R.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing F11_RF >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\F11_RF.OUT F:\RMVCMP\PUBOUT\F11_RF.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing F12_RAL >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\F12_RAL.OUT F:\RMVCMP\PUBOUT\F12_RAL.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing F13_ALL >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\F13_ALL.OUT F:\RMVCMP\PUBOUT\F13_ALL.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing F14_N >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\F14_N.OUT F:\RMVCMP\PUBOUT\F14_N.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing F15_S >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\F15_S.OUT F:\RMVCMP\PUBOUT\F15_S.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing F16_SAL >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\F16_SAL.OUT F:\RMVCMP\PUBOUT\F16_SAL.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing S10_R >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\S10_R.OUT F:\RMVCMP\PUBOUT\S10_R.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing S11_RWC >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\S11_RWC.OUT F:\RMVCMP\PUBOUT\S11_RWC.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing S12_ALL >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\S12_ALL.OUT F:\RMVCMP\PUBOUT\S12_ALL.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing S13_SAL >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\S13_SAL.OUT F:\RMVCMP\PUBOUT\S13_SAL.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing E90_NOTR >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\E90_NOTR.OUT F:\RMVCMP\PUBOUT\E90_NOTR.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing E91_MUSR >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\E91_MUSR.OUT F:\RMVCMP\PUBOUT\E91_MUSR.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing E92_MISD >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\E92_MISD.OUT F:\RMVCMP\PUBOUT\E92_MISD.OUT >> F:\RMVCMP\COMPARE.LOG
ECHO Comparing E93_BADD >> F:\RMVCMP\COMPARE.LOG
FC F:\RMVCMP\OUT\E93_BADD.OUT F:\RMVCMP\PUBOUT\E93_BADD.OUT >> F:\RMVCMP\COMPARE.LOG
REM --- Prepare delayed user-context readback. ---
COPY F:\test\remove\RMVC.BAT C:\RMVTMP\RMVC.BAT > NUL
IF EXIST F:\RMVC.BAT COPY F:\RMVC.BAT C:\RMVTMP\RMVC.BAT > NUL
IF EXIST \PUBLIC\DLYSTRT.EXE COPY \PUBLIC\DLYSTRT.EXE C:\RMVTMP > NUL
IF EXIST C:\RMVTMP\DLYSTRT.EXE GOTO HAVEDLY
ECHO ERROR: DLYSTRT.EXE not found. >> F:\RMVCMP\RUN.LOG
ECHO ERROR: DLYSTRT.EXE not found.
GOTO END
:HAVEDLY
C:
CD \RMVTMP
DLYSTRT /T:2 RMVC.BAT
F:
CD \
ECHO RMVSTA Part1 finished. Waiting for delayed NOPASSUSER readback.
GOTO END
:PART2
F:
CD \
IF NOT EXIST RMVCMP MD RMVCMP
IF NOT EXIST RMVCMP\UNOV MD RMVCMP\UNOV
IF NOT EXIST RMVCMP\UPUB MD RMVCMP\UPUB
IF NOT EXIST RMVCMP\USETUP MD RMVCMP\USETUP
IF EXIST C:\RMVTMP\UNOV\*.* COPY C:\RMVTMP\UNOV\*.* F:\RMVCMP\UNOV > NUL
IF EXIST C:\RMVTMP\UPUB\*.* COPY C:\RMVTMP\UPUB\*.* F:\RMVCMP\UPUB > NUL
IF EXIST C:\RMVTMP\USETUP\*.* COPY C:\RMVTMP\USETUP\*.* F:\RMVCMP\USETUP > NUL
IF EXIST C:\RMVTMP\HELPER.TXT COPY C:\RMVTMP\HELPER.TXT F:\RMVCMP\HELPER.TXT > NUL
IF EXIST C:\RMVTMP\ULOG1.OUT COPY C:\RMVTMP\ULOG1.OUT F:\RMVCMP\ULOG1.OUT > NUL
IF EXIST C:\RMVTMP\ULOGIN.OUT COPY C:\RMVTMP\ULOGIN.OUT F:\RMVCMP\ULOGIN.OUT > NUL
IF EXIST C:\RMVTMP\ULOG2.OUT COPY C:\RMVTMP\ULOG2.OUT F:\RMVCMP\ULOG2.OUT > NUL
IF EXIST C:\RMVTMP\ULGSUP.OUT COPY C:\RMVTMP\ULGSUP.OUT F:\RMVCMP\ULGSUP.OUT > NUL
ECHO === User-context compare UNOV vs UPUB === > F:\RMVCMP\UCOMP.LOG
ECHO Comparing G10_R >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G10_R.OUT F:\RMVCMP\UPUB\G10_R.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing G11_W >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G11_W.OUT F:\RMVCMP\UPUB\G11_W.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing G12_C >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G12_C.OUT F:\RMVCMP\UPUB\G12_C.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing G13_E >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G13_E.OUT F:\RMVCMP\UPUB\G13_E.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing G14_M >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G14_M.OUT F:\RMVCMP\UPUB\G14_M.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing G15_F >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G15_F.OUT F:\RMVCMP\UPUB\G15_F.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing G16_A >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G16_A.OUT F:\RMVCMP\UPUB\G16_A.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing G17_S >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G17_S.OUT F:\RMVCMP\UPUB\G17_S.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing G20_RF >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G20_RF.OUT F:\RMVCMP\UPUB\G20_RF.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing G21_RW >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G21_RW.OUT F:\RMVCMP\UPUB\G21_RW.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing G22_RWC >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G22_RWC.OUT F:\RMVCMP\UPUB\G22_RWC.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing G23_RWCE >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G23_RWCE.OUT F:\RMVCMP\UPUB\G23_RWCE.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing G24_RAL >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G24_RAL.OUT F:\RMVCMP\UPUB\G24_RAL.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing G25_SAL >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G25_SAL.OUT F:\RMVCMP\UPUB\G25_SAL.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing G26_ALL >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G26_ALL.OUT F:\RMVCMP\UPUB\G26_ALL.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing G27_N >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G27_N.OUT F:\RMVCMP\UPUB\G27_N.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing G30_RE >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G30_RE.OUT F:\RMVCMP\UPUB\G30_RE.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing G31_RWF >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G31_RWF.OUT F:\RMVCMP\UPUB\G31_RWF.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing G32_RCM >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G32_RCM.OUT F:\RMVCMP\UPUB\G32_RCM.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing G33_RFA >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G33_RFA.OUT F:\RMVCMP\UPUB\G33_RFA.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing G34_WCM >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G34_WCM.OUT F:\RMVCMP\UPUB\G34_WCM.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing G35_EMF >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G35_EMF.OUT F:\RMVCMP\UPUB\G35_EMF.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing G36_RMF >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G36_RMF.OUT F:\RMVCMP\UPUB\G36_RMF.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing G37_REMA >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G37_REMA.OUT F:\RMVCMP\UPUB\G37_REMA.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing G38_SR >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G38_SR.OUT F:\RMVCMP\UPUB\G38_SR.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing G39_SRF >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G39_SRF.OUT F:\RMVCMP\UPUB\G39_SRF.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing G40_SWCM >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\G40_SWCM.OUT F:\RMVCMP\UPUB\G40_SWCM.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing F10_R >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\F10_R.OUT F:\RMVCMP\UPUB\F10_R.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing F11_RF >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\F11_RF.OUT F:\RMVCMP\UPUB\F11_RF.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing F12_RAL >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\F12_RAL.OUT F:\RMVCMP\UPUB\F12_RAL.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing F13_ALL >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\F13_ALL.OUT F:\RMVCMP\UPUB\F13_ALL.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing F14_N >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\F14_N.OUT F:\RMVCMP\UPUB\F14_N.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing F15_S >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\F15_S.OUT F:\RMVCMP\UPUB\F15_S.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing F16_SAL >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\F16_SAL.OUT F:\RMVCMP\UPUB\F16_SAL.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing S10_R >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\S10_R.OUT F:\RMVCMP\UPUB\S10_R.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing S11_RWC >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\S11_RWC.OUT F:\RMVCMP\UPUB\S11_RWC.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing S12_ALL >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\S12_ALL.OUT F:\RMVCMP\UPUB\S12_ALL.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO Comparing S13_SAL >> F:\RMVCMP\UCOMP.LOG
FC F:\RMVCMP\UNOV\S13_SAL.OUT F:\RMVCMP\UPUB\S13_SAL.OUT >> F:\RMVCMP\UCOMP.LOG
ECHO === SUMMARY === > F:\RMVCMP\SUMMARY.TXT
ECHO RMVSTA REMOVE comparison finished. >> F:\RMVCMP\SUMMARY.TXT
ECHO. >> F:\RMVCMP\SUMMARY.TXT
ECHO Direct mode compares NPUBLIC REMOVE against PUBLIC REMOVE. >> F:\RMVCMP\SUMMARY.TXT
ECHO User-context mode logs in as NOPASSUSER and compares RIGHTS output after PUBLIC REMOVE. >> F:\RMVCMP\SUMMARY.TXT
ECHO Optional: RMVZIP ausfuehren. >> F:\RMVCMP\SUMMARY.TXT
ECHO RMVSTA PART2 fertig.
ECHO Ergebnisse liegen in F:\RMVCMP
ECHO Optional: RMVZIP ausfuehren.
GOTO END
:NEEDPWD
ECHO ERROR: LGNTPWD ist nicht gesetzt.
ECHO Fuer den automatischen REMOVE/NOPASSUSER-Test zuerst setzen, z.B.:
ECHO SET LGNTPWD=dein-supervisor-passwort
ECHO Danach starten:
ECHO F:\RMVSTA
ECHO Es wurde kein DLYSTRT installiert und kein Test gestartet.
:END

26
test/remove/RMVZIP.BAT Normal file
View File

@@ -0,0 +1,26 @@
@ECHO OFF
REM RMVZIP.BAT
REM Optional packer for RMVSTA result files.
REM Requires ZIP.EXE in PATH or current directory.
F:
CD \RMVCMP
IF EXIST RMVSTA.ZIP DEL RMVSTA.ZIP
IF EXIST ZIP.LOG DEL ZIP.LOG
ECHO Creating RMVSTA.ZIP > ZIP.LOG
ZIP -r RMVSTA.ZIP RUN.LOG SUMMARY.TXT COMPARE.LOG UCOMP.LOG HELPER.TXT ULOG1.OUT ULOGIN.OUT ULOG2.OUT ULGSUP.OUT OUT PUBOUT SETUP 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 \RMVTEST\NUL DELTREE /Y \RMVTEST >> ZIP.LOG
IF EXIST C:\RMVTMP\NUL DELTREE /Y C:\RMVTMP >> ZIP.LOG
CD \
ECHO.
ECHO ZIP step finished.
ECHO Check:
ECHO F:\RMVCMP\RMVSTA.ZIP
ECHO F:\RMVCMP\ZIP.LOG
ECHO.

55
test/renmove/README.md Normal file
View File

@@ -0,0 +1,55 @@
# Rename / move / delete tests
Automated DOS-command baseline over the NetWare redirector.
## Run
```text
RMTSTA
```
Results:
```text
F:\RCMP\RUN.LOG
F:\RCMP\SUMMARY.TXT
F:\RCMP\PRE\*.OUT
F:\RCMP\POST\*.OUT
F:\RCMP\CMP\*.OUT
```
Optional pack:
```text
RMTZIP
```
Upload:
```text
F:\RCMP\RMTSTA.ZIP
```
Then on Linux package with server log:
```sh
sudo ./mars_packtest_v3.sh rmtsta 5 mario
```
## Coverage
- file rename in same directory using `REN`
- expected failure: rename to existing target
- move-like file operation via copy+delete across directories
- directory rename using `MOVE`
- file delete
- empty directory remove
- expected failure: remove non-empty directory
## Syntax note
This client rejects directory rename with `REN`, but accepts directory rename with:
```text
MOVE olddir newdir
```

188
test/renmove/RMTSTA.BAT Normal file
View File

@@ -0,0 +1,188 @@
@ECHO OFF
REM RMTSTA.BAT
REM Automated file/directory rename, move, delete baseline for MARS NWE.
REM
REM Uses DOS commands over the NetWare redirector:
REM MD, REN, MOVE, COPY, DEL, RD
REM
REM Notes:
REM - File rename uses REN.
REM - Directory rename uses MOVE, because this client rejects REN on dirs.
REM - Some DOS/Novell messages may still appear on screen even when
REM stdout is redirected. Result files are in F:\RCMP.
REM
REM Results:
REM F:\RCMP\RUN.LOG
REM F:\RCMP\SUMMARY.TXT
REM F:\RCMP\PRE\*.OUT
REM F:\RCMP\POST\*.OUT
REM F:\RCMP\CMP\*.OUT
F:
CD \
REM --- Clean generated test/result directories (contents only). ---
IF EXIST RMTTEST\NUL DELTREE /Y RMTTEST\*.*
IF EXIST RMTCMP\NUL DELTREE /Y RMTCMP\*.*
REM --- Directory setup ---
IF NOT EXIST TRMOVE\NUL MD TRMOVE
IF NOT EXIST TRMOVE\SRC\NUL MD TRMOVE\SRC
IF NOT EXIST TRMOVE\SRC\SUB\NUL MD TRMOVE\SRC\SUB
IF NOT EXIST TRMOVE\DST\NUL MD TRMOVE\DST
IF NOT EXIST TRMOVE\DFILE\NUL MD TRMOVE\DFILE
IF NOT EXIST TRMOVE\NEMPTY\NUL MD TRMOVE\NEMPTY
IF NOT EXIST RCMP\NUL MD RCMP
IF NOT EXIST RCMP\PRE\NUL MD RCMP\PRE
IF NOT EXIST RCMP\POST\NUL MD RCMP\POST
IF NOT EXIST RCMP\CMP\NUL MD RCMP\CMP
REM --- Clean result files ---
IF EXIST F:\RCMP\RUN.LOG DEL F:\RCMP\RUN.LOG
IF EXIST F:\RCMP\SUMMARY.TXT DEL F:\RCMP\SUMMARY.TXT
IF EXIST F:\RCMP\ZIP.LOG DEL F:\RCMP\ZIP.LOG
IF EXIST F:\RCMP\RMTSTA.ZIP DEL F:\RCMP\RMTSTA.ZIP
IF EXIST F:\RCMP\PRE\ROOT.OUT DEL F:\RCMP\PRE\ROOT.OUT
IF EXIST F:\RCMP\PRE\SRC.OUT DEL F:\RCMP\PRE\SRC.OUT
IF EXIST F:\RCMP\PRE\SUB.OUT DEL F:\RCMP\PRE\SUB.OUT
IF EXIST F:\RCMP\PRE\DST.OUT DEL F:\RCMP\PRE\DST.OUT
IF EXIST F:\RCMP\PRE\DFILE.OUT DEL F:\RCMP\PRE\DFILE.OUT
IF EXIST F:\RCMP\PRE\DATES.OUT DEL F:\RCMP\PRE\DATES.OUT
IF EXIST F:\RCMP\POST\ROOT.OUT DEL F:\RCMP\POST\ROOT.OUT
IF EXIST F:\RCMP\POST\SRC.OUT DEL F:\RCMP\POST\SRC.OUT
IF EXIST F:\RCMP\POST\SUB.OUT DEL F:\RCMP\POST\SUB.OUT
IF EXIST F:\RCMP\POST\DST.OUT DEL F:\RCMP\POST\DST.OUT
IF EXIST F:\RCMP\POST\DFILE.OUT DEL F:\RCMP\POST\DFILE.OUT
IF EXIST F:\RCMP\POST\NEMPTY.OUT DEL F:\RCMP\POST\NEMPTY.OUT
IF EXIST F:\RCMP\POST\DATES.OUT DEL F:\RCMP\POST\DATES.OUT
IF EXIST F:\RCMP\POST\A2.OUT DEL F:\RCMP\POST\A2.OUT
IF EXIST F:\RCMP\POST\MOVEDB.OUT DEL F:\RCMP\POST\MOVEDB.OUT
IF EXIST F:\RCMP\CMP\ROOT.OUT DEL F:\RCMP\CMP\ROOT.OUT
IF EXIST F:\RCMP\CMP\SRC.OUT DEL F:\RCMP\CMP\SRC.OUT
IF EXIST F:\RCMP\CMP\SUB.OUT DEL F:\RCMP\CMP\SUB.OUT
IF EXIST F:\RCMP\CMP\DST.OUT DEL F:\RCMP\CMP\DST.OUT
IF EXIST F:\RCMP\CMP\DFILE.OUT DEL F:\RCMP\CMP\DFILE.OUT
IF EXIST F:\RCMP\CMP\DATES.OUT DEL F:\RCMP\CMP\DATES.OUT
ECHO RMTSTA automated rename/move/delete test > F:\RCMP\RUN.LOG
ECHO Date/time stamp skipped to avoid DOS prompt. >> F:\RCMP\RUN.LOG
ECHO. >> F:\RCMP\RUN.LOG
ECHO === RESET TEST TREE === >> F:\RCMP\RUN.LOG
REM Delete old files individually if present.
IF EXIST F:\TRMOVE\SRC\A.TXT DEL F:\TRMOVE\SRC\A.TXT
IF EXIST F:\TRMOVE\SRC\A2.TXT DEL F:\TRMOVE\SRC\A2.TXT
IF EXIST F:\TRMOVE\SRC\EXIST.TXT DEL F:\TRMOVE\SRC\EXIST.TXT
IF EXIST F:\TRMOVE\SRC\SUB\B.TXT DEL F:\TRMOVE\SRC\SUB\B.TXT
IF EXIST F:\TRMOVE\DST\B.TXT DEL F:\TRMOVE\DST\B.TXT
IF EXIST F:\TRMOVE\DST\C.TXT DEL F:\TRMOVE\DST\C.TXT
IF EXIST F:\TRMOVE\DST\DELME.TXT DEL F:\TRMOVE\DST\DELME.TXT
IF EXIST F:\TRMOVE\DFILE\A.TXT DEL F:\TRMOVE\DFILE\A.TXT
IF EXIST F:\TRMOVE\DFILE\B.TXT DEL F:\TRMOVE\DFILE\B.TXT
IF EXIST F:\TRMOVE\DFILE\KEEP.TXT DEL F:\TRMOVE\DFILE\KEEP.TXT
IF EXIST F:\TRMOVE\DMOVE\A.TXT DEL F:\TRMOVE\DMOVE\A.TXT
IF EXIST F:\TRMOVE\DMOVE\B.TXT DEL F:\TRMOVE\DMOVE\B.TXT
IF EXIST F:\TRMOVE\DMOVE\KEEP.TXT DEL F:\TRMOVE\DMOVE\KEEP.TXT
IF EXIST F:\TRMOVE\NEMPTY\KEEP.TXT DEL F:\TRMOVE\NEMPTY\KEEP.TXT
IF EXIST F:\TRMOVE\EMPTY\NUL RD F:\TRMOVE\EMPTY
IF EXIST F:\TRMOVE\DMOVE\NUL RD F:\TRMOVE\DMOVE
IF EXIST F:\TRMOVE\DFILE\NUL RD F:\TRMOVE\DFILE
REM Recreate expected directories.
IF NOT EXIST F:\TRMOVE\SRC\NUL MD F:\TRMOVE\SRC
IF NOT EXIST F:\TRMOVE\SRC\SUB\NUL MD F:\TRMOVE\SRC\SUB
IF NOT EXIST F:\TRMOVE\DST\NUL MD F:\TRMOVE\DST
IF NOT EXIST F:\TRMOVE\DFILE\NUL MD F:\TRMOVE\DFILE
IF NOT EXIST F:\TRMOVE\NEMPTY\NUL MD F:\TRMOVE\NEMPTY
IF NOT EXIST F:\TRMOVE\EMPTY\NUL MD F:\TRMOVE\EMPTY
ECHO FILE A > F:\TRMOVE\SRC\A.TXT
ECHO EXIST TARGET > F:\TRMOVE\SRC\EXIST.TXT
ECHO FILE B > F:\TRMOVE\SRC\SUB\B.TXT
ECHO FILE C > F:\TRMOVE\DST\C.TXT
ECHO DELETE ME > F:\TRMOVE\DST\DELME.TXT
ECHO DIR A > F:\TRMOVE\DFILE\A.TXT
ECHO DIR B > F:\TRMOVE\DFILE\B.TXT
ECHO DIR KEEP > F:\TRMOVE\DFILE\KEEP.TXT
ECHO KEEP > F:\TRMOVE\NEMPTY\KEEP.TXT
NPUBLIC\FLAG F:\TRMOVE\SRC\A.TXT N >> F:\RCMP\RUN.LOG
NPUBLIC\FLAG F:\TRMOVE\SRC\SUB\B.TXT N >> F:\RCMP\RUN.LOG
NPUBLIC\FLAG F:\TRMOVE\DST\C.TXT N >> F:\RCMP\RUN.LOG
NPUBLIC\FLAG F:\TRMOVE\DST\DELME.TXT N >> F:\RCMP\RUN.LOG
NPUBLIC\FLAG F:\TRMOVE\DFILE\A.TXT N >> F:\RCMP\RUN.LOG
NPUBLIC\FLAG F:\TRMOVE\DFILE\B.TXT N >> F:\RCMP\RUN.LOG
NPUBLIC\FLAG F:\TRMOVE\DFILE\KEEP.TXT N >> F:\RCMP\RUN.LOG
ECHO === PRE CAPTURE === >> F:\RCMP\RUN.LOG
NPUBLIC\NDIR F:\TRMOVE > F:\RCMP\PRE\ROOT.OUT
NPUBLIC\NDIR F:\TRMOVE\SRC > F:\RCMP\PRE\SRC.OUT
NPUBLIC\NDIR F:\TRMOVE\SRC\SUB > F:\RCMP\PRE\SUB.OUT
NPUBLIC\NDIR F:\TRMOVE\DST > F:\RCMP\PRE\DST.OUT
NPUBLIC\NDIR F:\TRMOVE\DFILE > F:\RCMP\PRE\DFILE.OUT
NPUBLIC\NDIR F:\TRMOVE /DATES > F:\RCMP\PRE\DATES.OUT
ECHO === TEST 01: rename file in same directory === >> F:\RCMP\RUN.LOG
REN F:\TRMOVE\SRC\A.TXT A2.TXT >> F:\RCMP\RUN.LOG
ECHO === TEST 02: expected failure rename to existing target === >> F:\RCMP\RUN.LOG
REN F:\TRMOVE\SRC\A2.TXT EXIST.TXT >> F:\RCMP\RUN.LOG
ECHO === TEST 03: move-like file operation via COPY+DEL across directories === >> F:\RCMP\RUN.LOG
COPY F:\TRMOVE\SRC\SUB\B.TXT F:\TRMOVE\DST\B.TXT >> F:\RCMP\RUN.LOG
DEL F:\TRMOVE\SRC\SUB\B.TXT >> F:\RCMP\RUN.LOG
ECHO === TEST 04: directory rename via MOVE === >> F:\RCMP\RUN.LOG
MOVE F:\TRMOVE\DFILE F:\TRMOVE\DMOVE >> F:\RCMP\RUN.LOG
ECHO === TEST 05: delete file === >> F:\RCMP\RUN.LOG
DEL F:\TRMOVE\DST\DELME.TXT >> F:\RCMP\RUN.LOG
ECHO === TEST 06: remove empty directory === >> F:\RCMP\RUN.LOG
RD F:\TRMOVE\EMPTY >> F:\RCMP\RUN.LOG
ECHO === TEST 07: expected failure remove non-empty directory === >> F:\RCMP\RUN.LOG
RD F:\TRMOVE\NEMPTY >> F:\RCMP\RUN.LOG
ECHO === POST CAPTURE === >> F:\RCMP\RUN.LOG
NPUBLIC\NDIR F:\TRMOVE > F:\RCMP\POST\ROOT.OUT
NPUBLIC\NDIR F:\TRMOVE\SRC > F:\RCMP\POST\SRC.OUT
NPUBLIC\NDIR F:\TRMOVE\SRC\SUB > F:\RCMP\POST\SUB.OUT
NPUBLIC\NDIR F:\TRMOVE\DST > F:\RCMP\POST\DST.OUT
NPUBLIC\NDIR F:\TRMOVE\DMOVE > F:\RCMP\POST\DFILE.OUT
NPUBLIC\NDIR F:\TRMOVE\NEMPTY > F:\RCMP\POST\NEMPTY.OUT
NPUBLIC\NDIR F:\TRMOVE /DATES > F:\RCMP\POST\DATES.OUT
ECHO === COMPARE === >> F:\RCMP\RUN.LOG
FC F:\RCMP\PRE\ROOT.OUT F:\RCMP\POST\ROOT.OUT > F:\RCMP\CMP\ROOT.OUT
FC F:\RCMP\PRE\SRC.OUT F:\RCMP\POST\SRC.OUT > F:\RCMP\CMP\SRC.OUT
FC F:\RCMP\PRE\SUB.OUT F:\RCMP\POST\SUB.OUT > F:\RCMP\CMP\SUB.OUT
FC F:\RCMP\PRE\DST.OUT F:\RCMP\POST\DST.OUT > F:\RCMP\CMP\DST.OUT
FC F:\RCMP\PRE\DFILE.OUT F:\RCMP\POST\DFILE.OUT > F:\RCMP\CMP\DFILE.OUT
FC F:\RCMP\PRE\DATES.OUT F:\RCMP\POST\DATES.OUT > F:\RCMP\CMP\DATES.OUT
ECHO === DETAILED POST READBACK === >> F:\RCMP\RUN.LOG
NPUBLIC\NDIR F:\TRMOVE\SRC\A2.TXT > F:\RCMP\POST\A2.OUT
NPUBLIC\NDIR F:\TRMOVE\DST\B.TXT > F:\RCMP\POST\MOVEDB.OUT
ECHO === SUMMARY === > F:\RCMP\SUMMARY.TXT
ECHO RMTSTA automated rename/move/delete test finished. >> F:\RCMP\SUMMARY.TXT
ECHO. >> F:\RCMP\SUMMARY.TXT
ECHO Expected final state: >> F:\RCMP\SUMMARY.TXT
ECHO - SRC contains A2.TXT and EXIST.TXT. >> F:\RCMP\SUMMARY.TXT
ECHO - SRC\SUB no longer contains B.TXT. >> F:\RCMP\SUMMARY.TXT
ECHO - DST contains B.TXT and C.TXT, but not DELME.TXT. >> F:\RCMP\SUMMARY.TXT
ECHO - DFILE was renamed/moved to DMOVE via MOVE. >> F:\RCMP\SUMMARY.TXT
ECHO - EMPTY was removed. >> F:\RCMP\SUMMARY.TXT
ECHO - NEMPTY should still exist because RD non-empty should fail. >> F:\RCMP\SUMMARY.TXT
ECHO - Rename A2.TXT to EXIST.TXT is expected to fail. >> F:\RCMP\SUMMARY.TXT
ECHO. >> F:\RCMP\SUMMARY.TXT
ECHO Optional pack results with RMTZIP.BAT. >> F:\RCMP\SUMMARY.TXT
ECHO.
ECHO RMTSTA fertig.
ECHO Ergebnisse liegen in F:\RCMP
ECHO Optional: RMTZIP ausfuehren.
ECHO.

28
test/renmove/RMTZIP.BAT Normal file
View File

@@ -0,0 +1,28 @@
@ECHO OFF
REM RMTZIP.BAT
REM Optional packer for RMTSTA result files.
REM Requires ZIP.EXE in PATH or current directory.
F:
CD \RCMP
IF EXIST RMTSTA.ZIP DEL RMTSTA.ZIP
IF EXIST ZIP.LOG DEL ZIP.LOG
ECHO Creating RMTSTA.ZIP > ZIP.LOG
ZIP -r RMTSTA.ZIP RUN.LOG SUMMARY.TXT PRE POST CMP >> 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 \TRMOVE\NUL DELTREE /Y \TRMOVE >> ZIP.LOG
IF EXIST \RMTTEST\NUL DELTREE /Y \RMTTEST >> ZIP.LOG
IF EXIST \DFILE\NUL DELTREE /Y \DFILE >> ZIP.LOG
CD \
ECHO.
ECHO ZIP step finished.
ECHO Check:
ECHO F:\RCMP\RMTSTA.ZIP
ECHO F:\RCMP\ZIP.LOG
ECHO.

32
test/revoke/README.md Normal file
View File

@@ -0,0 +1,32 @@
# REVOKE comparison test
`RVKSTA.BAT` creates `F:\RVKTEST` and compares Novell `\NPUBLIC\REVOKE` output with the public implementation `\PUBLIC\REVOKE`.
Result tree:
- `F:\RVKCMP\OUT` - Novell baseline output
- `F:\RVKCMP\PUBOUT` - public implementation output
- `F:\RVKCMP\COMPARE.LOG` - direct `FC` comparisons
- `F:\RVKCMP\UNOV` - user-context Novell `RIGHTS` readback
- `F:\RVKCMP\UPUB` - user-context public `RIGHTS` readback
- `F:\RVKCMP\UCOMP.LOG` - user-context `FC` comparisons
The direct matrix covers:
- individual right removal: `R`, `W`, `C`, `E`, `M`, `F`, `A`, `S`
- mixed rights removal such as `R F`, `R W C`, `E M F`, `S W C M`
- `ALL` removal, which should delete the trustee entry
- file-specific mode with `/FILES`
- recursive directory mode with `/SUBDIRECTORIES`
- missing trustee, missing user, missing path, invalid right, bad grammar, and `/FILES /SUBDIRECTORIES`
Automatic user-context readback requires:
```bat
SET LGNTPWD=your-supervisor-password
F:\RVKSTA
```
`RVKC.BAT` is queued via `DLYSTRT`, logs in as `NOPASSUSER`, captures `RIGHTS` output for the matrix cases, logs SUPERVISOR back in, and then starts `RVKSTA PART2` to copy and compare the user-context results.
`RVKZIP.BAT` packs the result tree and cleans `F:\RVKTEST` and `C:\RVKTMP`.

168
test/revoke/RVKC.BAT Normal file
View File

@@ -0,0 +1,168 @@
@ECHO OFF
REM RVKC.BAT - delayed user-context REVOKE readback helper.
REM Started by RVKSTA via DLYSTRT. Runs from C:\RVKTMP.
C:
CD \RVKTMP
ECHO RVKC user-context REVOKE readback helper > HELPER.TXT
ECHO Current phase: logout supervisor, login NOPASSUSER. >> HELPER.TXT
LOGOUT > ULOG1.OUT
LOGIN NOPASSUSER > ULOGIN.OUT
IF NOT EXIST UNOV MD UNOV
IF NOT EXIST UPUB MD UPUB
F:
CD \
IF EXIST \NPUBLIC\RIGHTS.EXE GOTO HAVEF
ECHO F: not ready after NOPASSUSER login. >> C:\RVKTMP\HELPER.TXT
GOTO RELSUP
:HAVEF
ECHO Starting G10_R as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\G10 > C:\RVKTMP\UNOV\G10_R.OUT
\PUBLIC\RIGHTS F:\RVKTEST\G10 > C:\RVKTMP\UPUB\G10_R.OUT
ECHO Starting G11_W as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\G11 > C:\RVKTMP\UNOV\G11_W.OUT
\PUBLIC\RIGHTS F:\RVKTEST\G11 > C:\RVKTMP\UPUB\G11_W.OUT
ECHO Starting G12_C as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\G12 > C:\RVKTMP\UNOV\G12_C.OUT
\PUBLIC\RIGHTS F:\RVKTEST\G12 > C:\RVKTMP\UPUB\G12_C.OUT
ECHO Starting G13_E as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\G13 > C:\RVKTMP\UNOV\G13_E.OUT
\PUBLIC\RIGHTS F:\RVKTEST\G13 > C:\RVKTMP\UPUB\G13_E.OUT
ECHO Starting G14_M as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\G14 > C:\RVKTMP\UNOV\G14_M.OUT
\PUBLIC\RIGHTS F:\RVKTEST\G14 > C:\RVKTMP\UPUB\G14_M.OUT
ECHO Starting G15_F as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\G15 > C:\RVKTMP\UNOV\G15_F.OUT
\PUBLIC\RIGHTS F:\RVKTEST\G15 > C:\RVKTMP\UPUB\G15_F.OUT
ECHO Starting G16_A as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\G16 > C:\RVKTMP\UNOV\G16_A.OUT
\PUBLIC\RIGHTS F:\RVKTEST\G16 > C:\RVKTMP\UPUB\G16_A.OUT
ECHO Starting G17_S as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\G17 > C:\RVKTMP\UNOV\G17_S.OUT
\PUBLIC\RIGHTS F:\RVKTEST\G17 > C:\RVKTMP\UPUB\G17_S.OUT
ECHO Starting G20_RF as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\G20 > C:\RVKTMP\UNOV\G20_RF.OUT
\PUBLIC\RIGHTS F:\RVKTEST\G20 > C:\RVKTMP\UPUB\G20_RF.OUT
ECHO Starting G21_RW as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\G21 > C:\RVKTMP\UNOV\G21_RW.OUT
\PUBLIC\RIGHTS F:\RVKTEST\G21 > C:\RVKTMP\UPUB\G21_RW.OUT
ECHO Starting G22_RWC as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\G22 > C:\RVKTMP\UNOV\G22_RWC.OUT
\PUBLIC\RIGHTS F:\RVKTEST\G22 > C:\RVKTMP\UPUB\G22_RWC.OUT
ECHO Starting G23_RWCE as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\G23 > C:\RVKTMP\UNOV\G23_RWCE.OUT
\PUBLIC\RIGHTS F:\RVKTEST\G23 > C:\RVKTMP\UPUB\G23_RWCE.OUT
ECHO Starting G24_EMF as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\G24 > C:\RVKTMP\UNOV\G24_EMF.OUT
\PUBLIC\RIGHTS F:\RVKTEST\G24 > C:\RVKTMP\UPUB\G24_EMF.OUT
ECHO Starting G25_SAL as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\G25 > C:\RVKTMP\UNOV\G25_SAL.OUT
\PUBLIC\RIGHTS F:\RVKTEST\G25 > C:\RVKTMP\UPUB\G25_SAL.OUT
ECHO Starting G26_ALL as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\G26 > C:\RVKTMP\UNOV\G26_ALL.OUT
\PUBLIC\RIGHTS F:\RVKTEST\G26 > C:\RVKTMP\UPUB\G26_ALL.OUT
ECHO Starting G30_RE as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\G30 > C:\RVKTMP\UNOV\G30_RE.OUT
\PUBLIC\RIGHTS F:\RVKTEST\G30 > C:\RVKTMP\UPUB\G30_RE.OUT
ECHO Starting G31_RWF as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\G31 > C:\RVKTMP\UNOV\G31_RWF.OUT
\PUBLIC\RIGHTS F:\RVKTEST\G31 > C:\RVKTMP\UPUB\G31_RWF.OUT
ECHO Starting G32_RCM as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\G32 > C:\RVKTMP\UNOV\G32_RCM.OUT
\PUBLIC\RIGHTS F:\RVKTEST\G32 > C:\RVKTMP\UPUB\G32_RCM.OUT
ECHO Starting G33_RFA as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\G33 > C:\RVKTMP\UNOV\G33_RFA.OUT
\PUBLIC\RIGHTS F:\RVKTEST\G33 > C:\RVKTMP\UPUB\G33_RFA.OUT
ECHO Starting G34_WCM as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\G34 > C:\RVKTMP\UNOV\G34_WCM.OUT
\PUBLIC\RIGHTS F:\RVKTEST\G34 > C:\RVKTMP\UPUB\G34_WCM.OUT
ECHO Starting G35_EMF as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\G35 > C:\RVKTMP\UNOV\G35_EMF.OUT
\PUBLIC\RIGHTS F:\RVKTEST\G35 > C:\RVKTMP\UPUB\G35_EMF.OUT
ECHO Starting G36_RMF as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\G36 > C:\RVKTMP\UNOV\G36_RMF.OUT
\PUBLIC\RIGHTS F:\RVKTEST\G36 > C:\RVKTMP\UPUB\G36_RMF.OUT
ECHO Starting G37_REMA as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\G37 > C:\RVKTMP\UNOV\G37_REMA.OUT
\PUBLIC\RIGHTS F:\RVKTEST\G37 > C:\RVKTMP\UPUB\G37_REMA.OUT
ECHO Starting G38_SR as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\G38 > C:\RVKTMP\UNOV\G38_SR.OUT
\PUBLIC\RIGHTS F:\RVKTEST\G38 > C:\RVKTMP\UPUB\G38_SR.OUT
ECHO Starting G39_SRF as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\G39 > C:\RVKTMP\UNOV\G39_SRF.OUT
\PUBLIC\RIGHTS F:\RVKTEST\G39 > C:\RVKTMP\UPUB\G39_SRF.OUT
ECHO Starting G40_SWCM as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\G40 > C:\RVKTMP\UNOV\G40_SWCM.OUT
\PUBLIC\RIGHTS F:\RVKTEST\G40 > C:\RVKTMP\UPUB\G40_SWCM.OUT
ECHO Starting F10_R as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\F10\T.TXT > C:\RVKTMP\UNOV\F10_R.OUT
\PUBLIC\RIGHTS F:\RVKTEST\F10\T.TXT > C:\RVKTMP\UPUB\F10_R.OUT
ECHO Starting F11_RF as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\F11\T.TXT > C:\RVKTMP\UNOV\F11_RF.OUT
\PUBLIC\RIGHTS F:\RVKTEST\F11\T.TXT > C:\RVKTMP\UPUB\F11_RF.OUT
ECHO Starting F12_RAL as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\F12\T.TXT > C:\RVKTMP\UNOV\F12_RAL.OUT
\PUBLIC\RIGHTS F:\RVKTEST\F12\T.TXT > C:\RVKTMP\UPUB\F12_RAL.OUT
ECHO Starting F13_ALL as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\F13\T.TXT > C:\RVKTMP\UNOV\F13_ALL.OUT
\PUBLIC\RIGHTS F:\RVKTEST\F13\T.TXT > C:\RVKTMP\UPUB\F13_ALL.OUT
ECHO Starting F14_N as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\F14\T.TXT > C:\RVKTMP\UNOV\F14_N.OUT
\PUBLIC\RIGHTS F:\RVKTEST\F14\T.TXT > C:\RVKTMP\UPUB\F14_N.OUT
ECHO Starting F15_S as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\F15\T.TXT > C:\RVKTMP\UNOV\F15_S.OUT
\PUBLIC\RIGHTS F:\RVKTEST\F15\T.TXT > C:\RVKTMP\UPUB\F15_S.OUT
ECHO Starting F16_SAL as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\F16\T.TXT > C:\RVKTMP\UNOV\F16_SAL.OUT
\PUBLIC\RIGHTS F:\RVKTEST\F16\T.TXT > C:\RVKTMP\UPUB\F16_SAL.OUT
ECHO Starting S10_R as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\S10\S1 > C:\RVKTMP\UNOV\S10_R.OUT
\PUBLIC\RIGHTS F:\RVKTEST\S10\S1 > C:\RVKTMP\UPUB\S10_R.OUT
ECHO Starting S11_RWC as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\S11\S1 > C:\RVKTMP\UNOV\S11_RWC.OUT
\PUBLIC\RIGHTS F:\RVKTEST\S11\S1 > C:\RVKTMP\UPUB\S11_RWC.OUT
ECHO Starting S12_ALL as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\S12\S1 > C:\RVKTMP\UNOV\S12_ALL.OUT
\PUBLIC\RIGHTS F:\RVKTEST\S12\S1 > C:\RVKTMP\UPUB\S12_ALL.OUT
ECHO Starting S13_SAL as NOPASSUSER... >> C:\RVKTMP\HELPER.TXT
\NPUBLIC\RIGHTS F:\RVKTEST\S13\S1 > C:\RVKTMP\UNOV\S13_SAL.OUT
\PUBLIC\RIGHTS F:\RVKTEST\S13\S1 > C:\RVKTMP\UPUB\S13_SAL.OUT
:RELSUP
C:
CD \RVKTMP
LOGOUT > ULOG2.OUT
F:
CD \
IF EXIST \LOGIN\LOGIN.EXE GOTO HAVELOG
ECHO F:\LOGIN\LOGIN.EXE not found. >> C:\RVKTMP\HELPER.TXT
GOTO MANUAL
:HAVELOG
F:\LOGIN\LOGIN SUPERVISOR /PWD:%LGNTPWD% > C:\RVKTMP\ULGSUP.OUT
F:
CD \
IF EXIST \RVKSTA.BAT GOTO QUEUEP2
ECHO F: not restored or \RVKSTA.BAT missing. >> C:\RVKTMP\HELPER.TXT
GOTO MANUAL
:QUEUEP2
C:
CD \RVKTMP
DLYSTRT /T:2 F:\RVKSTA.BAT PART2
GOTO END
:MANUAL
ECHO Please run manually after SUPERVISOR login: >> C:\RVKTMP\HELPER.TXT
ECHO F: >> C:\RVKTMP\HELPER.TXT
ECHO CD \ >> C:\RVKTMP\HELPER.TXT
ECHO RVKSTA PART2 >> C:\RVKTMP\HELPER.TXT
:END

698
test/revoke/RVKSTA.BAT Normal file
View File

@@ -0,0 +1,698 @@
@ECHO OFF
REM RVKSTA.BAT
REM Automated REVOKE comparison test for MARS NWE.
REM
REM Direct mode:
REM OUT = Novell baseline using \NPUBLIC\REVOKE
REM PUBOUT = our implementation using \PUBLIC\REVOKE
REM
REM User-context mode:
REM REVOKE runs as SUPERVISOR against NOPASSUSER.
REM DLYSTRT starts C:\RVKTMP\RVKC.BAT after this script exits.
REM RVKC logs in as NOPASSUSER and compares effective RIGHTS readback.
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: RVKSTA [PART2]
GOTO END
:PART1
F:
CD \
REM --- Clean generated test/result directories. ---
IF EXIST RVKTEST\*.* DELTREE /Y RVKTEST
IF EXIST RVKCMP\*.* DELTREE /Y RVKCMP
IF EXIST C:\RVKTMP\*.* DELTREE /Y C:\RVKTMP
IF NOT EXIST RVKTEST MD RVKTEST
IF NOT EXIST RVKTEST\G10 MD RVKTEST\G10
ECHO G10_R > F:\RVKTEST\G10\TEST.TXT
IF NOT EXIST RVKTEST\G11 MD RVKTEST\G11
ECHO G11_W > F:\RVKTEST\G11\TEST.TXT
IF NOT EXIST RVKTEST\G12 MD RVKTEST\G12
ECHO G12_C > F:\RVKTEST\G12\TEST.TXT
IF NOT EXIST RVKTEST\G13 MD RVKTEST\G13
ECHO G13_E > F:\RVKTEST\G13\TEST.TXT
IF NOT EXIST RVKTEST\G14 MD RVKTEST\G14
ECHO G14_M > F:\RVKTEST\G14\TEST.TXT
IF NOT EXIST RVKTEST\G15 MD RVKTEST\G15
ECHO G15_F > F:\RVKTEST\G15\TEST.TXT
IF NOT EXIST RVKTEST\G16 MD RVKTEST\G16
ECHO G16_A > F:\RVKTEST\G16\TEST.TXT
IF NOT EXIST RVKTEST\G17 MD RVKTEST\G17
ECHO G17_S > F:\RVKTEST\G17\TEST.TXT
IF NOT EXIST RVKTEST\G20 MD RVKTEST\G20
ECHO G20_RF > F:\RVKTEST\G20\TEST.TXT
IF NOT EXIST RVKTEST\G21 MD RVKTEST\G21
ECHO G21_RW > F:\RVKTEST\G21\TEST.TXT
IF NOT EXIST RVKTEST\G22 MD RVKTEST\G22
ECHO G22_RWC > F:\RVKTEST\G22\TEST.TXT
IF NOT EXIST RVKTEST\G23 MD RVKTEST\G23
ECHO G23_RWCE > F:\RVKTEST\G23\TEST.TXT
IF NOT EXIST RVKTEST\G24 MD RVKTEST\G24
ECHO G24_EMF > F:\RVKTEST\G24\TEST.TXT
IF NOT EXIST RVKTEST\G25 MD RVKTEST\G25
ECHO G25_SAL > F:\RVKTEST\G25\TEST.TXT
IF NOT EXIST RVKTEST\G26 MD RVKTEST\G26
ECHO G26_ALL > F:\RVKTEST\G26\TEST.TXT
IF NOT EXIST RVKTEST\G30 MD RVKTEST\G30
ECHO G30_RE > F:\RVKTEST\G30\TEST.TXT
IF NOT EXIST RVKTEST\G31 MD RVKTEST\G31
ECHO G31_RWF > F:\RVKTEST\G31\TEST.TXT
IF NOT EXIST RVKTEST\G32 MD RVKTEST\G32
ECHO G32_RCM > F:\RVKTEST\G32\TEST.TXT
IF NOT EXIST RVKTEST\G33 MD RVKTEST\G33
ECHO G33_RFA > F:\RVKTEST\G33\TEST.TXT
IF NOT EXIST RVKTEST\G34 MD RVKTEST\G34
ECHO G34_WCM > F:\RVKTEST\G34\TEST.TXT
IF NOT EXIST RVKTEST\G35 MD RVKTEST\G35
ECHO G35_EMF > F:\RVKTEST\G35\TEST.TXT
IF NOT EXIST RVKTEST\G36 MD RVKTEST\G36
ECHO G36_RMF > F:\RVKTEST\G36\TEST.TXT
IF NOT EXIST RVKTEST\G37 MD RVKTEST\G37
ECHO G37_REMA > F:\RVKTEST\G37\TEST.TXT
IF NOT EXIST RVKTEST\G38 MD RVKTEST\G38
ECHO G38_SR > F:\RVKTEST\G38\TEST.TXT
IF NOT EXIST RVKTEST\G39 MD RVKTEST\G39
ECHO G39_SRF > F:\RVKTEST\G39\TEST.TXT
IF NOT EXIST RVKTEST\G40 MD RVKTEST\G40
ECHO G40_SWCM > F:\RVKTEST\G40\TEST.TXT
IF NOT EXIST RVKTEST\F10 MD RVKTEST\F10
ECHO F10_R > F:\RVKTEST\F10\T.TXT
IF NOT EXIST RVKTEST\F11 MD RVKTEST\F11
ECHO F11_RF > F:\RVKTEST\F11\T.TXT
IF NOT EXIST RVKTEST\F12 MD RVKTEST\F12
ECHO F12_RAL > F:\RVKTEST\F12\T.TXT
IF NOT EXIST RVKTEST\F13 MD RVKTEST\F13
ECHO F13_ALL > F:\RVKTEST\F13\T.TXT
IF NOT EXIST RVKTEST\F14 MD RVKTEST\F14
ECHO F14_N > F:\RVKTEST\F14\T.TXT
IF NOT EXIST RVKTEST\F15 MD RVKTEST\F15
ECHO F15_S > F:\RVKTEST\F15\T.TXT
IF NOT EXIST RVKTEST\F16 MD RVKTEST\F16
ECHO F16_SAL > F:\RVKTEST\F16\T.TXT
IF NOT EXIST RVKTEST\S10 MD RVKTEST\S10
IF NOT EXIST RVKTEST\S10\S1 MD RVKTEST\S10\S1
IF NOT EXIST RVKTEST\S10\S2 MD RVKTEST\S10\S2
ECHO S10_R root > F:\RVKTEST\S10\ROOT.TXT
ECHO S10_R s1 > F:\RVKTEST\S10\S1\S1.TXT
ECHO S10_R s2 > F:\RVKTEST\S10\S2\S2.TXT
IF NOT EXIST RVKTEST\S11 MD RVKTEST\S11
IF NOT EXIST RVKTEST\S11\S1 MD RVKTEST\S11\S1
IF NOT EXIST RVKTEST\S11\S2 MD RVKTEST\S11\S2
ECHO S11_RWC root > F:\RVKTEST\S11\ROOT.TXT
ECHO S11_RWC s1 > F:\RVKTEST\S11\S1\S1.TXT
ECHO S11_RWC s2 > F:\RVKTEST\S11\S2\S2.TXT
IF NOT EXIST RVKTEST\S12 MD RVKTEST\S12
IF NOT EXIST RVKTEST\S12\S1 MD RVKTEST\S12\S1
IF NOT EXIST RVKTEST\S12\S2 MD RVKTEST\S12\S2
ECHO S12_ALL root > F:\RVKTEST\S12\ROOT.TXT
ECHO S12_ALL s1 > F:\RVKTEST\S12\S1\S1.TXT
ECHO S12_ALL s2 > F:\RVKTEST\S12\S2\S2.TXT
IF NOT EXIST RVKTEST\S13 MD RVKTEST\S13
IF NOT EXIST RVKTEST\S13\S1 MD RVKTEST\S13\S1
IF NOT EXIST RVKTEST\S13\S2 MD RVKTEST\S13\S2
ECHO S13_SAL root > F:\RVKTEST\S13\ROOT.TXT
ECHO S13_SAL s1 > F:\RVKTEST\S13\S1\S1.TXT
ECHO S13_SAL s2 > F:\RVKTEST\S13\S2\S2.TXT
IF NOT EXIST RVKTEST\EMPTY MD RVKTEST\EMPTY
IF NOT EXIST RVKTEST\OPTBOTH MD RVKTEST\OPTBOTH
IF NOT EXIST RVKTEST\OPTBOTH\SUB MD RVKTEST\OPTBOTH\SUB
ECHO E94 root > F:\RVKTEST\OPTBOTH\ROOT.TXT
ECHO E94 sub > F:\RVKTEST\OPTBOTH\SUB\SUB.TXT
IF NOT EXIST RVKCMP MD RVKCMP
IF NOT EXIST RVKCMP\OUT MD RVKCMP\OUT
IF NOT EXIST RVKCMP\PUBOUT MD RVKCMP\PUBOUT
IF NOT EXIST RVKCMP\SETUP MD RVKCMP\SETUP
IF NOT EXIST RVKCMP\UNOV MD RVKCMP\UNOV
IF NOT EXIST RVKCMP\UPUB MD RVKCMP\UPUB
IF NOT EXIST RVKCMP\USETUP MD RVKCMP\USETUP
IF NOT EXIST C:\RVKTMP MD C:\RVKTMP
ECHO RVKSTA REVOKE comparison test > F:\RVKCMP\RUN.LOG
ECHO OUT = Novell baseline with \NPUBLIC\REVOKE >> F:\RVKCMP\RUN.LOG
ECHO PUBOUT = our implementation with \PUBLIC\REVOKE >> F:\RVKCMP\RUN.LOG
ECHO User-context target: NOPASSUSER >> F:\RVKCMP\RUN.LOG
ECHO. >> F:\RVKCMP\RUN.LOG
ECHO Starting D01_HELP...
\NPUBLIC\REVOKE /? > F:\RVKCMP\OUT\D01_HELP.OUT
\PUBLIC\REVOKE /? > F:\RVKCMP\PUBOUT\D01_HELP.OUT
ECHO Starting D02_NOAR...
\NPUBLIC\REVOKE > F:\RVKCMP\OUT\D02_NOAR.OUT
\PUBLIC\REVOKE > F:\RVKCMP\PUBOUT\D02_NOAR.OUT
ECHO Starting G10_R directory revoke R...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G10 > F:\RVKCMP\SETUP\G10_R_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G10 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G10_R_NGRANT.OUT
\NPUBLIC\REVOKE R FOR F:\RVKTEST\G10 FROM USER NOPASSUSER > F:\RVKCMP\OUT\G10_R.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G10 > F:\RVKCMP\SETUP\G10_R_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G10 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G10_R_PGRANT.OUT
\PUBLIC\REVOKE R FOR F:\RVKTEST\G10 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\G10_R.OUT
ECHO Starting G11_W directory revoke W...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G11 > F:\RVKCMP\SETUP\G11_W_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G11 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G11_W_NGRANT.OUT
\NPUBLIC\REVOKE W FOR F:\RVKTEST\G11 FROM USER NOPASSUSER > F:\RVKCMP\OUT\G11_W.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G11 > F:\RVKCMP\SETUP\G11_W_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G11 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G11_W_PGRANT.OUT
\PUBLIC\REVOKE W FOR F:\RVKTEST\G11 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\G11_W.OUT
ECHO Starting G12_C directory revoke C...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G12 > F:\RVKCMP\SETUP\G12_C_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G12 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G12_C_NGRANT.OUT
\NPUBLIC\REVOKE C FOR F:\RVKTEST\G12 FROM USER NOPASSUSER > F:\RVKCMP\OUT\G12_C.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G12 > F:\RVKCMP\SETUP\G12_C_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G12 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G12_C_PGRANT.OUT
\PUBLIC\REVOKE C FOR F:\RVKTEST\G12 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\G12_C.OUT
ECHO Starting G13_E directory revoke E...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G13 > F:\RVKCMP\SETUP\G13_E_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G13 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G13_E_NGRANT.OUT
\NPUBLIC\REVOKE E FOR F:\RVKTEST\G13 FROM USER NOPASSUSER > F:\RVKCMP\OUT\G13_E.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G13 > F:\RVKCMP\SETUP\G13_E_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G13 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G13_E_PGRANT.OUT
\PUBLIC\REVOKE E FOR F:\RVKTEST\G13 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\G13_E.OUT
ECHO Starting G14_M directory revoke M...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G14 > F:\RVKCMP\SETUP\G14_M_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G14 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G14_M_NGRANT.OUT
\NPUBLIC\REVOKE M FOR F:\RVKTEST\G14 FROM USER NOPASSUSER > F:\RVKCMP\OUT\G14_M.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G14 > F:\RVKCMP\SETUP\G14_M_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G14 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G14_M_PGRANT.OUT
\PUBLIC\REVOKE M FOR F:\RVKTEST\G14 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\G14_M.OUT
ECHO Starting G15_F directory revoke F...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G15 > F:\RVKCMP\SETUP\G15_F_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G15 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G15_F_NGRANT.OUT
\NPUBLIC\REVOKE F FOR F:\RVKTEST\G15 FROM USER NOPASSUSER > F:\RVKCMP\OUT\G15_F.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G15 > F:\RVKCMP\SETUP\G15_F_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G15 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G15_F_PGRANT.OUT
\PUBLIC\REVOKE F FOR F:\RVKTEST\G15 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\G15_F.OUT
ECHO Starting G16_A directory revoke A...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G16 > F:\RVKCMP\SETUP\G16_A_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G16 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G16_A_NGRANT.OUT
\NPUBLIC\REVOKE A FOR F:\RVKTEST\G16 FROM USER NOPASSUSER > F:\RVKCMP\OUT\G16_A.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G16 > F:\RVKCMP\SETUP\G16_A_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G16 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G16_A_PGRANT.OUT
\PUBLIC\REVOKE A FOR F:\RVKTEST\G16 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\G16_A.OUT
ECHO Starting G17_S directory revoke S...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G17 > F:\RVKCMP\SETUP\G17_S_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G17 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G17_S_NGRANT.OUT
\NPUBLIC\REVOKE S FOR F:\RVKTEST\G17 FROM USER NOPASSUSER > F:\RVKCMP\OUT\G17_S.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G17 > F:\RVKCMP\SETUP\G17_S_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G17 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G17_S_PGRANT.OUT
\PUBLIC\REVOKE S FOR F:\RVKTEST\G17 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\G17_S.OUT
ECHO Starting G20_RF directory revoke R F...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G20 > F:\RVKCMP\SETUP\G20_RF_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G20 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G20_RF_NGRANT.OUT
\NPUBLIC\REVOKE R F FOR F:\RVKTEST\G20 FROM USER NOPASSUSER > F:\RVKCMP\OUT\G20_RF.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G20 > F:\RVKCMP\SETUP\G20_RF_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G20 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G20_RF_PGRANT.OUT
\PUBLIC\REVOKE R F FOR F:\RVKTEST\G20 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\G20_RF.OUT
ECHO Starting G21_RW directory revoke R W...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G21 > F:\RVKCMP\SETUP\G21_RW_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G21 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G21_RW_NGRANT.OUT
\NPUBLIC\REVOKE R W FOR F:\RVKTEST\G21 FROM USER NOPASSUSER > F:\RVKCMP\OUT\G21_RW.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G21 > F:\RVKCMP\SETUP\G21_RW_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G21 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G21_RW_PGRANT.OUT
\PUBLIC\REVOKE R W FOR F:\RVKTEST\G21 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\G21_RW.OUT
ECHO Starting G22_RWC directory revoke R W C...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G22 > F:\RVKCMP\SETUP\G22_RWC_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G22 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G22_RWC_NGRANT.OUT
\NPUBLIC\REVOKE R W C FOR F:\RVKTEST\G22 FROM USER NOPASSUSER > F:\RVKCMP\OUT\G22_RWC.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G22 > F:\RVKCMP\SETUP\G22_RWC_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G22 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G22_RWC_PGRANT.OUT
\PUBLIC\REVOKE R W C FOR F:\RVKTEST\G22 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\G22_RWC.OUT
ECHO Starting G23_RWCE directory revoke R W C E...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G23 > F:\RVKCMP\SETUP\G23_RWCE_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G23 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G23_RWCE_NGRANT.OUT
\NPUBLIC\REVOKE R W C E FOR F:\RVKTEST\G23 FROM USER NOPASSUSER > F:\RVKCMP\OUT\G23_RWCE.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G23 > F:\RVKCMP\SETUP\G23_RWCE_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G23 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G23_RWCE_PGRANT.OUT
\PUBLIC\REVOKE R W C E FOR F:\RVKTEST\G23 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\G23_RWCE.OUT
ECHO Starting G24_EMF directory revoke E M F...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G24 > F:\RVKCMP\SETUP\G24_EMF_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G24 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G24_EMF_NGRANT.OUT
\NPUBLIC\REVOKE E M F FOR F:\RVKTEST\G24 FROM USER NOPASSUSER > F:\RVKCMP\OUT\G24_EMF.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G24 > F:\RVKCMP\SETUP\G24_EMF_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G24 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G24_EMF_PGRANT.OUT
\PUBLIC\REVOKE E M F FOR F:\RVKTEST\G24 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\G24_EMF.OUT
ECHO Starting G25_SAL directory revoke S A...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G25 > F:\RVKCMP\SETUP\G25_SAL_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G25 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G25_SAL_NGRANT.OUT
\NPUBLIC\REVOKE S A FOR F:\RVKTEST\G25 FROM USER NOPASSUSER > F:\RVKCMP\OUT\G25_SAL.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G25 > F:\RVKCMP\SETUP\G25_SAL_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G25 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G25_SAL_PGRANT.OUT
\PUBLIC\REVOKE S A FOR F:\RVKTEST\G25 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\G25_SAL.OUT
ECHO Starting G26_ALL directory revoke ALL...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G26 > F:\RVKCMP\SETUP\G26_ALL_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G26 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G26_ALL_NGRANT.OUT
\NPUBLIC\REVOKE ALL FOR F:\RVKTEST\G26 FROM USER NOPASSUSER > F:\RVKCMP\OUT\G26_ALL.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G26 > F:\RVKCMP\SETUP\G26_ALL_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G26 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G26_ALL_PGRANT.OUT
\PUBLIC\REVOKE ALL FOR F:\RVKTEST\G26 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\G26_ALL.OUT
ECHO Starting G30_RE directory revoke R E...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G30 > F:\RVKCMP\SETUP\G30_RE_NREM.OUT
\NPUBLIC\GRANT R E FOR F:\RVKTEST\G30 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G30_RE_NGRANT.OUT
\NPUBLIC\REVOKE R FOR F:\RVKTEST\G30 FROM USER NOPASSUSER > F:\RVKCMP\OUT\G30_RE.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G30 > F:\RVKCMP\SETUP\G30_RE_PREM.OUT
\NPUBLIC\GRANT R E FOR F:\RVKTEST\G30 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G30_RE_PGRANT.OUT
\PUBLIC\REVOKE R FOR F:\RVKTEST\G30 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\G30_RE.OUT
ECHO Starting G31_RWF directory revoke W from R W F...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G31 > F:\RVKCMP\SETUP\G31_RWF_NREM.OUT
\NPUBLIC\GRANT R W F FOR F:\RVKTEST\G31 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G31_RWF_NGRANT.OUT
\NPUBLIC\REVOKE W FOR F:\RVKTEST\G31 FROM USER NOPASSUSER > F:\RVKCMP\OUT\G31_RWF.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G31 > F:\RVKCMP\SETUP\G31_RWF_PREM.OUT
\NPUBLIC\GRANT R W F FOR F:\RVKTEST\G31 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G31_RWF_PGRANT.OUT
\PUBLIC\REVOKE W FOR F:\RVKTEST\G31 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\G31_RWF.OUT
ECHO Starting G32_RCM directory revoke C from R C M...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G32 > F:\RVKCMP\SETUP\G32_RCM_NREM.OUT
\NPUBLIC\GRANT R C M FOR F:\RVKTEST\G32 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G32_RCM_NGRANT.OUT
\NPUBLIC\REVOKE C FOR F:\RVKTEST\G32 FROM USER NOPASSUSER > F:\RVKCMP\OUT\G32_RCM.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G32 > F:\RVKCMP\SETUP\G32_RCM_PREM.OUT
\NPUBLIC\GRANT R C M FOR F:\RVKTEST\G32 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G32_RCM_PGRANT.OUT
\PUBLIC\REVOKE C FOR F:\RVKTEST\G32 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\G32_RCM.OUT
ECHO Starting G33_RFA directory revoke F A from R F A...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G33 > F:\RVKCMP\SETUP\G33_RFA_NREM.OUT
\NPUBLIC\GRANT R F A FOR F:\RVKTEST\G33 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G33_RFA_NGRANT.OUT
\NPUBLIC\REVOKE F A FOR F:\RVKTEST\G33 FROM USER NOPASSUSER > F:\RVKCMP\OUT\G33_RFA.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G33 > F:\RVKCMP\SETUP\G33_RFA_PREM.OUT
\NPUBLIC\GRANT R F A FOR F:\RVKTEST\G33 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G33_RFA_PGRANT.OUT
\PUBLIC\REVOKE F A FOR F:\RVKTEST\G33 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\G33_RFA.OUT
ECHO Starting G34_WCM directory revoke W C from W C M...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G34 > F:\RVKCMP\SETUP\G34_WCM_NREM.OUT
\NPUBLIC\GRANT W C M FOR F:\RVKTEST\G34 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G34_WCM_NGRANT.OUT
\NPUBLIC\REVOKE W C FOR F:\RVKTEST\G34 FROM USER NOPASSUSER > F:\RVKCMP\OUT\G34_WCM.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G34 > F:\RVKCMP\SETUP\G34_WCM_PREM.OUT
\NPUBLIC\GRANT W C M FOR F:\RVKTEST\G34 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G34_WCM_PGRANT.OUT
\PUBLIC\REVOKE W C FOR F:\RVKTEST\G34 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\G34_WCM.OUT
ECHO Starting G35_EMF directory revoke E M from E M F...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G35 > F:\RVKCMP\SETUP\G35_EMF_NREM.OUT
\NPUBLIC\GRANT E M F FOR F:\RVKTEST\G35 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G35_EMF_NGRANT.OUT
\NPUBLIC\REVOKE E M FOR F:\RVKTEST\G35 FROM USER NOPASSUSER > F:\RVKCMP\OUT\G35_EMF.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G35 > F:\RVKCMP\SETUP\G35_EMF_PREM.OUT
\NPUBLIC\GRANT E M F FOR F:\RVKTEST\G35 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G35_EMF_PGRANT.OUT
\PUBLIC\REVOKE E M FOR F:\RVKTEST\G35 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\G35_EMF.OUT
ECHO Starting G36_RMF directory revoke M from R M F...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G36 > F:\RVKCMP\SETUP\G36_RMF_NREM.OUT
\NPUBLIC\GRANT R M F FOR F:\RVKTEST\G36 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G36_RMF_NGRANT.OUT
\NPUBLIC\REVOKE M FOR F:\RVKTEST\G36 FROM USER NOPASSUSER > F:\RVKCMP\OUT\G36_RMF.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G36 > F:\RVKCMP\SETUP\G36_RMF_PREM.OUT
\NPUBLIC\GRANT R M F FOR F:\RVKTEST\G36 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G36_RMF_PGRANT.OUT
\PUBLIC\REVOKE M FOR F:\RVKTEST\G36 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\G36_RMF.OUT
ECHO Starting G37_REMA directory revoke R E M A...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G37 > F:\RVKCMP\SETUP\G37_REMA_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G37 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G37_REMA_NGRANT.OUT
\NPUBLIC\REVOKE R E M A FOR F:\RVKTEST\G37 FROM USER NOPASSUSER > F:\RVKCMP\OUT\G37_REMA.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G37 > F:\RVKCMP\SETUP\G37_REMA_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G37 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G37_REMA_PGRANT.OUT
\PUBLIC\REVOKE R E M A FOR F:\RVKTEST\G37 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\G37_REMA.OUT
ECHO Starting G38_SR directory revoke S R...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G38 > F:\RVKCMP\SETUP\G38_SR_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G38 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G38_SR_NGRANT.OUT
\NPUBLIC\REVOKE S R FOR F:\RVKTEST\G38 FROM USER NOPASSUSER > F:\RVKCMP\OUT\G38_SR.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G38 > F:\RVKCMP\SETUP\G38_SR_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G38 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G38_SR_PGRANT.OUT
\PUBLIC\REVOKE S R FOR F:\RVKTEST\G38 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\G38_SR.OUT
ECHO Starting G39_SRF directory revoke S R F...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G39 > F:\RVKCMP\SETUP\G39_SRF_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G39 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G39_SRF_NGRANT.OUT
\NPUBLIC\REVOKE S R F FOR F:\RVKTEST\G39 FROM USER NOPASSUSER > F:\RVKCMP\OUT\G39_SRF.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G39 > F:\RVKCMP\SETUP\G39_SRF_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G39 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G39_SRF_PGRANT.OUT
\PUBLIC\REVOKE S R F FOR F:\RVKTEST\G39 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\G39_SRF.OUT
ECHO Starting G40_SWCM directory revoke S W C M...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G40 > F:\RVKCMP\SETUP\G40_SWCM_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G40 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G40_SWCM_NGRANT.OUT
\NPUBLIC\REVOKE S W C M FOR F:\RVKTEST\G40 FROM USER NOPASSUSER > F:\RVKCMP\OUT\G40_SWCM.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\G40 > F:\RVKCMP\SETUP\G40_SWCM_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\G40 TO USER NOPASSUSER > F:\RVKCMP\SETUP\G40_SWCM_PGRANT.OUT
\PUBLIC\REVOKE S W C M FOR F:\RVKTEST\G40 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\G40_SWCM.OUT
ECHO Starting F10_R file revoke R...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\F10\T.TXT /FILES > F:\RVKCMP\SETUP\F10_R_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\F10\T.TXT TO USER NOPASSUSER /FILES > F:\RVKCMP\SETUP\F10_R_NGRANT.OUT
\NPUBLIC\REVOKE R FOR F:\RVKTEST\F10\T.TXT FROM USER NOPASSUSER /FILES > F:\RVKCMP\OUT\F10_R.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\F10\T.TXT /FILES > F:\RVKCMP\SETUP\F10_R_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\F10\T.TXT TO USER NOPASSUSER /FILES > F:\RVKCMP\SETUP\F10_R_PGRANT.OUT
\PUBLIC\REVOKE R FOR F:\RVKTEST\F10\T.TXT FROM USER NOPASSUSER /FILES > F:\RVKCMP\PUBOUT\F10_R.OUT
ECHO Starting F11_RF file revoke R F...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\F11\T.TXT /FILES > F:\RVKCMP\SETUP\F11_RF_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\F11\T.TXT TO USER NOPASSUSER /FILES > F:\RVKCMP\SETUP\F11_RF_NGRANT.OUT
\NPUBLIC\REVOKE R F FOR F:\RVKTEST\F11\T.TXT FROM USER NOPASSUSER /FILES > F:\RVKCMP\OUT\F11_RF.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\F11\T.TXT /FILES > F:\RVKCMP\SETUP\F11_RF_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\F11\T.TXT TO USER NOPASSUSER /FILES > F:\RVKCMP\SETUP\F11_RF_PGRANT.OUT
\PUBLIC\REVOKE R F FOR F:\RVKTEST\F11\T.TXT FROM USER NOPASSUSER /FILES > F:\RVKCMP\PUBOUT\F11_RF.OUT
ECHO Starting F12_RAL file revoke R A...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\F12\T.TXT /FILES > F:\RVKCMP\SETUP\F12_RAL_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\F12\T.TXT TO USER NOPASSUSER /FILES > F:\RVKCMP\SETUP\F12_RAL_NGRANT.OUT
\NPUBLIC\REVOKE R A FOR F:\RVKTEST\F12\T.TXT FROM USER NOPASSUSER /FILES > F:\RVKCMP\OUT\F12_RAL.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\F12\T.TXT /FILES > F:\RVKCMP\SETUP\F12_RAL_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\F12\T.TXT TO USER NOPASSUSER /FILES > F:\RVKCMP\SETUP\F12_RAL_PGRANT.OUT
\PUBLIC\REVOKE R A FOR F:\RVKTEST\F12\T.TXT FROM USER NOPASSUSER /FILES > F:\RVKCMP\PUBOUT\F12_RAL.OUT
ECHO Starting F13_ALL file revoke ALL...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\F13\T.TXT /FILES > F:\RVKCMP\SETUP\F13_ALL_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\F13\T.TXT TO USER NOPASSUSER /FILES > F:\RVKCMP\SETUP\F13_ALL_NGRANT.OUT
\NPUBLIC\REVOKE ALL FOR F:\RVKTEST\F13\T.TXT FROM USER NOPASSUSER /FILES > F:\RVKCMP\OUT\F13_ALL.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\F13\T.TXT /FILES > F:\RVKCMP\SETUP\F13_ALL_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\F13\T.TXT TO USER NOPASSUSER /FILES > F:\RVKCMP\SETUP\F13_ALL_PGRANT.OUT
\PUBLIC\REVOKE ALL FOR F:\RVKTEST\F13\T.TXT FROM USER NOPASSUSER /FILES > F:\RVKCMP\PUBOUT\F13_ALL.OUT
ECHO Starting F14_N file revoke W from R W...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\F14\T.TXT /FILES > F:\RVKCMP\SETUP\F14_N_NREM.OUT
\NPUBLIC\GRANT R W FOR F:\RVKTEST\F14\T.TXT TO USER NOPASSUSER /FILES > F:\RVKCMP\SETUP\F14_N_NGRANT.OUT
\NPUBLIC\REVOKE W FOR F:\RVKTEST\F14\T.TXT FROM USER NOPASSUSER /FILES > F:\RVKCMP\OUT\F14_N.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\F14\T.TXT /FILES > F:\RVKCMP\SETUP\F14_N_PREM.OUT
\NPUBLIC\GRANT R W FOR F:\RVKTEST\F14\T.TXT TO USER NOPASSUSER /FILES > F:\RVKCMP\SETUP\F14_N_PGRANT.OUT
\PUBLIC\REVOKE W FOR F:\RVKTEST\F14\T.TXT FROM USER NOPASSUSER /FILES > F:\RVKCMP\PUBOUT\F14_N.OUT
ECHO Starting F15_S file revoke S...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\F15\T.TXT /FILES > F:\RVKCMP\SETUP\F15_S_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\F15\T.TXT TO USER NOPASSUSER /FILES > F:\RVKCMP\SETUP\F15_S_NGRANT.OUT
\NPUBLIC\REVOKE S FOR F:\RVKTEST\F15\T.TXT FROM USER NOPASSUSER /FILES > F:\RVKCMP\OUT\F15_S.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\F15\T.TXT /FILES > F:\RVKCMP\SETUP\F15_S_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\F15\T.TXT TO USER NOPASSUSER /FILES > F:\RVKCMP\SETUP\F15_S_PGRANT.OUT
\PUBLIC\REVOKE S FOR F:\RVKTEST\F15\T.TXT FROM USER NOPASSUSER /FILES > F:\RVKCMP\PUBOUT\F15_S.OUT
ECHO Starting F16_SAL file revoke S A...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\F16\T.TXT /FILES > F:\RVKCMP\SETUP\F16_SAL_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\F16\T.TXT TO USER NOPASSUSER /FILES > F:\RVKCMP\SETUP\F16_SAL_NGRANT.OUT
\NPUBLIC\REVOKE S A FOR F:\RVKTEST\F16\T.TXT FROM USER NOPASSUSER /FILES > F:\RVKCMP\OUT\F16_SAL.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\F16\T.TXT /FILES > F:\RVKCMP\SETUP\F16_SAL_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\F16\T.TXT TO USER NOPASSUSER /FILES > F:\RVKCMP\SETUP\F16_SAL_PGRANT.OUT
\PUBLIC\REVOKE S A FOR F:\RVKTEST\F16\T.TXT FROM USER NOPASSUSER /FILES > F:\RVKCMP\PUBOUT\F16_SAL.OUT
ECHO Starting S10_R subdirectory revoke R...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\S10 /SUBDIRECTORIES > F:\RVKCMP\SETUP\S10_R_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\S10 TO USER NOPASSUSER /SUBDIRECTORIES > F:\RVKCMP\SETUP\S10_R_NGRANT.OUT
\NPUBLIC\REVOKE R FOR F:\RVKTEST\S10 FROM USER NOPASSUSER /SUBDIRECTORIES > F:\RVKCMP\OUT\S10_R.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\S10 /SUBDIRECTORIES > F:\RVKCMP\SETUP\S10_R_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\S10 TO USER NOPASSUSER /SUBDIRECTORIES > F:\RVKCMP\SETUP\S10_R_PGRANT.OUT
\PUBLIC\REVOKE R FOR F:\RVKTEST\S10 FROM USER NOPASSUSER /SUBDIRECTORIES > F:\RVKCMP\PUBOUT\S10_R.OUT
ECHO Starting S11_RWC subdirectory revoke R W C...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\S11 /SUBDIRECTORIES > F:\RVKCMP\SETUP\S11_RWC_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\S11 TO USER NOPASSUSER /SUBDIRECTORIES > F:\RVKCMP\SETUP\S11_RWC_NGRANT.OUT
\NPUBLIC\REVOKE R W C FOR F:\RVKTEST\S11 FROM USER NOPASSUSER /SUBDIRECTORIES > F:\RVKCMP\OUT\S11_RWC.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\S11 /SUBDIRECTORIES > F:\RVKCMP\SETUP\S11_RWC_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\S11 TO USER NOPASSUSER /SUBDIRECTORIES > F:\RVKCMP\SETUP\S11_RWC_PGRANT.OUT
\PUBLIC\REVOKE R W C FOR F:\RVKTEST\S11 FROM USER NOPASSUSER /SUBDIRECTORIES > F:\RVKCMP\PUBOUT\S11_RWC.OUT
ECHO Starting S12_ALL subdirectory revoke ALL...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\S12 /SUBDIRECTORIES > F:\RVKCMP\SETUP\S12_ALL_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\S12 TO USER NOPASSUSER /SUBDIRECTORIES > F:\RVKCMP\SETUP\S12_ALL_NGRANT.OUT
\NPUBLIC\REVOKE ALL FOR F:\RVKTEST\S12 FROM USER NOPASSUSER /SUBDIRECTORIES > F:\RVKCMP\OUT\S12_ALL.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\S12 /SUBDIRECTORIES > F:\RVKCMP\SETUP\S12_ALL_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\S12 TO USER NOPASSUSER /SUBDIRECTORIES > F:\RVKCMP\SETUP\S12_ALL_PGRANT.OUT
\PUBLIC\REVOKE ALL FOR F:\RVKTEST\S12 FROM USER NOPASSUSER /SUBDIRECTORIES > F:\RVKCMP\PUBOUT\S12_ALL.OUT
ECHO Starting S13_SAL subdirectory revoke S A...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\S13 /SUBDIRECTORIES > F:\RVKCMP\SETUP\S13_SAL_NREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\S13 TO USER NOPASSUSER /SUBDIRECTORIES > F:\RVKCMP\SETUP\S13_SAL_NGRANT.OUT
\NPUBLIC\REVOKE S A FOR F:\RVKTEST\S13 FROM USER NOPASSUSER /SUBDIRECTORIES > F:\RVKCMP\OUT\S13_SAL.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\S13 /SUBDIRECTORIES > F:\RVKCMP\SETUP\S13_SAL_PREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\S13 TO USER NOPASSUSER /SUBDIRECTORIES > F:\RVKCMP\SETUP\S13_SAL_PGRANT.OUT
\PUBLIC\REVOKE S A FOR F:\RVKTEST\S13 FROM USER NOPASSUSER /SUBDIRECTORIES > F:\RVKCMP\PUBOUT\S13_SAL.OUT
ECHO Starting E90_NOTR no trustee...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\EMPTY > F:\RVKCMP\SETUP\E90_NREM.OUT
\NPUBLIC\REVOKE R FOR F:\RVKTEST\EMPTY FROM USER NOPASSUSER > F:\RVKCMP\OUT\E90_NOTR.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\EMPTY > F:\RVKCMP\SETUP\E90_PREM.OUT
\PUBLIC\REVOKE R FOR F:\RVKTEST\EMPTY FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\E90_NOTR.OUT
ECHO Starting E91_MUSR missing user...
\NPUBLIC\REVOKE R FOR F:\RVKTEST\G10 FROM USER NO_SUCH_USER > F:\RVKCMP\OUT\E91_MUSR.OUT
\PUBLIC\REVOKE R FOR F:\RVKTEST\G10 FROM USER NO_SUCH_USER > F:\RVKCMP\PUBOUT\E91_MUSR.OUT
ECHO Starting E92_MISD missing path...
\NPUBLIC\REVOKE R FOR F:\RVKTEST\MISSING\NOFILE.TXT FROM USER NOPASSUSER > F:\RVKCMP\OUT\E92_MISD.OUT
\PUBLIC\REVOKE R FOR F:\RVKTEST\MISSING\NOFILE.TXT FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\E92_MISD.OUT
ECHO Starting E93_BADD invalid right...
\NPUBLIC\REVOKE BADRIGHT FOR F:\RVKTEST\G10 FROM USER NOPASSUSER > F:\RVKCMP\OUT\E93_BADD.OUT
\PUBLIC\REVOKE BADRIGHT FOR F:\RVKTEST\G10 FROM USER NOPASSUSER > F:\RVKCMP\PUBOUT\E93_BADD.OUT
ECHO Starting E94_BOTH /FILES and /SUBDIRECTORIES...
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\OPTBOTH /FILES > F:\RVKCMP\SETUP\E94_NFREM.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\OPTBOTH /SUBDIRECTORIES > F:\RVKCMP\SETUP\E94_NSREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\OPTBOTH TO USER NOPASSUSER /FILES > F:\RVKCMP\SETUP\E94_NFGRANT.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\OPTBOTH TO USER NOPASSUSER /SUBDIRECTORIES > F:\RVKCMP\SETUP\E94_NSGRANT.OUT
\NPUBLIC\REVOKE R FOR F:\RVKTEST\OPTBOTH FROM USER NOPASSUSER /FILES /SUBDIRECTORIES > F:\RVKCMP\OUT\E94_BOTH.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\OPTBOTH /FILES > F:\RVKCMP\SETUP\E94_PFREM.OUT
\NPUBLIC\REMOVE USER NOPASSUSER FROM F:\RVKTEST\OPTBOTH /SUBDIRECTORIES > F:\RVKCMP\SETUP\E94_PSREM.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\OPTBOTH TO USER NOPASSUSER /FILES > F:\RVKCMP\SETUP\E94_PFGRANT.OUT
\NPUBLIC\GRANT S R W C E M F A FOR F:\RVKTEST\OPTBOTH TO USER NOPASSUSER /SUBDIRECTORIES > F:\RVKCMP\SETUP\E94_PSGRANT.OUT
\PUBLIC\REVOKE R FOR F:\RVKTEST\OPTBOTH FROM USER NOPASSUSER /FILES /SUBDIRECTORIES > F:\RVKCMP\PUBOUT\E94_BOTH.OUT
ECHO Starting E95_GRAM bad grammar...
\NPUBLIC\REVOKE R FOR F:\RVKTEST\G10 USER NOPASSUSER > F:\RVKCMP\OUT\E95_GRAM.OUT
\PUBLIC\REVOKE R FOR F:\RVKTEST\G10 USER NOPASSUSER > F:\RVKCMP\PUBOUT\E95_GRAM.OUT
ECHO === COMPARE NOVELL OUT AGAINST PUBLIC OUT === > F:\RVKCMP\COMPARE.LOG
ECHO Comparing D01_HELP >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\D01_HELP.OUT F:\RVKCMP\PUBOUT\D01_HELP.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing D02_NOAR >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\D02_NOAR.OUT F:\RVKCMP\PUBOUT\D02_NOAR.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing G10_R >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\G10_R.OUT F:\RVKCMP\PUBOUT\G10_R.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing G11_W >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\G11_W.OUT F:\RVKCMP\PUBOUT\G11_W.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing G12_C >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\G12_C.OUT F:\RVKCMP\PUBOUT\G12_C.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing G13_E >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\G13_E.OUT F:\RVKCMP\PUBOUT\G13_E.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing G14_M >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\G14_M.OUT F:\RVKCMP\PUBOUT\G14_M.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing G15_F >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\G15_F.OUT F:\RVKCMP\PUBOUT\G15_F.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing G16_A >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\G16_A.OUT F:\RVKCMP\PUBOUT\G16_A.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing G17_S >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\G17_S.OUT F:\RVKCMP\PUBOUT\G17_S.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing G20_RF >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\G20_RF.OUT F:\RVKCMP\PUBOUT\G20_RF.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing G21_RW >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\G21_RW.OUT F:\RVKCMP\PUBOUT\G21_RW.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing G22_RWC >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\G22_RWC.OUT F:\RVKCMP\PUBOUT\G22_RWC.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing G23_RWCE >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\G23_RWCE.OUT F:\RVKCMP\PUBOUT\G23_RWCE.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing G24_EMF >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\G24_EMF.OUT F:\RVKCMP\PUBOUT\G24_EMF.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing G25_SAL >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\G25_SAL.OUT F:\RVKCMP\PUBOUT\G25_SAL.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing G26_ALL >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\G26_ALL.OUT F:\RVKCMP\PUBOUT\G26_ALL.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing G30_RE >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\G30_RE.OUT F:\RVKCMP\PUBOUT\G30_RE.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing G31_RWF >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\G31_RWF.OUT F:\RVKCMP\PUBOUT\G31_RWF.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing G32_RCM >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\G32_RCM.OUT F:\RVKCMP\PUBOUT\G32_RCM.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing G33_RFA >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\G33_RFA.OUT F:\RVKCMP\PUBOUT\G33_RFA.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing G34_WCM >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\G34_WCM.OUT F:\RVKCMP\PUBOUT\G34_WCM.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing G35_EMF >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\G35_EMF.OUT F:\RVKCMP\PUBOUT\G35_EMF.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing G36_RMF >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\G36_RMF.OUT F:\RVKCMP\PUBOUT\G36_RMF.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing G37_REMA >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\G37_REMA.OUT F:\RVKCMP\PUBOUT\G37_REMA.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing G38_SR >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\G38_SR.OUT F:\RVKCMP\PUBOUT\G38_SR.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing G39_SRF >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\G39_SRF.OUT F:\RVKCMP\PUBOUT\G39_SRF.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing G40_SWCM >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\G40_SWCM.OUT F:\RVKCMP\PUBOUT\G40_SWCM.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing F10_R >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\F10_R.OUT F:\RVKCMP\PUBOUT\F10_R.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing F11_RF >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\F11_RF.OUT F:\RVKCMP\PUBOUT\F11_RF.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing F12_RAL >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\F12_RAL.OUT F:\RVKCMP\PUBOUT\F12_RAL.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing F13_ALL >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\F13_ALL.OUT F:\RVKCMP\PUBOUT\F13_ALL.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing F14_N >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\F14_N.OUT F:\RVKCMP\PUBOUT\F14_N.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing F15_S >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\F15_S.OUT F:\RVKCMP\PUBOUT\F15_S.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing F16_SAL >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\F16_SAL.OUT F:\RVKCMP\PUBOUT\F16_SAL.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing S10_R >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\S10_R.OUT F:\RVKCMP\PUBOUT\S10_R.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing S11_RWC >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\S11_RWC.OUT F:\RVKCMP\PUBOUT\S11_RWC.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing S12_ALL >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\S12_ALL.OUT F:\RVKCMP\PUBOUT\S12_ALL.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing S13_SAL >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\S13_SAL.OUT F:\RVKCMP\PUBOUT\S13_SAL.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing E90_NOTR >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\E90_NOTR.OUT F:\RVKCMP\PUBOUT\E90_NOTR.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing E91_MUSR >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\E91_MUSR.OUT F:\RVKCMP\PUBOUT\E91_MUSR.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing E92_MISD >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\E92_MISD.OUT F:\RVKCMP\PUBOUT\E92_MISD.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing E93_BADD >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\E93_BADD.OUT F:\RVKCMP\PUBOUT\E93_BADD.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing E94_BOTH >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\E94_BOTH.OUT F:\RVKCMP\PUBOUT\E94_BOTH.OUT >> F:\RVKCMP\COMPARE.LOG
ECHO Comparing E95_GRAM >> F:\RVKCMP\COMPARE.LOG
FC F:\RVKCMP\OUT\E95_GRAM.OUT F:\RVKCMP\PUBOUT\E95_GRAM.OUT >> F:\RVKCMP\COMPARE.LOG
REM --- Queue user-context RIGHTS readback helper. ---
IF "%LGNTPWD%"=="" GOTO NEEDPWD
IF EXIST \PUBLIC\DLYSTRT.EXE COPY \PUBLIC\DLYSTRT.EXE C:\RVKTMP > NUL
IF EXIST C:\RVKTMP\DLYSTRT.EXE GOTO HAVEDLY
ECHO ERROR: DLYSTRT.EXE not found. >> F:\RVKCMP\RUN.LOG
ECHO ERROR: DLYSTRT.EXE not found.
GOTO END
:HAVEDLY
COPY F:\RVKSTA.BAT C:\RVKTMP > NUL
COPY F:\RVKC.BAT C:\RVKTMP > NUL
C:
CD \RVKTMP
DLYSTRT /T:2 RVKC.BAT
ECHO RVKC queued via DLYSTRT. >> F:\RVKCMP\RUN.LOG
ECHO RVKC wurde via DLYSTRT gestartet.
ECHO Nach automatischem Re-Login wird RVKSTA PART2 gestartet.
GOTO END
:PART2
F:
CD \
IF NOT EXIST RVKCMP\UNOV MD RVKCMP\UNOV
IF NOT EXIST RVKCMP\UPUB MD RVKCMP\UPUB
IF EXIST C:\RVKTMP\UNOV\*.* COPY C:\RVKTMP\UNOV\*.* F:\RVKCMP\UNOV > NUL
IF EXIST C:\RVKTMP\UPUB\*.* COPY C:\RVKTMP\UPUB\*.* F:\RVKCMP\UPUB > NUL
IF EXIST C:\RVKTMP\HELPER.TXT COPY C:\RVKTMP\HELPER.TXT F:\RVKCMP\HELPER.TXT > NUL
IF EXIST C:\RVKTMP\ULOG1.OUT COPY C:\RVKTMP\ULOG1.OUT F:\RVKCMP\ULOG1.OUT > NUL
IF EXIST C:\RVKTMP\ULOGIN.OUT COPY C:\RVKTMP\ULOGIN.OUT F:\RVKCMP\ULOGIN.OUT > NUL
IF EXIST C:\RVKTMP\ULOG2.OUT COPY C:\RVKTMP\ULOG2.OUT F:\RVKCMP\ULOG2.OUT > NUL
IF EXIST C:\RVKTMP\ULGSUP.OUT COPY C:\RVKTMP\ULGSUP.OUT F:\RVKCMP\ULGSUP.OUT > NUL
ECHO === COMPARE NOPASSUSER NOVELL RIGHTS AGAINST PUBLIC RIGHTS === > F:\RVKCMP\UCOMP.LOG
ECHO Comparing G10_R >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\G10_R.OUT F:\RVKCMP\UPUB\G10_R.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing G11_W >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\G11_W.OUT F:\RVKCMP\UPUB\G11_W.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing G12_C >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\G12_C.OUT F:\RVKCMP\UPUB\G12_C.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing G13_E >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\G13_E.OUT F:\RVKCMP\UPUB\G13_E.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing G14_M >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\G14_M.OUT F:\RVKCMP\UPUB\G14_M.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing G15_F >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\G15_F.OUT F:\RVKCMP\UPUB\G15_F.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing G16_A >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\G16_A.OUT F:\RVKCMP\UPUB\G16_A.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing G17_S >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\G17_S.OUT F:\RVKCMP\UPUB\G17_S.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing G20_RF >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\G20_RF.OUT F:\RVKCMP\UPUB\G20_RF.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing G21_RW >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\G21_RW.OUT F:\RVKCMP\UPUB\G21_RW.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing G22_RWC >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\G22_RWC.OUT F:\RVKCMP\UPUB\G22_RWC.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing G23_RWCE >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\G23_RWCE.OUT F:\RVKCMP\UPUB\G23_RWCE.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing G24_EMF >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\G24_EMF.OUT F:\RVKCMP\UPUB\G24_EMF.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing G25_SAL >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\G25_SAL.OUT F:\RVKCMP\UPUB\G25_SAL.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing G26_ALL >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\G26_ALL.OUT F:\RVKCMP\UPUB\G26_ALL.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing G30_RE >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\G30_RE.OUT F:\RVKCMP\UPUB\G30_RE.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing G31_RWF >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\G31_RWF.OUT F:\RVKCMP\UPUB\G31_RWF.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing G32_RCM >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\G32_RCM.OUT F:\RVKCMP\UPUB\G32_RCM.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing G33_RFA >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\G33_RFA.OUT F:\RVKCMP\UPUB\G33_RFA.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing G34_WCM >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\G34_WCM.OUT F:\RVKCMP\UPUB\G34_WCM.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing G35_EMF >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\G35_EMF.OUT F:\RVKCMP\UPUB\G35_EMF.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing G36_RMF >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\G36_RMF.OUT F:\RVKCMP\UPUB\G36_RMF.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing G37_REMA >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\G37_REMA.OUT F:\RVKCMP\UPUB\G37_REMA.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing G38_SR >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\G38_SR.OUT F:\RVKCMP\UPUB\G38_SR.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing G39_SRF >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\G39_SRF.OUT F:\RVKCMP\UPUB\G39_SRF.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing G40_SWCM >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\G40_SWCM.OUT F:\RVKCMP\UPUB\G40_SWCM.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing F10_R >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\F10_R.OUT F:\RVKCMP\UPUB\F10_R.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing F11_RF >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\F11_RF.OUT F:\RVKCMP\UPUB\F11_RF.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing F12_RAL >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\F12_RAL.OUT F:\RVKCMP\UPUB\F12_RAL.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing F13_ALL >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\F13_ALL.OUT F:\RVKCMP\UPUB\F13_ALL.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing F14_N >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\F14_N.OUT F:\RVKCMP\UPUB\F14_N.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing F15_S >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\F15_S.OUT F:\RVKCMP\UPUB\F15_S.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing F16_SAL >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\F16_SAL.OUT F:\RVKCMP\UPUB\F16_SAL.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing S10_R >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\S10_R.OUT F:\RVKCMP\UPUB\S10_R.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing S11_RWC >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\S11_RWC.OUT F:\RVKCMP\UPUB\S11_RWC.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing S12_ALL >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\S12_ALL.OUT F:\RVKCMP\UPUB\S12_ALL.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO Comparing S13_SAL >> F:\RVKCMP\UCOMP.LOG
FC F:\RVKCMP\UNOV\S13_SAL.OUT F:\RVKCMP\UPUB\S13_SAL.OUT >> F:\RVKCMP\UCOMP.LOG
ECHO === SUMMARY === > F:\RVKCMP\SUMMARY.TXT
ECHO RVKSTA REVOKE comparison finished. >> F:\RVKCMP\SUMMARY.TXT
ECHO. >> F:\RVKCMP\SUMMARY.TXT
ECHO Direct mode compares NPUBLIC REVOKE against PUBLIC REVOKE. >> F:\RVKCMP\SUMMARY.TXT
ECHO Matrix covers single rights, mixed rights, ALL removal, file mode, and subdirectory mode. >> F:\RVKCMP\SUMMARY.TXT
ECHO User-context mode logs in as NOPASSUSER and compares RIGHTS output after PUBLIC REVOKE. >> F:\RVKCMP\SUMMARY.TXT
ECHO Optional: RVKZIP ausfuehren. >> F:\RVKCMP\SUMMARY.TXT
ECHO RVKSTA PART2 fertig.
ECHO Ergebnisse liegen in F:\RVKCMP
ECHO Optional: RVKZIP ausfuehren.
GOTO END
:NEEDPWD
ECHO ERROR: LGNTPWD ist nicht gesetzt.
ECHO Fuer den automatischen REVOKE/NOPASSUSER-Test zuerst setzen, z.B.:
ECHO SET LGNTPWD=dein-supervisor-passwort
ECHO Danach starten:
ECHO F:\RVKSTA
ECHO Es wurde kein DLYSTRT installiert und kein User-Kontext-Test gestartet.
:END

26
test/revoke/RVKZIP.BAT Normal file
View File

@@ -0,0 +1,26 @@
@ECHO OFF
REM RVKZIP.BAT
REM Optional packer for RVKSTA result files.
REM Requires ZIP.EXE in PATH or current directory.
F:
CD \RVKCMP
IF EXIST RVKSTA.ZIP DEL RVKSTA.ZIP
IF EXIST ZIP.LOG DEL ZIP.LOG
ECHO Creating RVKSTA.ZIP > ZIP.LOG
ZIP -r RVKSTA.ZIP RUN.LOG SUMMARY.TXT COMPARE.LOG UCOMP.LOG HELPER.TXT ULOG1.OUT ULOGIN.OUT ULOG2.OUT ULGSUP.OUT OUT PUBOUT SETUP 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 \RVKTEST\NUL DELTREE /Y \RVKTEST >> ZIP.LOG
IF EXIST C:\RVKTMP\NUL DELTREE /Y C:\RVKTMP >> ZIP.LOG
CD \
ECHO.
ECHO ZIP step finished.
ECHO Check:
ECHO F:\RVKCMP\RVKSTA.ZIP
ECHO F:\RVKCMP\ZIP.LOG
ECHO.

47
test/rights/README.md Normal file
View File

@@ -0,0 +1,47 @@
# RGHTSTA - RIGHTS comparison test
`RGHTSTA.BAT` compares Novell `RIGHTS` with the current implementation.
## Run
Run while logged in and with `F:` mapped to `SYS:`:
```bat
F:
CD \
RGHTSTA
RGHTZIP
```
## Result layout
```text
F:\RGHTCMP\OUT Novell baseline using \NPUBLIC\RIGHTS
F:\RGHTCMP\PUBOUT current implementation using \PUBLIC\RIGHTS
F:\RGHTCMP\COMPARE.LOG
F:\RGHTCMP\RUN.LOG
F:\RGHTCMP\SUMMARY.TXT
```
`RGHTZIP.BAT` packages the result tree and removes the generated `F:\RGHTEST`
test tree afterwards.
## 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
Expected comparison:
```text
OUT == PUBOUT
```
`RIGHTS` has no `/SHORT` comparison in this test. That switch belongs to the
NDIR diagnostic output and should only be added to RIGHTS if the tool explicitly
implements it later.

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

370
test/rights/RGHTSTA.BAT Normal file
View File

@@ -0,0 +1,370 @@
@ECHO OFF
REM RGHTSTA.BAT
REM Automated RIGHTS comparison test for MARS NWE.
REM
REM Direct mode:
REM OUT = Novell baseline using \NPUBLIC\RIGHTS
REM PUBOUT = our implementation using \PUBLIC\RIGHTS
REM
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. ---
IF EXIST RGHTEST\*.* DELTREE /Y RGHTEST
IF EXIST RGHTCMP\*.* DELTREE /Y RGHTCMP
IF EXIST C:\RGHTTMP\*.* DELTREE /Y C:\RGHTTMP
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 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 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
\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_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 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 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 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 PART2 fertig.
ECHO Ergebnisse liegen in F:\RGHTCMP
ECHO Optional: RGHTZIP ausfuehren.
GOTO END
:END

26
test/rights/RGHTZIP.BAT Normal file
View File

@@ -0,0 +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 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.

76
test/rightsuser/README.md Normal file
View File

@@ -0,0 +1,76 @@
# Rights user / trustee practical matrix test
This test checks whether trustee rights granted to `MARIO` actually control
real DOS operations. It also contains a rename-rights matrix.
## Files
| File | Run as | Purpose |
| --- | --- | --- |
| `RUTPRE.BAT` | SUPERVISOR | Create test tree and grant rights to MARIO. |
| `RUTMARIO.BAT` | MARIO | Perform real operations. |
| `RUTPOST.BAT` | SUPERVISOR | Capture final state and summary. |
| `RUTZIP.BAT` | SUPERVISOR | Pack results into `RUTSTA.ZIP`. |
## Flow
```text
Login SUPERVISOR
RUTPRE
Logout / Login MARIO
RUTMARIO
Logout / Login SUPERVISOR
RUTPOST
RUTZIP
```
Result ZIP:
```text
F:\RUCMP\RUTSTA.ZIP
```
Linux package with server log:
```sh
sudo ./mars_packtest_v3.sh rutsta 5 mario
```
## Rename matrix
The previous run showed rename failing with `R W M F` while ALL rights worked.
This version creates four directories:
```text
MOD1 = R W M F
MOD2 = R W C M F
MOD3 = R W E M F
MOD4 = R W C E M F
```
`RUTMARIO.BAT` tries:
```text
REN F:\RUTEST\MODx\M.TXT M2.TXT
```
The result is written to:
```text
F:\RUCMP\MARIO\U06.OUT
```
## Other coverage
- R/F read + file scan
- R/F/C create
- R/W/F write/append
- R/F/E erase
- F only directory scan
- R/F/A access-control test
- R/W/C/E/M/F/A all-rights operation set
`RUTPRE.BAT` now also grants MARIO write/create rights to `F:\RUCMP\MARIO`,
so the `Uxx.OUT` files should be created.

Some files were not shown because too many files have changed in this diff Show More