Compare commits
34 Commits
0ea11f7f5d
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5da600c2a5 | ||
|
|
0fa4a6f700 | ||
|
|
4ad455c6df | ||
|
|
f214e89d69 | ||
|
|
0df41482c7 | ||
|
|
6d2d3f367f | ||
|
|
7117bfff68 | ||
|
|
c50202e93b | ||
|
|
4cafe16980 | ||
|
|
fc97eb8d25 | ||
|
|
f940d2d88e | ||
|
|
9ab65e2f00 | ||
|
|
456349088e | ||
|
|
f62ca19c50 | ||
|
|
ff92f72583 | ||
|
|
83f8947ece | ||
|
|
87c1e50cf9 | ||
|
|
7f98d73738 | ||
|
|
3a5b08a4bf | ||
|
|
8b6685c501 | ||
|
|
cfb58237da | ||
|
|
aaf29ed535 | ||
|
|
6f998a497d | ||
|
|
dbf7be5104 | ||
|
|
4a4026e6dd | ||
|
|
20343b497a | ||
|
|
e4227bfda8 | ||
|
|
bb868613d9 | ||
|
|
e4d67917bd | ||
|
|
b8a701b8fe | ||
|
|
dd5e4e9a3b | ||
|
|
82b0f918dd | ||
|
|
b16fc3a64b | ||
|
|
f375f79cce |
265
CMakeLists.txt
Normal file
265
CMakeLists.txt
Normal file
@@ -0,0 +1,265 @@
|
|||||||
|
# DOS utilities for mars-nwe.
|
||||||
|
#
|
||||||
|
# Default install mode uses a split:
|
||||||
|
# - legacy command names are installed from netold.exe
|
||||||
|
# - new command names that netold.exe does not contain are installed from net.exe
|
||||||
|
#
|
||||||
|
# Maintainer mode can rebuild the new net.exe with Open Watcom. The freshly
|
||||||
|
# built binary is only installed when MARS_NWE_INSTALL_NEW_DOSUTILS is ON, or
|
||||||
|
# for the new-only command names in the default split install.
|
||||||
|
|
||||||
|
option(MAINTAINER_BUILD "Enable maintainer-only DOS tool helpers and diagnostics" OFF)
|
||||||
|
|
||||||
|
if(DEFINED MARS_NWE_VERSION_BASE)
|
||||||
|
set(MARS_DOSUTILS_VERSION "${MARS_NWE_VERSION_BASE}")
|
||||||
|
else()
|
||||||
|
set(MARS_DOSUTILS_VERSION "0.99")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
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_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
|
||||||
|
login
|
||||||
|
profile
|
||||||
|
spawn
|
||||||
|
passwd
|
||||||
|
path
|
||||||
|
pathins
|
||||||
|
pathdel
|
||||||
|
map
|
||||||
|
mapdel
|
||||||
|
logout
|
||||||
|
capture
|
||||||
|
endcap
|
||||||
|
)
|
||||||
|
|
||||||
|
# Tools not present in netold.exe. These are installed from the new binary
|
||||||
|
# even in the default split mode.
|
||||||
|
set(MARS_DOSUTILS_NEW_ONLY_TOOLS
|
||||||
|
slist
|
||||||
|
flag
|
||||||
|
flagdir
|
||||||
|
rights
|
||||||
|
grant
|
||||||
|
revoke
|
||||||
|
remove
|
||||||
|
ndir
|
||||||
|
creator
|
||||||
|
whoami
|
||||||
|
)
|
||||||
|
|
||||||
|
if(MARS_NWE_BUILD_DOSUTILS)
|
||||||
|
find_package(OpenWatcom REQUIRED)
|
||||||
|
|
||||||
|
set(DOSUTILS_C_SOURCES
|
||||||
|
net.c
|
||||||
|
tools.c
|
||||||
|
netcall.c
|
||||||
|
ncpcall.c
|
||||||
|
login.c
|
||||||
|
map.c
|
||||||
|
slist.c
|
||||||
|
ndir.c
|
||||||
|
flag.c
|
||||||
|
flagdir.c
|
||||||
|
rights.c
|
||||||
|
grant.c
|
||||||
|
revoke.c
|
||||||
|
remove.c
|
||||||
|
trustee.c
|
||||||
|
c32ncp.c
|
||||||
|
nwcrypt.c
|
||||||
|
nwdebug.c
|
||||||
|
nwtests.c
|
||||||
|
capture.c
|
||||||
|
creator.c
|
||||||
|
whoami.c
|
||||||
|
)
|
||||||
|
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/kern.obj"
|
||||||
|
COMMAND "${CMAKE_COMMAND}" -E env ${OPENWATCOM_ENV}
|
||||||
|
"${OPENWATCOM_WASM}"
|
||||||
|
-q
|
||||||
|
-zq
|
||||||
|
-fo="${CMAKE_CURRENT_BINARY_DIR}/kern.obj"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/kern_wasm.asm"
|
||||||
|
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/kern_wasm.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 -dMARS_DOSUTILS_VERSION=\"${MARS_DOSUTILS_VERSION}\")
|
||||||
|
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}/kern.h"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/c32ncp.h"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/nwcrypt.h"
|
||||||
|
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
|
||||||
|
VERBATIM
|
||||||
|
)
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/net.exe"
|
||||||
|
COMMAND "${CMAKE_COMMAND}" -E env ${OPENWATCOM_ENV}
|
||||||
|
"${OPENWATCOM_WCL}"
|
||||||
|
-q
|
||||||
|
-zq
|
||||||
|
-bt=dos
|
||||||
|
-ml
|
||||||
|
-0
|
||||||
|
-k32768
|
||||||
|
-fe="${CMAKE_CURRENT_BINARY_DIR}/net.exe"
|
||||||
|
${DOSUTILS_OBJECTS}
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/kern.obj"
|
||||||
|
DEPENDS
|
||||||
|
${DOSUTILS_OBJECTS}
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/kern.obj"
|
||||||
|
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
|
||||||
|
VERBATIM
|
||||||
|
)
|
||||||
|
|
||||||
|
add_custom_target(dosutils_net ALL
|
||||||
|
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/net.exe"
|
||||||
|
)
|
||||||
|
|
||||||
|
set(MARS_DOSUTILS_BUILT_NET_EXE "${CMAKE_CURRENT_BINARY_DIR}/net.exe")
|
||||||
|
|
||||||
|
if(MAINTAINER_BUILD)
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/dlystrt.exe"
|
||||||
|
COMMAND "${CMAKE_COMMAND}" -E env ${OPENWATCOM_ENV}
|
||||||
|
"${OPENWATCOM_WCL}"
|
||||||
|
-q
|
||||||
|
-zq
|
||||||
|
-bt=dos
|
||||||
|
-ms
|
||||||
|
-0
|
||||||
|
-dMAINTAINER_BUILD
|
||||||
|
-fe="${CMAKE_CURRENT_BINARY_DIR}/dlystrt.exe"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/dlystrt.c"
|
||||||
|
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/dlystrt.c"
|
||||||
|
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
|
||||||
|
VERBATIM
|
||||||
|
)
|
||||||
|
|
||||||
|
add_custom_target(dlystrt ALL
|
||||||
|
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/dlystrt.exe"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
set(MARS_DOSUTILS_BUILT_NET_EXE "")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
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()
|
||||||
|
|
||||||
|
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")
|
||||||
|
install(FILES "${MARS_DOSUTILS_SELECTED_LEGACY_EXE}"
|
||||||
|
DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public"
|
||||||
|
RENAME net.exe)
|
||||||
|
else()
|
||||||
|
install(FILES "${MARS_DOSUTILS_SELECTED_LEGACY_EXE}"
|
||||||
|
DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public"
|
||||||
|
RENAME "${tool}.exe")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
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"
|
||||||
|
RENAME login.exe)
|
||||||
|
|
||||||
|
install(FILES "${MARS_DOSUTILS_SELECTED_LEGACY_EXE}"
|
||||||
|
DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/login"
|
||||||
|
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()
|
||||||
715
README.md
Normal file
715
README.md
Normal file
@@ -0,0 +1,715 @@
|
|||||||
|
# mars_dosutils
|
||||||
|
|
||||||
|
DOS client-side utilities for **mars_nwe** and compatible NetWare-style NCP environments.
|
||||||
|
|
||||||
|
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
|
||||||
|
- 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`.
|
||||||
|
|
||||||
|
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 FLAG-family and trustee/right tools.
|
||||||
|
|
||||||
|
Validated recently:
|
||||||
|
|
||||||
|
- `FLAG` file attribute read/modify through DOS Client32
|
||||||
|
- `FLAGDIR` directory attribute read/modify through DOS Client32
|
||||||
|
- `RIGHTS` effective-rights display through Client32 NCP87
|
||||||
|
- `GRANT` trustee assignment for users and groups
|
||||||
|
- `REVOKE` trustee-right removal for users and groups
|
||||||
|
- `REMOVE` trustee deletion for users and groups
|
||||||
|
- Novell-tool comparison for `FLAG`, including `ALL`, `N`, `RO`, `RW`, high bits, and display layout
|
||||||
|
- Novell-tool comparison for `FLAGDIR`, including `Normal`, `System`, `Hidden`, `DeleteInhibit`, `Purge`, `RenameInhibit`, and combined attributes
|
||||||
|
- Novell-tool comparison for `RIGHTS`, `GRANT`, `REVOKE`, and `REMOVE`
|
||||||
|
- CMake/Open Watcom build using binary-directory object files, so `.obj`/`.o` files are no longer written into the source tree
|
||||||
|
|
||||||
|
Still to validate or continue:
|
||||||
|
|
||||||
|
- DOSX/VLM/NETX fallback behavior for `FLAG` and `FLAGDIR`
|
||||||
|
- More complex `FLAGDIR` paths beyond the simple mapped-directory cases already tested
|
||||||
|
- OS/2 requester/tool behavior
|
||||||
|
- Additional Novell-like utilities such as `NDIR`, `PURGE`, and `SALVAGE`
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Login and logout against an NCP server
|
||||||
|
- Password change support
|
||||||
|
- DOS drive mapping and unmapping
|
||||||
|
- Search-path management (`PATH`, `PATHINS`, `PATHDEL`)
|
||||||
|
- Printer capture and release (`CAPTURE`, `ENDCAP`)
|
||||||
|
- Scripted session setup through command files
|
||||||
|
- 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
|
||||||
|
- Developer diagnostics through `TESTS`
|
||||||
|
|
||||||
|
## Available commands
|
||||||
|
|
||||||
|
The current command dispatcher includes these built-ins:
|
||||||
|
|
||||||
|
- `LOGIN`
|
||||||
|
- `LOGOUT`
|
||||||
|
- `PASSWD`
|
||||||
|
- `PROFILE`
|
||||||
|
- `SPAWN`
|
||||||
|
- `EXEC`
|
||||||
|
- `MAP`
|
||||||
|
- `MAPDEL`
|
||||||
|
- `PATH`
|
||||||
|
- `PATHINS`
|
||||||
|
- `PATHDEL`
|
||||||
|
- `CAPTURE`
|
||||||
|
- `ENDCAP`
|
||||||
|
- `SLIST`
|
||||||
|
- `NDIR`
|
||||||
|
- `FLAG`
|
||||||
|
- `FLAGDIR`
|
||||||
|
- `RIGHTS`
|
||||||
|
- `GRANT`
|
||||||
|
- `REVOKE`
|
||||||
|
- `REMOVE`
|
||||||
|
- `DEBUG`
|
||||||
|
- `ECHO`
|
||||||
|
- `CD`
|
||||||
|
- `TESTS` developer/testing only
|
||||||
|
|
||||||
|
The CMake install rules also install the multi-call `net.exe` under several of those command names.
|
||||||
|
|
||||||
|
## How it works
|
||||||
|
|
||||||
|
The program resolves the command from either:
|
||||||
|
|
||||||
|
1. the executable name itself, or
|
||||||
|
2. the first command-line argument.
|
||||||
|
|
||||||
|
That means all of the following styles are valid:
|
||||||
|
|
||||||
|
```text
|
||||||
|
NET LOGIN alice secret
|
||||||
|
NET MAP F:=SYS:
|
||||||
|
NET FLAG LOGIN.EXE
|
||||||
|
LOGIN.EXE alice secret
|
||||||
|
MAP.EXE F:=SYS:
|
||||||
|
FLAG.EXE LOGIN.EXE A
|
||||||
|
CAPTURE.EXE LPT1 Q1
|
||||||
|
```
|
||||||
|
|
||||||
|
## Client32 NCP support
|
||||||
|
|
||||||
|
The modern Client32 path is implemented through a small reusable helper layer:
|
||||||
|
|
||||||
|
- `c32ncp.c`
|
||||||
|
- `c32ncp.h`
|
||||||
|
- Client32 assembly entry points in `kern_wasm.asm`
|
||||||
|
|
||||||
|
The working sequence is:
|
||||||
|
|
||||||
|
```text
|
||||||
|
C32_MapVar_Probe(4,0)
|
||||||
|
-> obtains the active connection reference
|
||||||
|
|
||||||
|
C32_OpenRef_Probe()
|
||||||
|
-> opens that reference and returns a Client32 handle
|
||||||
|
|
||||||
|
C32_NCP87_Raw5_Probe()
|
||||||
|
-> 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 is now preferred for the validated FLAG-family and trustee operations.
|
||||||
|
|
||||||
|
## Command reference
|
||||||
|
|
||||||
|
### `LOGIN`
|
||||||
|
|
||||||
|
Authenticate to an NCP server as a user.
|
||||||
|
|
||||||
|
```text
|
||||||
|
LOGIN [-u] [user | user password]
|
||||||
|
```
|
||||||
|
|
||||||
|
- `-u` forces the older unencrypted login path.
|
||||||
|
- If no username is provided, the tool prompts interactively.
|
||||||
|
- If no password is provided, it prompts for one after the username.
|
||||||
|
- Successful login clears and rebuilds NetWare search-path state before running a local post-login script named `login` from the executable directory.
|
||||||
|
|
||||||
|
### `LOGOUT`
|
||||||
|
|
||||||
|
Log out from the current NCP session.
|
||||||
|
|
||||||
|
The implementation also removes configured network search paths before performing logout.
|
||||||
|
|
||||||
|
### `PASSWD`
|
||||||
|
|
||||||
|
Change a user password.
|
||||||
|
|
||||||
|
```text
|
||||||
|
PASSWD [user]
|
||||||
|
```
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
### `PROFILE`
|
||||||
|
|
||||||
|
Execute a command script.
|
||||||
|
|
||||||
|
```text
|
||||||
|
PROFILE <filename>
|
||||||
|
```
|
||||||
|
|
||||||
|
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`
|
||||||
|
|
||||||
|
Run an external program and wait for it to finish.
|
||||||
|
|
||||||
|
### `EXEC`
|
||||||
|
|
||||||
|
Execute an external program using overlay-style execution.
|
||||||
|
|
||||||
|
Both commands share the same implementation and differ only in whether they use `spawnvp(..., P_WAIT, ...)` or `execvp(...)`.
|
||||||
|
|
||||||
|
### `MAP`
|
||||||
|
|
||||||
|
List current drive mappings or map a DOS drive letter to a network path.
|
||||||
|
|
||||||
|
```text
|
||||||
|
MAP [d:[=[path]]]
|
||||||
|
```
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
```text
|
||||||
|
MAP
|
||||||
|
MAP F:=SYS:
|
||||||
|
MAP H:=HOME:
|
||||||
|
```
|
||||||
|
|
||||||
|
The implementation lists active mappings, distinguishes local vs. redirected drives, and uses DOS-style drive letters.
|
||||||
|
|
||||||
|
### `MAPDEL`
|
||||||
|
|
||||||
|
Remove an existing drive mapping.
|
||||||
|
|
||||||
|
```text
|
||||||
|
MAPDEL d:
|
||||||
|
```
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```text
|
||||||
|
MAPDEL F:
|
||||||
|
```
|
||||||
|
|
||||||
|
### `PATH`
|
||||||
|
|
||||||
|
List or set a search-path entry.
|
||||||
|
|
||||||
|
```text
|
||||||
|
PATH sn:[=[path]]
|
||||||
|
```
|
||||||
|
|
||||||
|
Where `sn` is `s1` through `s16`.
|
||||||
|
|
||||||
|
### `PATHINS`
|
||||||
|
|
||||||
|
Insert a search-path entry instead of overwriting one.
|
||||||
|
|
||||||
|
```text
|
||||||
|
PATHINS sn:[=[path]]
|
||||||
|
```
|
||||||
|
|
||||||
|
### `PATHDEL`
|
||||||
|
|
||||||
|
Delete a search-path entry.
|
||||||
|
|
||||||
|
```text
|
||||||
|
PATHDEL sn:
|
||||||
|
```
|
||||||
|
|
||||||
|
### `CAPTURE`
|
||||||
|
|
||||||
|
List printer captures or redirect a local printer device to a queue.
|
||||||
|
|
||||||
|
Typical usage:
|
||||||
|
|
||||||
|
```text
|
||||||
|
CAPTURE [device [queue]]
|
||||||
|
```
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
```text
|
||||||
|
CAPTURE
|
||||||
|
CAPTURE LPT1 Q1
|
||||||
|
CAPTURE PRN Q1
|
||||||
|
```
|
||||||
|
|
||||||
|
`PRN` is normalized to `LPT1` internally. The command can also display existing captures.
|
||||||
|
|
||||||
|
### `ENDCAP`
|
||||||
|
|
||||||
|
Cancel a printer redirection.
|
||||||
|
|
||||||
|
Typical usage:
|
||||||
|
|
||||||
|
```text
|
||||||
|
ENDCAP device
|
||||||
|
```
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```text
|
||||||
|
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`
|
||||||
|
|
||||||
|
Set mars_nwe debug levels for selected server-side modules.
|
||||||
|
|
||||||
|
```text
|
||||||
|
DEBUG NCPSERV|NWCONN|NWBIND level
|
||||||
|
```
|
||||||
|
|
||||||
|
- `level` must be between `0` and `99`.
|
||||||
|
- This requires the matching mars_nwe server-side debug call to be enabled.
|
||||||
|
|
||||||
|
### `ECHO`
|
||||||
|
|
||||||
|
Print a string, mainly for use inside profile/login scripts.
|
||||||
|
|
||||||
|
### `CD`
|
||||||
|
|
||||||
|
Change the current DOS directory. It also adjusts the active drive if a drive-qualified path is supplied.
|
||||||
|
|
||||||
|
### `TESTS`
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
A particularly important feature is the automatic execution of a file named `login` located beside the executable after a successful login.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```text
|
||||||
|
map f:=SYS:
|
||||||
|
map h:=home:
|
||||||
|
map z:=SYS:PUBLIC
|
||||||
|
path s16:=z:.
|
||||||
|
capture lpt1 q1
|
||||||
|
profile h:\profile
|
||||||
|
```
|
||||||
|
|
||||||
|
This makes the tool suite useful not just for authentication, but for setting up a full DOS network session: drive mappings, search paths, printer capture, and then a user-specific profile script.
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
### Historical DOS build
|
||||||
|
|
||||||
|
The included `makefile.bcc` is the primary historical build file and targets Borland C / Borland tools on DOS.
|
||||||
|
|
||||||
|
Key settings from the makefile:
|
||||||
|
|
||||||
|
- compiler: `bcc`
|
||||||
|
- linker: `bcc`
|
||||||
|
- assembler: `tasm`
|
||||||
|
- memory model: `-ml`
|
||||||
|
- define: `-Dmsdos`
|
||||||
|
- output: `net.exe`
|
||||||
|
|
||||||
|
The historical object list includes the original C sources plus `kern.asm`.
|
||||||
|
|
||||||
|
### CMake / Open Watcom maintainer build
|
||||||
|
|
||||||
|
The modern CMake build can rebuild `net.exe` with Open Watcom v2 on Linux.
|
||||||
|
|
||||||
|
Configure with:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cmake -S . -B build -DMARS_NWE_BUILD_DOSUTILS=ON
|
||||||
|
cmake --build build
|
||||||
|
```
|
||||||
|
|
||||||
|
The CMake build:
|
||||||
|
|
||||||
|
- assembles `kern_wasm.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
|
||||||
|
|
||||||
|
The install rules deploy the same binary multiple times into `SYS/public`, including:
|
||||||
|
|
||||||
|
- `net.exe`
|
||||||
|
- `login.exe`
|
||||||
|
- `profile.exe`
|
||||||
|
- `spawn.exe`
|
||||||
|
- `passwd.exe`
|
||||||
|
- `path.exe`
|
||||||
|
- `pathins.exe`
|
||||||
|
- `pathdel.exe`
|
||||||
|
- `map.exe`
|
||||||
|
- `mapdel.exe`
|
||||||
|
- `logout.exe`
|
||||||
|
- `slist.exe`
|
||||||
|
- `ndir.exe`
|
||||||
|
- `flag.exe`
|
||||||
|
- `flagdir.exe`
|
||||||
|
- `rights.exe`
|
||||||
|
- `grant.exe`
|
||||||
|
- `revoke.exe`
|
||||||
|
- `remove.exe`
|
||||||
|
- `capture.exe`
|
||||||
|
- `endcap.exe`
|
||||||
|
|
||||||
|
They also install selected copies such as `login.exe`, `map.exe`, and `slist.exe` into `SYS/login` where appropriate.
|
||||||
|
|
||||||
|
## Development notes
|
||||||
|
|
||||||
|
- `kern_wasm.asm` is the 16-bit Open Watcom assembly implementation used by the modern build.
|
||||||
|
- `kern.c` was an experimental C-side test wrapper and is no longer required by the current Client32 FLAG/FLAGDIR path.
|
||||||
|
- `c32ncp.c` and `c32ncp.h` contain reusable Client32 NCP helper functions for DOS tools.
|
||||||
|
- `trustee.c` and `trustee.h` contain shared 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
|
||||||
|
|
||||||
|
This is legacy DOS networking code from the mid-1990s, and a few caveats are worth keeping in mind:
|
||||||
|
|
||||||
|
- The code is tightly coupled to DOS, IPX/NCP behavior, and mars_nwe/NetWare requester semantics.
|
||||||
|
- Client32 support has been validated for the FLAG-family and trustee/right tools, but not yet generalized to every command.
|
||||||
|
- DOSX/VLM/NETX fallback testing is still pending.
|
||||||
|
- `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.
|
||||||
|
|
||||||
|
## Historical metadata
|
||||||
|
|
||||||
|
From the included project metadata:
|
||||||
|
|
||||||
|
- project: `mars_dosutils`
|
||||||
|
- version: `0.10`
|
||||||
|
- entered: `21-May-96`
|
||||||
|
- keywords: `mars_nwe`, `dos`, `dosemu`
|
||||||
|
- platforms: `DOS`, `DOSEMU`
|
||||||
|
- author/maintainer: Martin Stover
|
||||||
|
|
||||||
|
## 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.
|
||||||
|
|
||||||
|
|
||||||
|
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.
|
||||||
131
c32ncp.h
Normal file
131
c32ncp.h
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
/* c32ncp.h - minimal Client32 NCP helpers for mars-dosutils */
|
||||||
|
|
||||||
|
#ifndef C32NCP_H
|
||||||
|
#define C32NCP_H
|
||||||
|
int c32_get_ncp_handle(uint16 *handle_lo, uint16 *handle_hi);
|
||||||
|
|
||||||
|
int c32_ncp87_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 c32_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;
|
||||||
|
} C32_DOS_MODIFY_INFO;
|
||||||
|
|
||||||
|
typedef struct c32_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];
|
||||||
|
} C32_NDIR_INFO;
|
||||||
|
|
||||||
|
int c32_ncp87_obtain_ndir_info(const char *path_name,
|
||||||
|
uint16 dir_handle,
|
||||||
|
C32_NDIR_INFO *info_out,
|
||||||
|
uint16 *actual_out,
|
||||||
|
uint16 *handle_lo_out,
|
||||||
|
uint16 *handle_hi_out);
|
||||||
|
|
||||||
|
|
||||||
|
int c32_ncp87_modify_dos_attributes(char *name,
|
||||||
|
uint16 dir_handle,
|
||||||
|
uint32 attrs,
|
||||||
|
uint16 *actual_out,
|
||||||
|
uint16 *handle_lo_out,
|
||||||
|
uint16 *handle_hi_out);
|
||||||
|
|
||||||
|
int c32_ncp87_modify_dos_info(const char *name,
|
||||||
|
uint16 dir_handle,
|
||||||
|
uint32 change_mask,
|
||||||
|
C32_DOS_MODIFY_INFO *info,
|
||||||
|
uint16 *actual_out,
|
||||||
|
uint16 *handle_lo_out,
|
||||||
|
uint16 *handle_hi_out);
|
||||||
|
|
||||||
|
int c32_ncp87_get_effective_rights(const char *path,
|
||||||
|
uint16 dir_handle,
|
||||||
|
uint16 *rights_out,
|
||||||
|
uint16 *actual_out,
|
||||||
|
uint16 *handle_lo_out,
|
||||||
|
uint16 *handle_hi_out);
|
||||||
|
|
||||||
|
|
||||||
|
int c32_ncp87_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 c32_ncp87_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 c32_ncp22_set_trustee_rights(const char *path_name,
|
||||||
|
uint16 dir_handle,
|
||||||
|
uint32 object_id,
|
||||||
|
uint16 rights);
|
||||||
|
|
||||||
|
int c32_ncp22_delete_trustee_rights(const char *path_name,
|
||||||
|
uint16 dir_handle,
|
||||||
|
uint32 object_id);
|
||||||
|
|
||||||
|
int c32_ncp87_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 c32_ncp87_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
|
||||||
80
capture.c
Normal file
80
capture.c
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
/* capture.c 05-Apr-96 */
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany *
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
#include "net.h"
|
||||||
|
|
||||||
|
static int usage(void)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "usage:\t%s level\n", funcname);
|
||||||
|
fprintf(stderr, "\tlevel=0 .. 99\n" );
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int parse_argv(uint8 *devname, uint8 *queuename,
|
||||||
|
int argc, char *argv[], int parsemode)
|
||||||
|
{
|
||||||
|
int k = 0;
|
||||||
|
*devname = '\0';
|
||||||
|
*queuename = '\0';
|
||||||
|
while (++k < argc) {
|
||||||
|
uint8 *p = argv[k];
|
||||||
|
if (k == 1) {
|
||||||
|
strmaxcpy(devname, p, 20);
|
||||||
|
upstr(devname);
|
||||||
|
if (!strcmp(devname, "PRN"))
|
||||||
|
strcpy(devname, "LPT1");
|
||||||
|
} else if (k == 2) {
|
||||||
|
strmaxcpy(queuename, p, 20);
|
||||||
|
upstr(queuename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int do_capture(uint8 *drvstr, uint8 *queuestr, int delete)
|
||||||
|
{
|
||||||
|
int result = redir_device_drive(delete ? -1 : 0x3, drvstr, queuestr);
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int show_capture(uint8 *drvstr)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
int k =-1;
|
||||||
|
uint8 devname[20];
|
||||||
|
uint8 remotename[130];
|
||||||
|
int devicetyp;
|
||||||
|
while ((result = list_redir(++k, &devicetyp, devname, remotename)) > -1){
|
||||||
|
if (result > -1 && devicetyp == 0x3) {
|
||||||
|
upstr(devname);
|
||||||
|
upstr(remotename);
|
||||||
|
if (!drvstr || !*drvstr || !strcmp(devname, drvstr))
|
||||||
|
fprintf(stdout, "%-10s captured to %s\n", devname, remotename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
int func_capture(int argc, char *argv[], int mode)
|
||||||
|
{
|
||||||
|
uint8 devname [22];
|
||||||
|
uint8 queuestr[22];
|
||||||
|
if (!parse_argv(devname, queuestr, argc, argv, mode)) {
|
||||||
|
int result=0;
|
||||||
|
if (*queuestr || mode == 1) {
|
||||||
|
result=do_capture(devname, queuestr, mode);
|
||||||
|
if (result< 0)
|
||||||
|
fprintf(stderr, "capture error:%d, device:%s \n", result, devname);
|
||||||
|
}
|
||||||
|
if (mode != 1)
|
||||||
|
show_capture(devname);
|
||||||
|
else if (result > -1)
|
||||||
|
fprintf(stdout, "Capture of %s removed\n", devname);
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
524
creator.c
Normal file
524
creator.c
Normal file
@@ -0,0 +1,524 @@
|
|||||||
|
/* 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 "c32ncp.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
|
||||||
|
|
||||||
|
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 creator_get_current_drive(void)
|
||||||
|
{
|
||||||
|
REGS regs;
|
||||||
|
|
||||||
|
regs.h.ah = 0x19;
|
||||||
|
int86(0x21, ®s, ®s);
|
||||||
|
return((int)regs.h.al);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int creator_current_dhandle(uint8 *dhandle)
|
||||||
|
{
|
||||||
|
uint8 connid = 0;
|
||||||
|
uint8 flags = 0;
|
||||||
|
int drive;
|
||||||
|
|
||||||
|
drive = creator_get_current_drive();
|
||||||
|
if (get_drive_info((uint8)drive, &connid, dhandle, &flags))
|
||||||
|
return(-1);
|
||||||
|
if (!connid || (flags & 0x80))
|
||||||
|
return(-1);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
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 = ncp_17_35(namebuf, BINDERY_USER);
|
||||||
|
if (id)
|
||||||
|
return(id);
|
||||||
|
id = ncp_17_35(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, ®s, ®s);
|
||||||
|
year = regs.x.cx;
|
||||||
|
month = regs.h.dh;
|
||||||
|
day = regs.h.dl;
|
||||||
|
|
||||||
|
regs.h.ah = 0x2c;
|
||||||
|
int86(0x21, ®s, ®s);
|
||||||
|
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 copy_ncp22_name(uint8 *dst, char *src, uint8 *len_out)
|
||||||
|
{
|
||||||
|
char tmp[260];
|
||||||
|
int len;
|
||||||
|
|
||||||
|
if (!dst || !len_out) return(-1);
|
||||||
|
if (!src) src = "";
|
||||||
|
tool_upcopy(tmp, src, sizeof(tmp));
|
||||||
|
if (strchr(tmp, '\\') || strchr(tmp, '/') || strchr(tmp, ':'))
|
||||||
|
return(-1);
|
||||||
|
len = strlen(tmp);
|
||||||
|
if (len < 1 || len > 12)
|
||||||
|
return(-1);
|
||||||
|
memcpy(dst, tmp, len);
|
||||||
|
*len_out = (uint8)len;
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
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 (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 int show_info(char *name, uint8 dhandle)
|
||||||
|
{
|
||||||
|
C32_NDIR_INFO info;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
memset(&info, 0, sizeof(info));
|
||||||
|
rc = c32_ncp87_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);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stdout, "File: %s\n", name);
|
||||||
|
fprintf(stdout, "Attributes: 0x%08lX\n", (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: 0x%04X\n", (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 (creator_current_dhandle(&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);
|
||||||
|
}
|
||||||
173
dlystrt.c
Normal file
173
dlystrt.c
Normal file
@@ -0,0 +1,173 @@
|
|||||||
|
/* dlystrt.c - maintainer-only delayed DOS command starter.
|
||||||
|
*
|
||||||
|
* This is a tiny TSR helper for login/logout tests. It waits a short
|
||||||
|
* time, then stuffs a command line into the BIOS keyboard buffer. The
|
||||||
|
* command is therefore executed by the command processor after the batch
|
||||||
|
* file that installed DLYSTRT has already returned to the DOS prompt.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* DLYSTRT /T:2 C:\\LGNTC.BAT
|
||||||
|
*
|
||||||
|
* The tool is intended for MAINTAINER_BUILD only and is not installed in
|
||||||
|
* normal builds.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <dos.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <i86.h>
|
||||||
|
|
||||||
|
#ifndef MAINTAINER_BUILD
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
puts("DLYSTRT is only available in maintainer builds.");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define MAX_CMD 126
|
||||||
|
#define BIOS_SEG 0x0040
|
||||||
|
#define KB_HEAD 0x001a
|
||||||
|
#define KB_TAIL 0x001c
|
||||||
|
#define KB_BUF 0x001e
|
||||||
|
#define KB_END 0x003e
|
||||||
|
|
||||||
|
typedef void (__interrupt __far *intr_fn)(void);
|
||||||
|
|
||||||
|
static intr_fn old_int1c;
|
||||||
|
static volatile unsigned wait_ticks;
|
||||||
|
static volatile unsigned pos;
|
||||||
|
static volatile unsigned done;
|
||||||
|
static char command[MAX_CMD + 3];
|
||||||
|
|
||||||
|
static int strnicmp_local(const char *a, const char *b, int n)
|
||||||
|
{
|
||||||
|
int ca, cb;
|
||||||
|
while (n-- > 0) {
|
||||||
|
ca = toupper((unsigned char)*a++);
|
||||||
|
cb = toupper((unsigned char)*b++);
|
||||||
|
if (ca != cb || ca == 0 || cb == 0) return ca - cb;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int kb_put_char(char ch)
|
||||||
|
{
|
||||||
|
unsigned far *headp = (unsigned far *)MK_FP(BIOS_SEG, KB_HEAD);
|
||||||
|
unsigned far *tailp = (unsigned far *)MK_FP(BIOS_SEG, KB_TAIL);
|
||||||
|
unsigned far *bufp;
|
||||||
|
unsigned head = *headp;
|
||||||
|
unsigned tail = *tailp;
|
||||||
|
unsigned next = tail + 2;
|
||||||
|
|
||||||
|
if (next >= KB_END) next = KB_BUF;
|
||||||
|
if (next == head) return 0; /* keyboard buffer full */
|
||||||
|
|
||||||
|
bufp = (unsigned far *)MK_FP(BIOS_SEG, tail);
|
||||||
|
*bufp = (unsigned)((unsigned char)ch); /* scan code 0, ASCII ch */
|
||||||
|
*tailp = next;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void raw_restore_vector(void)
|
||||||
|
{
|
||||||
|
intr_fn __far *vecp;
|
||||||
|
|
||||||
|
if (!old_int1c) return;
|
||||||
|
|
||||||
|
/* Do not call DOS from the timer interrupt. Restore the IVT entry
|
||||||
|
* directly, then leave the TSR out of the interrupt path before the
|
||||||
|
* delayed command is executed.
|
||||||
|
*/
|
||||||
|
_disable();
|
||||||
|
vecp = (intr_fn __far *)MK_FP(0x0000, 0x1c * 4);
|
||||||
|
*vecp = old_int1c;
|
||||||
|
_enable();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __interrupt __far dly_int1c(void)
|
||||||
|
{
|
||||||
|
intr_fn prev = old_int1c;
|
||||||
|
|
||||||
|
if (!done) {
|
||||||
|
if (wait_ticks) {
|
||||||
|
wait_ticks--;
|
||||||
|
} else {
|
||||||
|
if (command[pos]) {
|
||||||
|
if (kb_put_char(command[pos])) pos++;
|
||||||
|
} else {
|
||||||
|
/* One-shot: unhook before pressing Enter so the command that gets
|
||||||
|
* started by COMMAND.COM runs without DLYSTRT still sitting on INT 1Ch.
|
||||||
|
*/
|
||||||
|
done = 1;
|
||||||
|
raw_restore_vector();
|
||||||
|
kb_put_char('\r');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (prev) prev();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void usage(void)
|
||||||
|
{
|
||||||
|
puts("Usage: DLYSTRT [/T:seconds] command [args]");
|
||||||
|
puts("Maintainer helper: delay-start a command after returning to DOS.");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void build_command(int argc, char **argv, int first)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
command[0] = '\0';
|
||||||
|
for (i = first; i < argc; i++) {
|
||||||
|
if (command[0]) strncat(command, " ", MAX_CMD - strlen(command));
|
||||||
|
strncat(command, argv[i], MAX_CMD - strlen(command));
|
||||||
|
}
|
||||||
|
command[MAX_CMD] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
unsigned seconds = 2;
|
||||||
|
int first = 1;
|
||||||
|
unsigned paras;
|
||||||
|
|
||||||
|
if (argc < 2) {
|
||||||
|
usage();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strnicmp_local(argv[first], "/T:", 3)) {
|
||||||
|
seconds = (unsigned)atoi(argv[first] + 3);
|
||||||
|
if (seconds == 0) seconds = 1;
|
||||||
|
first++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (first >= argc) {
|
||||||
|
usage();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
build_command(argc, argv, first);
|
||||||
|
wait_ticks = seconds * 18;
|
||||||
|
pos = 0;
|
||||||
|
done = 0;
|
||||||
|
|
||||||
|
old_int1c = _dos_getvect(0x1c);
|
||||||
|
_dos_setvect(0x1c, dly_int1c);
|
||||||
|
|
||||||
|
printf("DLYSTRT installed: %s\n", command);
|
||||||
|
|
||||||
|
/* Keep a small fixed amount resident. This maintainer helper is tiny;
|
||||||
|
* 256 paragraphs = 4 KiB is enough for code, data and the command buffer
|
||||||
|
* in the small DOS model used here.
|
||||||
|
*/
|
||||||
|
paras = 256;
|
||||||
|
_dos_keep(0, paras);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* MAINTAINER_BUILD */
|
||||||
46
doc
46
doc
@@ -1,46 +0,0 @@
|
|||||||
/* DOC for NET.EXE */
|
|
||||||
This is a short description of net.exe which is a simple DOS-client
|
|
||||||
programm to allow standard NCP network actions, mainly for mars_nwe.
|
|
||||||
All functions are called as a second parameter.
|
|
||||||
This programm is very incomplete till now, but some functions
|
|
||||||
works well with mars_nwe.
|
|
||||||
|
|
||||||
LOGOUT:
|
|
||||||
Logout from a NCP Server.
|
|
||||||
|
|
||||||
LOGIN:
|
|
||||||
usage: LOGIN [-u] [user | user password]
|
|
||||||
-u = use unencrypted password.
|
|
||||||
With this function you can log into a NCP Server.
|
|
||||||
Its only make a login, no mappings or something else.
|
|
||||||
|
|
||||||
If you want a login similar to NOVELL's login.exe you should
|
|
||||||
do it with a batch job.
|
|
||||||
|
|
||||||
example:
|
|
||||||
[\LOGIN\LOGIN.BAT]
|
|
||||||
@echo OFF
|
|
||||||
net logout
|
|
||||||
net login %1 %2 %3
|
|
||||||
if errorlevel 1 goto :end
|
|
||||||
map h:=HOME:
|
|
||||||
if not exist h:\profile.bat goto :end
|
|
||||||
h:
|
|
||||||
profile.bat
|
|
||||||
:end
|
|
||||||
|
|
||||||
PASSWD:
|
|
||||||
usage: PASSWD [user]
|
|
||||||
With this function you are able to change a users password.
|
|
||||||
This call uses the old unencryted change password call !!
|
|
||||||
|
|
||||||
|
|
||||||
PATH:
|
|
||||||
usage: PATH sn:[=[path]]
|
|
||||||
sn = 's1' .. 's16'
|
|
||||||
|
|
||||||
With this function a new path element can be created.
|
|
||||||
Its only sets the path environment.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
93
doc/README
Normal file
93
doc/README
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
/* DOC for NET.EXE */
|
||||||
|
/* last updated: 21-May-96 */
|
||||||
|
This is a short description of net.exe which is a simple DOS-client
|
||||||
|
program to allow standard NCP network actions, mainly for mars_nwe.
|
||||||
|
All functions are called as a second parameter, or if the program
|
||||||
|
is renamed to a guilty function like login.exe then the function
|
||||||
|
will be the progname. This is very usefull for login.exe.
|
||||||
|
|
||||||
|
This program is very incomplete till now, but some functions
|
||||||
|
works well with mars_nwe.
|
||||||
|
|
||||||
|
|
||||||
|
LOGIN:
|
||||||
|
usage: LOGIN [-u] [user | user password]
|
||||||
|
-u = use unencrypted password.
|
||||||
|
With this function you can log into a NCP Server.
|
||||||
|
If there exists a 'login' file in the same directory as
|
||||||
|
net.exe resides then this file will be interpreted as a
|
||||||
|
command file. You also can use command files with
|
||||||
|
the PROFILE command.
|
||||||
|
It is usefull to copy (or do a Linux link) net.exe to login.exe.
|
||||||
|
|
||||||
|
example for a 'login' script (resides in same directory as net.exe)
|
||||||
|
|
||||||
|
map f:=SYS:
|
||||||
|
map h:=home:
|
||||||
|
map z:=SYS:PUBLIC
|
||||||
|
path s16:=z:.
|
||||||
|
capture lpt1 q1
|
||||||
|
profile h:\profile # will call users home 'profile'
|
||||||
|
|
||||||
|
if not exist h:\profile.bat goto :end
|
||||||
|
|
||||||
|
|
||||||
|
PROFILE:
|
||||||
|
usage: PROFILE filename
|
||||||
|
With this function you are able to run a command script.
|
||||||
|
In this command script you can use every net.exe command.
|
||||||
|
|
||||||
|
SPAWN:
|
||||||
|
With SPAWN you can start external programs.
|
||||||
|
|
||||||
|
PASSWD:
|
||||||
|
usage: PASSWD [user]
|
||||||
|
With this function you are able to change a users password.
|
||||||
|
This call uses the old unencryted change password call !!
|
||||||
|
|
||||||
|
PATH:
|
||||||
|
usage: PATH sn:[=[path]]
|
||||||
|
sn = 's1' .. 's16'
|
||||||
|
|
||||||
|
With this function a new path element can be created.
|
||||||
|
Its only sets the path environment !
|
||||||
|
|
||||||
|
PATHINS:
|
||||||
|
usage: PATHINS sn:[=[path]]
|
||||||
|
sn = 's1' .. 's16'
|
||||||
|
like PATH, but inserts PATH, not overwrites.
|
||||||
|
|
||||||
|
PATHDEL:
|
||||||
|
usage: PATHDEL sn:
|
||||||
|
sn = 's1' .. 's16'
|
||||||
|
deletes PATH element
|
||||||
|
|
||||||
|
MAP:
|
||||||
|
usage: MAP [d:[=[path]]]
|
||||||
|
d = 'A' .. 'Z'
|
||||||
|
Maps a drive to a volume or volume/path.
|
||||||
|
|
||||||
|
|
||||||
|
MAPDEL:
|
||||||
|
usage: MAPDEL d:
|
||||||
|
d = 'A' .. 'Z'
|
||||||
|
Removes a map.
|
||||||
|
|
||||||
|
|
||||||
|
LOGOUT:
|
||||||
|
Logout from a NCP Server.
|
||||||
|
|
||||||
|
DEBUG:
|
||||||
|
For setting debug flag in mars_nwe processes.
|
||||||
|
If you want to use this, you must set
|
||||||
|
mars_nwe/config.h: FUNC_17_02_IS_DEBUG to '1'
|
||||||
|
|
||||||
|
|
||||||
|
SPAWN:
|
||||||
|
EXEC:
|
||||||
|
external program execution spawning or overlayed.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
0
kern.asm → doc/kern.asm
Executable file → Normal file
0
kern.asm → doc/kern.asm
Executable file → Normal file
2
makefile → doc/makefile.bcc
Executable file → Normal file
2
makefile → doc/makefile.bcc
Executable file → Normal file
@@ -21,7 +21,7 @@ RM = del
|
|||||||
ASMODS= kern$(O)
|
ASMODS= kern$(O)
|
||||||
CCMODS= tools$(O) netcall$(O) ncpcall$(O) \
|
CCMODS= tools$(O) netcall$(O) ncpcall$(O) \
|
||||||
login$(O) map$(O) slist$(O) nwcrypt$(O) \
|
login$(O) map$(O) slist$(O) nwcrypt$(O) \
|
||||||
nwdebug$(O) nwtests$(O)
|
nwdebug$(O) nwtests$(O) capture$(O)
|
||||||
|
|
||||||
all: net$(E)
|
all: net$(E)
|
||||||
|
|
||||||
16
doc/mars_dosutils.lsm
Normal file
16
doc/mars_dosutils.lsm
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
Begin3
|
||||||
|
Title: mars_dosutils
|
||||||
|
Version: 0.10
|
||||||
|
Entered-date: 21-May-96
|
||||||
|
|
||||||
|
Description: Simple DOS client program specially
|
||||||
|
for mars_nwe.
|
||||||
|
Supports login, map, capture, passwd
|
||||||
|
Binary + sourcen
|
||||||
|
Keywords: novell, netware, client, ipx, ncp, mars_nwe
|
||||||
|
Author: mstover@freeway.de (Martin Stover)
|
||||||
|
Maintained-by: mstover@freeway.de (Martin Stover)
|
||||||
|
Primary-site: ftp.gwdg.de:/pub/linux/misc/ncpfs
|
||||||
|
60kB mars_dosutils-0.10.tgz
|
||||||
|
Platforms: DOS, DOSEMU
|
||||||
|
End
|
||||||
712
flag.c
Normal file
712
flag.c
Normal file
@@ -0,0 +1,712 @@
|
|||||||
|
/* flag.c - Novell FLAG-like DOS utility, stage 1 */
|
||||||
|
|
||||||
|
#include "net.h"
|
||||||
|
#include "c32ncp.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 void flag_put_word_lh(uint8 *p, uint16 v)
|
||||||
|
{
|
||||||
|
p[0] = (uint8)(v & 0xff);
|
||||||
|
p[1] = (uint8)((v >> 8) & 0xff);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void flag_put_dword_lh(uint8 *p, uint32 v)
|
||||||
|
{
|
||||||
|
p[0] = (uint8)(v & 0xff);
|
||||||
|
p[1] = (uint8)((v >> 8) & 0xff);
|
||||||
|
p[2] = (uint8)((v >> 16) & 0xff);
|
||||||
|
p[3] = (uint8)((v >> 24) & 0xff);
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint32 flag_get_dword_lh(uint8 *p)
|
||||||
|
{
|
||||||
|
return((uint32)p[0] |
|
||||||
|
((uint32)p[1] << 8) |
|
||||||
|
((uint32)p[2] << 16) |
|
||||||
|
((uint32)p[3] << 24));
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
flag_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 (c32_ncp87_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 */
|
||||||
|
flag_put_word_lh(p, FLAG_SA_ALL); p += 2;
|
||||||
|
flag_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 = flag_get_dword_lh(repl.data);
|
||||||
|
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int flag_copy_ncp22_name(uint8 *dst, char *src, uint8 *len_out)
|
||||||
|
{
|
||||||
|
char tmp[260];
|
||||||
|
int len;
|
||||||
|
|
||||||
|
if (!dst || !len_out)
|
||||||
|
return(-1);
|
||||||
|
if (!src)
|
||||||
|
src = "";
|
||||||
|
|
||||||
|
tool_upcopy(tmp, src, sizeof(tmp));
|
||||||
|
if (strchr(tmp, '\\') || strchr(tmp, '/') || strchr(tmp, ':'))
|
||||||
|
return(-1);
|
||||||
|
|
||||||
|
len = strlen(tmp);
|
||||||
|
if (len < 1 || len > 12)
|
||||||
|
return(-1);
|
||||||
|
|
||||||
|
memcpy(dst, tmp, len);
|
||||||
|
*len_out = (uint8)len;
|
||||||
|
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 (flag_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 = flag_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 (flag_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 (!c32_ncp87_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 */
|
||||||
|
flag_put_word_lh(p, FLAG_SA_ALL); p += 2;
|
||||||
|
|
||||||
|
flag_put_dword_lh(p, FLAG_DM_ATTRIBUTES); p += 4; /* modify mask: DM_ATTRIBUTES */
|
||||||
|
flag_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);
|
||||||
|
}
|
||||||
321
flagdir.c
Normal file
321
flagdir.c
Normal file
@@ -0,0 +1,321 @@
|
|||||||
|
/* flagdir.c - Novell FLAGDIR-like DOS utility, Client32 version */
|
||||||
|
|
||||||
|
#include "net.h"
|
||||||
|
#include "c32ncp.h"
|
||||||
|
#include <dos.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)
|
||||||
|
|
||||||
|
#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_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[90];
|
||||||
|
|
||||||
|
tool_upcopy(up, path, sizeof(up));
|
||||||
|
|
||||||
|
if (tool_current_prefix(prefix, sizeof(prefix)))
|
||||||
|
prefix[0] = '\0';
|
||||||
|
|
||||||
|
fprintf(stdout, "%s%s \n", prefix, up);
|
||||||
|
}
|
||||||
|
|
||||||
|
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 (c32_ncp87_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 (c32_ncp87_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 *ncp_path;
|
||||||
|
uint32 attrs;
|
||||||
|
uint32 newattrs;
|
||||||
|
|
||||||
|
if (!fd_is_directory(path)) {
|
||||||
|
fprintf(stderr, "Directory %s not found.\n", path);
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
ncp_path = tool_is_current_path(path) ? "" : path;
|
||||||
|
|
||||||
|
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");
|
||||||
|
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");
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
attrs = newattrs;
|
||||||
|
fd_obtain(ncp_path, dhandle, &attrs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (show_header)
|
||||||
|
fd_display(display_path, attrs);
|
||||||
|
else
|
||||||
|
fd_display_row(display_path, attrs);
|
||||||
|
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
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));
|
||||||
|
}
|
||||||
437
grant.c
Normal file
437
grant.c
Normal file
@@ -0,0 +1,437 @@
|
|||||||
|
/* grant.c - Novell GRANT-like DOS utility, first Client32 implementation */
|
||||||
|
|
||||||
|
#include "net.h"
|
||||||
|
#include "c32ncp.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_header_path(char *out, char *path, int max)
|
||||||
|
{
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
tool_header_path(out, path, max);
|
||||||
|
|
||||||
|
/* Novell GRANT displays server and volume as SERVER/SYS: while
|
||||||
|
* RIGHTS uses SERVER\SYS:. Keep the rest of the path with DOS
|
||||||
|
* backslashes. */
|
||||||
|
p = strchr(out, '\\');
|
||||||
|
if (p && strchr(out, ':') && p < strchr(out, ':'))
|
||||||
|
*p = '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
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 = c32_ncp22_set_trustee_rights(path, dhandle, object_id, rights);
|
||||||
|
if (rc) {
|
||||||
|
rc = c32_ncp87_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 = ncp_17_35(namebuf, objtype);
|
||||||
|
if (!object_id) {
|
||||||
|
char header[300];
|
||||||
|
|
||||||
|
grant_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];
|
||||||
|
|
||||||
|
grant_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];
|
||||||
|
|
||||||
|
grant_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);
|
||||||
|
}
|
||||||
30
kern.h
Executable file → Normal file
30
kern.h
Executable file → Normal file
@@ -1,12 +1,28 @@
|
|||||||
/* kern.h Assembler Routinen 20-Nov-93 */
|
/* kern.h Assembler Routinen 20-Nov-93 */
|
||||||
extern int IPXinit(void);
|
#if defined(__WATCOMC__)
|
||||||
extern int IPXopen_socket(UI sock, int live);
|
#define KERN_CALL _Cdecl
|
||||||
extern void IPXclose_socket(UI sock);
|
#else
|
||||||
extern int IPXlisten(ECB *ecb);
|
#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 asm_esr_routine(void);
|
||||||
extern void esr_routine(ECB *ecb);
|
extern void esr_routine(ECB *ecb);
|
||||||
extern void xmemmove(void *ziel, void *quelle, UI anz);
|
extern void KERN_CALL xmemmove(void *ziel, void *quelle, UI anz);
|
||||||
extern int Net_Call(UI func, void *req, void *repl);
|
extern int KERN_CALL Net_Call(UI func, void *req, void *repl);
|
||||||
|
extern int KERN_CALL C32_MapVar_Probe(UI specLen, UI flag, void *outbuf);
|
||||||
|
extern int KERN_CALL C32_OpenRef_Probe(UI refLo, UI refHi, void *outbuf);
|
||||||
|
extern int KERN_CALL C32_NCP87_Raw5_Probe(UI connLo, UI connHi,
|
||||||
|
void *hdr, UI hdrLen,
|
||||||
|
void *path, UI pathLen,
|
||||||
|
void *rep0, UI rep0Len,
|
||||||
|
void *rep1, UI rep1Len,
|
||||||
|
void *outbuf);
|
||||||
|
#undef KERN_CALL
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
317
kern.lst
317
kern.lst
@@ -1,317 +0,0 @@
|
|||||||
Turbo Assembler Version 3.1 28/04/96 13:28:50 Page 1
|
|
||||||
kern.asm
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
1 ; kern.asm: 20-Nov-93, 21:52
|
|
||||||
2 IDEAL
|
|
||||||
3 P286
|
|
||||||
4 0000 MODEL LARGE
|
|
||||||
5 ; Fuer Turboc gerettet werden muessen folgende Register:
|
|
||||||
6 ; BP, SS, SP, DS, CS u. SI, DI
|
|
||||||
7
|
|
||||||
8 MACRO P_START
|
|
||||||
9 push bp
|
|
||||||
10 mov bp, sp
|
|
||||||
11 ENDM
|
|
||||||
12
|
|
||||||
13 MACRO P_END
|
|
||||||
14 pop bp
|
|
||||||
15 ENDM
|
|
||||||
16
|
|
||||||
17 MACRO PUSH_REGS
|
|
||||||
18 push ds
|
|
||||||
19 push si
|
|
||||||
20 push di
|
|
||||||
21 ENDM
|
|
||||||
22
|
|
||||||
23 MACRO POP_REGS
|
|
||||||
24 pop di
|
|
||||||
25 pop si
|
|
||||||
26 pop ds
|
|
||||||
27 ENDM
|
|
||||||
28
|
|
||||||
29 ;; EXTRN _esr_routine:FAR
|
|
||||||
30
|
|
||||||
31 PUBLIC _IPXinit;
|
|
||||||
32 PUBLIC _IPXopen_socket;
|
|
||||||
33 PUBLIC _IPXclose_socket;
|
|
||||||
34 PUBLIC _IPXlisten;
|
|
||||||
35 ;; PUBLIC _asm_esr_routine;
|
|
||||||
36 PUBLIC _xmemmove;
|
|
||||||
37 PUBLIC _Net_Call;
|
|
||||||
38
|
|
||||||
39 0000 DATASEG
|
|
||||||
40 0000 0000FFFE enterIPX DD FAR
|
|
||||||
41
|
|
||||||
42 0004 CODESEG
|
|
||||||
43 0000 PROC _IPXinit;
|
|
||||||
44 P_START
|
|
||||||
1 45 0000 55 push bp
|
|
||||||
1 46 0001 8B EC mov bp, sp
|
|
||||||
47 PUSH_REGS
|
|
||||||
1 48 0003 1E push ds
|
|
||||||
1 49 0004 56 push si
|
|
||||||
1 50 0005 57 push di
|
|
||||||
51 0006 B8 7A00 mov ax, 7A00h
|
|
||||||
52 0009 CD 2F int 2Fh
|
|
||||||
53 000B 3C FF cmp al, 0FFh
|
|
||||||
54 000D 75 10 jne @@fertig
|
|
||||||
55 000F B9 0000s mov cx, @data
|
|
||||||
56 0012 8E D9 mov ds, cx
|
|
||||||
57 0014 89 3E 0000r mov [WORD PTR enterIPX], di
|
|
||||||
Turbo Assembler Version 3.1 28/04/96 13:28:50 Page 2
|
|
||||||
kern.asm
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
58 0018 8C C0 mov ax, es
|
|
||||||
59 001A A3 0002r mov [WORD PTR enterIPX+2], ax
|
|
||||||
60 001D B0 01 mov al, 1 ; OK
|
|
||||||
61 001F @@fertig:
|
|
||||||
62 001F B4 00 mov ah, 0
|
|
||||||
63 POP_REGS
|
|
||||||
1 64 0021 5F pop di
|
|
||||||
1 65 0022 5E pop si
|
|
||||||
1 66 0023 1F pop ds
|
|
||||||
67 P_END
|
|
||||||
1 68 0024 5D pop bp
|
|
||||||
69 0025 CB ret ; OK = 1 ; nicht ok = 0
|
|
||||||
70 0026 ENDP
|
|
||||||
71
|
|
||||||
72 0026 PROC _xmemmove;
|
|
||||||
73 ARG z:DATAPTR, q:DATAPTR, nmbr:WORD; Argumente
|
|
||||||
74 0026 FA cli ; Disable Interrupts
|
|
||||||
75 0027 55 push bp
|
|
||||||
76 0028 8B EC mov bp,sp
|
|
||||||
77 002A 8B 4E 0E mov cx, [nmbr];
|
|
||||||
78 002D 0B C9 or cx, cx;
|
|
||||||
79 002F 74 1F jz @@fertig; Anzahl ist 0;
|
|
||||||
80 0031 1E push ds;
|
|
||||||
81 0032 56 push si;
|
|
||||||
82 0033 57 push di;
|
|
||||||
83 0034 9C pushf
|
|
||||||
84 0035 C5 76 0A lds si, [q] ; Quelle
|
|
||||||
85 0038 C4 7E 06 les di, [z] ; Ziel
|
|
||||||
86 003B 3B FE cmp di, si ;
|
|
||||||
87 003D 7C 0A jl @@L1 ; Ziel ist kleiner
|
|
||||||
88 003F FD std ; Richtungsflag setzen
|
|
||||||
89 0040 49 dec cx
|
|
||||||
90 0041 03 F9 add di, cx ; Von oben nach unten kopieren
|
|
||||||
91 0043 03 F1 add si, cx ;
|
|
||||||
92 0045 41 inc cx ; alten Wert wiederherstellen
|
|
||||||
93 0046 EB 02 90 jmp @@L2;
|
|
||||||
94 0049 @@L1:
|
|
||||||
95 0049 FC cld ; Richtungsflag loeschen
|
|
||||||
96 004A @@L2: ; und nun das eigentliche kopieren
|
|
||||||
97 004A F3> A4 REP movsb ;
|
|
||||||
98 004C 9D popf
|
|
||||||
99 004D 5F pop di;
|
|
||||||
100 004E 5E pop si;
|
|
||||||
101 004F 1F pop ds;
|
|
||||||
102 0050 @@fertig:
|
|
||||||
103 0050 5D pop bp;
|
|
||||||
104 0051 FB sti ; enable Interrupts
|
|
||||||
105 0052 CB ret
|
|
||||||
106 0053 ENDP
|
|
||||||
107
|
|
||||||
108 0053 PROC _IPXopen_socket;
|
|
||||||
109 ARG sock:WORD, live:WORD
|
|
||||||
110 P_START
|
|
||||||
1 111 0053 55 push bp
|
|
||||||
1 112 0054 8B EC mov bp, sp
|
|
||||||
113 PUSH_REGS
|
|
||||||
1 114 0056 1E push ds
|
|
||||||
Turbo Assembler Version 3.1 28/04/96 13:28:50 Page 3
|
|
||||||
kern.asm
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
1 115 0057 56 push si
|
|
||||||
1 116 0058 57 push di
|
|
||||||
117 0059 8B 46 08 mov ax, [live]
|
|
||||||
118 005C 8B 56 06 mov dx, [sock]
|
|
||||||
119 005F BB 0000s mov bx, @data
|
|
||||||
120 0062 8E DB mov ds, bx
|
|
||||||
121 0064 BB 0000 mov bx, 0
|
|
||||||
122 0067 FF 1E 0000r call [enterIPX]
|
|
||||||
123 006B 3C FF cmp al, 0FFh
|
|
||||||
124 006D 75 06 jne @@L1
|
|
||||||
125 006F B8 FFFF mov ax, -1 ; Socket already open
|
|
||||||
126 0072 EB 0D 90 jmp @@L3
|
|
||||||
127 0075 @@L1:
|
|
||||||
128 0075 3C FE cmp al, 0FEh
|
|
||||||
129 0077 75 06 jne @@L2
|
|
||||||
130 0079 B8 FFFE mov ax, -2 ; Socket Table full
|
|
||||||
131 007C EB 03 90 jmp @@L3
|
|
||||||
132 007F @@L2:
|
|
||||||
133 007F 8B C2 mov ax, dx
|
|
||||||
134 0081 @@L3:
|
|
||||||
135 POP_REGS
|
|
||||||
1 136 0081 5F pop di
|
|
||||||
1 137 0082 5E pop si
|
|
||||||
1 138 0083 1F pop ds
|
|
||||||
139 P_END
|
|
||||||
1 140 0084 5D pop bp
|
|
||||||
141 0085 CB ret
|
|
||||||
142 0086 ENDP
|
|
||||||
143
|
|
||||||
144 0086 PROC _IPXclose_socket;
|
|
||||||
145 ARG sock:WORD
|
|
||||||
146 P_START
|
|
||||||
1 147 0086 55 push bp
|
|
||||||
1 148 0087 8B EC mov bp, sp
|
|
||||||
149 PUSH_REGS
|
|
||||||
1 150 0089 1E push ds
|
|
||||||
1 151 008A 56 push si
|
|
||||||
1 152 008B 57 push di
|
|
||||||
153 008C 8B 56 06 mov dx, [sock]
|
|
||||||
154 008F BB 0000s mov bx, @data
|
|
||||||
155 0092 8E DB mov ds, bx
|
|
||||||
156 0094 BB 0001 mov bx, 1
|
|
||||||
157 0097 FF 1E 0000r call [enterIPX]
|
|
||||||
158 POP_REGS
|
|
||||||
1 159 009B 5F pop di
|
|
||||||
1 160 009C 5E pop si
|
|
||||||
1 161 009D 1F pop ds
|
|
||||||
162 P_END
|
|
||||||
1 163 009E 5D pop bp
|
|
||||||
164 009F CB ret
|
|
||||||
165 00A0 ENDP
|
|
||||||
166
|
|
||||||
167 00A0 PROC _IPXlisten;
|
|
||||||
168 ARG ecb:DATAPTR
|
|
||||||
169 P_START
|
|
||||||
1 170 00A0 55 push bp
|
|
||||||
1 171 00A1 8B EC mov bp, sp
|
|
||||||
Turbo Assembler Version 3.1 28/04/96 13:28:50 Page 4
|
|
||||||
kern.asm
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
172 PUSH_REGS
|
|
||||||
1 173 00A3 1E push ds
|
|
||||||
1 174 00A4 56 push si
|
|
||||||
1 175 00A5 57 push di
|
|
||||||
176 00A6 C4 76 06 les si, [ecb] ; Adresse ecb
|
|
||||||
177 00A9 BB 0000s mov bx, @data
|
|
||||||
178 00AC 8E DB mov ds, bx
|
|
||||||
179 00AE BB 0004 mov bx, 4
|
|
||||||
180 00B1 FF 1E 0000r call [enterIPX]
|
|
||||||
181 POP_REGS
|
|
||||||
1 182 00B5 5F pop di
|
|
||||||
1 183 00B6 5E pop si
|
|
||||||
1 184 00B7 1F pop ds
|
|
||||||
185 P_END
|
|
||||||
1 186 00B8 5D pop bp
|
|
||||||
187 00B9 B4 00 mov ah, 0
|
|
||||||
188 00BB CB ret
|
|
||||||
189 00BC ENDP
|
|
||||||
190
|
|
||||||
191 ;; PROC _asm_esr_routine;
|
|
||||||
192 ;; push bp;
|
|
||||||
193 ;; PUSH_REGS;
|
|
||||||
194 ;; mov ax, @data
|
|
||||||
195 ;; mov ds, ax ; F<>r C PROGRAMM
|
|
||||||
196 ;; push es; Adressegment vom EBC
|
|
||||||
197 ;; push si; Adressoffset vom ECB
|
|
||||||
198 ;; call _esr_routine; C ROUTINE
|
|
||||||
199 ;; pop si;
|
|
||||||
200 ;; pop es;
|
|
||||||
201 ;; POP_REGS;
|
|
||||||
202 ;; pop bp;
|
|
||||||
203 ;; cli ; no Interrupt says NOVELL
|
|
||||||
204 ;; ret
|
|
||||||
205 ;; ENDP
|
|
||||||
206
|
|
||||||
207
|
|
||||||
208 00BC PROC _Net_Call;
|
|
||||||
209 ARG func:WORD, req:DATAPTR, repl:DATAPTR; Argumente
|
|
||||||
210 00BC 55 push bp
|
|
||||||
211 00BD 8B EC mov bp, sp
|
|
||||||
212 00BF 8B 46 06 mov ax, [func];
|
|
||||||
213 00C2 1E push ds;
|
|
||||||
214 00C3 56 push si;
|
|
||||||
215 00C4 57 push di;
|
|
||||||
216 00C5 9C pushf
|
|
||||||
217 00C6 C5 76 08 lds si, [req] ; Request
|
|
||||||
218 00C9 C4 7E 0C les di, [repl] ; Reply
|
|
||||||
219 00CC CD 21 int 21h
|
|
||||||
220 00CE 9D popf
|
|
||||||
221 00CF 5F pop di;
|
|
||||||
222 00D0 5E pop si;
|
|
||||||
223 00D1 1F pop ds;
|
|
||||||
224 00D2 5D pop bp;
|
|
||||||
225 00D3 B4 00 mov ah, 0
|
|
||||||
226 00D5 CB ret
|
|
||||||
227 00D6 ENDP
|
|
||||||
228
|
|
||||||
Turbo Assembler Version 3.1 28/04/96 13:28:50 Page 5
|
|
||||||
kern.asm
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
229 END
|
|
||||||
Turbo Assembler Version 3.1 28/04/96 13:28:50 Page 6
|
|
||||||
Symbol Table
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Symbol Name Type Value
|
|
||||||
|
|
||||||
??DATE Text "28/04/96"
|
|
||||||
??FILENAME Text "kern "
|
|
||||||
??TIME Text "13:28:50"
|
|
||||||
??VERSION Number 030A
|
|
||||||
@32BIT Text 0
|
|
||||||
@@FERTIG Near KERN_TEXT:001F
|
|
||||||
@@FERTIG Near KERN_TEXT:0050
|
|
||||||
@@L1 Near KERN_TEXT:0049
|
|
||||||
@@L1 Near KERN_TEXT:0075
|
|
||||||
@@L2 Near KERN_TEXT:004A
|
|
||||||
@@L2 Near KERN_TEXT:007F
|
|
||||||
@@L3 Near KERN_TEXT:0081
|
|
||||||
@CODE Text KERN_TEXT
|
|
||||||
@CODESIZE Text 1
|
|
||||||
@CPU Text 0787H
|
|
||||||
@CURSEG Text KERN_TEXT
|
|
||||||
@DATA Text DGROUP
|
|
||||||
@DATASIZE Text 1
|
|
||||||
@FILENAME Text KERN
|
|
||||||
@INTERFACE Text 00H
|
|
||||||
@MODEL Text 5
|
|
||||||
@STACK Text DGROUP
|
|
||||||
@WORDSIZE Text 2
|
|
||||||
ECB Number [DGROUP:BP+0006]
|
|
||||||
ENTERIPX Dword DGROUP:0000
|
|
||||||
FUNC Number [DGROUP:BP+0006]
|
|
||||||
LIVE Number [DGROUP:BP+0008]
|
|
||||||
NMBR Number [DGROUP:BP+000E]
|
|
||||||
Q Number [DGROUP:BP+000A]
|
|
||||||
REPL Number [DGROUP:BP+000C]
|
|
||||||
REQ Number [DGROUP:BP+0008]
|
|
||||||
SOCK Number [DGROUP:BP+0006]
|
|
||||||
Z Number [DGROUP:BP+0006]
|
|
||||||
_IPXCLOSE_SOCKET + Far KERN_TEXT:0086
|
|
||||||
(_IPXclose_socket)
|
|
||||||
_IPXINIT (_IPXinit) Far KERN_TEXT:0000
|
|
||||||
_IPXLISTEN (_IPXlisten) Far KERN_TEXT:00A0
|
|
||||||
_IPXOPEN_SOCKET + Far KERN_TEXT:0053
|
|
||||||
(_IPXopen_socket)
|
|
||||||
_NET_CALL (_Net_Call) Far KERN_TEXT:00BC
|
|
||||||
_XMEMMOVE (_xmemmove) Far KERN_TEXT:0026
|
|
||||||
|
|
||||||
Macro Name
|
|
||||||
|
|
||||||
POP_REGS
|
|
||||||
PUSH_REGS
|
|
||||||
P_END
|
|
||||||
P_START
|
|
||||||
|
|
||||||
Groups & Segments Bit Size Align Combine Class
|
|
||||||
|
|
||||||
DGROUP Group
|
|
||||||
_DATA 16 0004 Word Public DATA
|
|
||||||
KERN_TEXT 16 00D6 Word Public CODE
|
|
||||||
|
|
||||||
964
kern_wasm.asm
Normal file
964
kern_wasm.asm
Normal file
@@ -0,0 +1,964 @@
|
|||||||
|
; kern_wasm.asm
|
||||||
|
;
|
||||||
|
; Open Watcom WASM/MASM-syntax port of the old TASM IDEAL kern.asm.
|
||||||
|
; 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
|
||||||
|
; reproducible Open Watcom build.
|
||||||
|
|
||||||
|
.286
|
||||||
|
.model large
|
||||||
|
|
||||||
|
.data
|
||||||
|
enterIPX dd 0
|
||||||
|
|
||||||
|
.code
|
||||||
|
|
||||||
|
public _IPXinit
|
||||||
|
public _IPXopen_socket
|
||||||
|
public _IPXclose_socket
|
||||||
|
public _IPXlisten
|
||||||
|
public _xmemmove
|
||||||
|
public _Net_Call
|
||||||
|
public _C32_NCP87_Raw5_Probe
|
||||||
|
public _C32_OpenRef_Probe
|
||||||
|
public _C32_MapVar_Probe
|
||||||
|
_IPXinit proc far
|
||||||
|
push bp
|
||||||
|
mov bp, sp
|
||||||
|
push ds
|
||||||
|
push si
|
||||||
|
push di
|
||||||
|
|
||||||
|
mov ax, 7A00h
|
||||||
|
int 2Fh
|
||||||
|
cmp al, 0FFh
|
||||||
|
jne ipxinit_done
|
||||||
|
|
||||||
|
mov cx, @data
|
||||||
|
mov ds, cx
|
||||||
|
mov word ptr enterIPX, di
|
||||||
|
mov ax, es
|
||||||
|
mov word ptr enterIPX+2, ax
|
||||||
|
mov al, 1
|
||||||
|
|
||||||
|
ipxinit_done:
|
||||||
|
mov ah, 0
|
||||||
|
|
||||||
|
pop di
|
||||||
|
pop si
|
||||||
|
pop ds
|
||||||
|
pop bp
|
||||||
|
ret
|
||||||
|
_IPXinit endp
|
||||||
|
|
||||||
|
_xmemmove proc far
|
||||||
|
push bp
|
||||||
|
mov bp, sp
|
||||||
|
|
||||||
|
; far procedure stack layout, large model:
|
||||||
|
; [bp+0] old bp
|
||||||
|
; [bp+2] return offset
|
||||||
|
; [bp+4] return segment
|
||||||
|
; [bp+6] z offset
|
||||||
|
; [bp+8] z segment
|
||||||
|
; [bp+10] q offset
|
||||||
|
; [bp+12] q segment
|
||||||
|
; [bp+14] nmbr
|
||||||
|
|
||||||
|
cli
|
||||||
|
mov cx, [bp+14]
|
||||||
|
or cx, cx
|
||||||
|
jz xmem_done
|
||||||
|
|
||||||
|
push ds
|
||||||
|
push si
|
||||||
|
push di
|
||||||
|
pushf
|
||||||
|
|
||||||
|
lds si, dword ptr [bp+10]
|
||||||
|
les di, dword ptr [bp+6]
|
||||||
|
cmp di, si
|
||||||
|
jl xmem_forward
|
||||||
|
|
||||||
|
std
|
||||||
|
dec cx
|
||||||
|
add di, cx
|
||||||
|
add si, cx
|
||||||
|
inc cx
|
||||||
|
jmp xmem_copy
|
||||||
|
|
||||||
|
xmem_forward:
|
||||||
|
cld
|
||||||
|
|
||||||
|
xmem_copy:
|
||||||
|
rep movsb
|
||||||
|
|
||||||
|
popf
|
||||||
|
pop di
|
||||||
|
pop si
|
||||||
|
pop ds
|
||||||
|
|
||||||
|
xmem_done:
|
||||||
|
pop bp
|
||||||
|
sti
|
||||||
|
ret
|
||||||
|
_xmemmove endp
|
||||||
|
|
||||||
|
_IPXopen_socket proc far
|
||||||
|
push bp
|
||||||
|
mov bp, sp
|
||||||
|
push ds
|
||||||
|
push si
|
||||||
|
push di
|
||||||
|
|
||||||
|
; int IPXopen_socket(UI sock, int live)
|
||||||
|
mov ax, [bp+8] ; live
|
||||||
|
mov dx, [bp+6] ; sock
|
||||||
|
mov bx, @data
|
||||||
|
mov ds, bx
|
||||||
|
mov bx, 0
|
||||||
|
call dword ptr enterIPX
|
||||||
|
|
||||||
|
cmp al, 0FFh
|
||||||
|
jne ipxopen_not_already
|
||||||
|
mov ax, -1 ; socket already open
|
||||||
|
jmp ipxopen_done
|
||||||
|
|
||||||
|
ipxopen_not_already:
|
||||||
|
cmp al, 0FEh
|
||||||
|
jne ipxopen_ok
|
||||||
|
mov ax, -2 ; socket table full
|
||||||
|
jmp ipxopen_done
|
||||||
|
|
||||||
|
ipxopen_ok:
|
||||||
|
mov ax, dx
|
||||||
|
|
||||||
|
ipxopen_done:
|
||||||
|
pop di
|
||||||
|
pop si
|
||||||
|
pop ds
|
||||||
|
pop bp
|
||||||
|
ret
|
||||||
|
_IPXopen_socket endp
|
||||||
|
|
||||||
|
_IPXclose_socket proc far
|
||||||
|
push bp
|
||||||
|
mov bp, sp
|
||||||
|
push ds
|
||||||
|
push si
|
||||||
|
push di
|
||||||
|
|
||||||
|
; void IPXclose_socket(UI sock)
|
||||||
|
mov dx, [bp+6]
|
||||||
|
mov bx, @data
|
||||||
|
mov ds, bx
|
||||||
|
mov bx, 1
|
||||||
|
call dword ptr enterIPX
|
||||||
|
|
||||||
|
pop di
|
||||||
|
pop si
|
||||||
|
pop ds
|
||||||
|
pop bp
|
||||||
|
ret
|
||||||
|
_IPXclose_socket endp
|
||||||
|
|
||||||
|
_IPXlisten proc far
|
||||||
|
push bp
|
||||||
|
mov bp, sp
|
||||||
|
push ds
|
||||||
|
push si
|
||||||
|
push di
|
||||||
|
|
||||||
|
; int IPXlisten(ECB *ecb)
|
||||||
|
les si, dword ptr [bp+6]
|
||||||
|
mov bx, @data
|
||||||
|
mov ds, bx
|
||||||
|
mov bx, 4
|
||||||
|
call dword ptr enterIPX
|
||||||
|
|
||||||
|
pop di
|
||||||
|
pop si
|
||||||
|
pop ds
|
||||||
|
pop bp
|
||||||
|
mov ah, 0
|
||||||
|
ret
|
||||||
|
_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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; int C32_OpenRef_Probe(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
|
||||||
|
_C32_OpenRef_Probe 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
|
||||||
|
|
||||||
|
_C32_OpenRef_Probe endp
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; int C32_MapVar_Probe(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
|
||||||
|
_C32_MapVar_Probe 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
|
||||||
|
|
||||||
|
_C32_MapVar_Probe endp
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; int C32_NCP87_Raw5_Probe(UI connLo, UI connHi,
|
||||||
|
; void *hdr, UI hdrLen,
|
||||||
|
; void *path, UI pathLen,
|
||||||
|
; void *rep0, UI rep0Len,
|
||||||
|
; void *rep1, UI rep1Len,
|
||||||
|
; void *outbuf)
|
||||||
|
;
|
||||||
|
; Same as C32_NCP87_Raw_Probe but uses d32wrap-compatible 5-slot
|
||||||
|
; fragment tables: 5 * 8 = 0x28 bytes for request and reply.
|
||||||
|
_C32_NCP87_Raw5_Probe 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 raw5_fail
|
||||||
|
|
||||||
|
; resolve COMPATNcpRequestReply
|
||||||
|
push cs
|
||||||
|
push offset raw5_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 raw5_have_func
|
||||||
|
jmp raw5_fail
|
||||||
|
|
||||||
|
raw5_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 raw5_store
|
||||||
|
|
||||||
|
raw5_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
|
||||||
|
|
||||||
|
raw5_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
|
||||||
|
|
||||||
|
raw5_name db 'COMPATNcpRequestReply',0
|
||||||
|
|
||||||
|
_C32_NCP87_Raw5_Probe endp
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
567
map.c
Executable file → Normal file
567
map.c
Executable file → Normal file
@@ -24,23 +24,24 @@ static void show_map(uint8 *drvstr)
|
|||||||
if ((!get_drive_info(j, &connid, &dhandle, &flags)) && flags){
|
if ((!get_drive_info(j, &connid, &dhandle, &flags)) && flags){
|
||||||
char servern[52];
|
char servern[52];
|
||||||
char path[256];
|
char path[256];
|
||||||
|
servern[0]='\0';
|
||||||
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)) {
|
||||||
strcpy(path, "DHANDLE !OK");
|
strcpy(path, "DHANDLE !OK");
|
||||||
}
|
}
|
||||||
|
if (connid) {
|
||||||
|
get_fs_name(connid, servern);
|
||||||
|
strcat(servern, "\\");
|
||||||
|
} else servern[0]='\0';
|
||||||
}
|
}
|
||||||
if (connid) {
|
if (flags & 0x80) printf("Drive %c: %s\n", (char)j+'A', path); else printf("Drive %c: = %s%s\n", (char)j+'A', servern, path);
|
||||||
get_fs_name(connid, servern);
|
|
||||||
strcat(servern, "\\");
|
|
||||||
} else servern[0]='\0';
|
|
||||||
printf("MAP %c: = %s%s\n", (char)j+'A', servern, path);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -57,9 +58,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)) {
|
||||||
@@ -76,22 +77,49 @@ static void do_map(int drive, NWPATH *nwp)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int do_map(int drive, NWPATH *nwp)
|
static int do_map(int drive, NWPATH *nwp, int delete)
|
||||||
{
|
{
|
||||||
int result = -1;
|
int result = -1;
|
||||||
|
|
||||||
if (drive > -1 && drive < 32) {
|
if (drive > -1 && drive < 32) {
|
||||||
uint8 nmdrive[3];
|
uint8 connid = 0;
|
||||||
nmdrive[0] = drive+'A';
|
uint8 dhandle = 0;
|
||||||
nmdrive[1] = ':';
|
uint8 flags = 0;
|
||||||
nmdrive[2] = '\0';
|
|
||||||
result = redir_device_drive(0x4, nmdrive, nwp->path);
|
if (delete) {
|
||||||
|
if (!get_drive_info(drive, &connid, &dhandle, &flags)
|
||||||
|
&& flags && !(flags & 0x80) && connid) {
|
||||||
|
result = dealloc_dir_handle(dhandle);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* The old mars-dosutils MAP used DOS redirector INT 21h AX=5F03h.
|
||||||
|
* NetWare Client32 returns AX=0001 for that call, while Novell MAP
|
||||||
|
* works. Use the NetWare shell/NCP "Allocate Permanent Directory
|
||||||
|
* Handle" path instead; this is what the surrounding code already
|
||||||
|
* provides via alloc_permanent_dir_handle().
|
||||||
|
*/
|
||||||
|
if (!get_drive_info(drive, &connid, &dhandle, &flags)
|
||||||
|
&& flags && !(flags & 0x80) && connid) {
|
||||||
|
(void)dealloc_dir_handle(dhandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
result = alloc_permanent_dir_handle(0, nwp->path, drive + 'A', NULL);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Some requesters historically accepted lowercase drive letters in
|
||||||
|
* this call. Keep this only as compatibility fallback.
|
||||||
|
*/
|
||||||
|
if (result < 0)
|
||||||
|
result = alloc_permanent_dir_handle(0, nwp->path, drive + 'a', NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int parse_argv(uint8 *drvstr, NWPATH *nwpath,
|
static int parse_argv(uint8 *drvstr, NWPATH *nwpath,
|
||||||
int argc, char *argv[], int smode)
|
int argc, char *argv[], int smode, int argvmode)
|
||||||
{
|
{
|
||||||
int k = 0;
|
int k = 0;
|
||||||
int mode = 0;
|
int mode = 0;
|
||||||
@@ -149,7 +177,8 @@ static int parse_argv(uint8 *drvstr, NWPATH *nwpath,
|
|||||||
} /* while *p */
|
} /* while *p */
|
||||||
} /* while k */
|
} /* while k */
|
||||||
if (mode == 30) {
|
if (mode == 30) {
|
||||||
getcwd((char *)nwpath->buff, sizeof(nwpath->buff));
|
if (argvmode != 1)
|
||||||
|
getcwd((char *)nwpath->buff, sizeof(nwpath->buff));
|
||||||
mode = 40;
|
mode = 40;
|
||||||
}
|
}
|
||||||
if (mode && mode != 20 && mode != 40) {
|
if (mode && mode != 20 && mode != 40) {
|
||||||
@@ -159,21 +188,232 @@ static int parse_argv(uint8 *drvstr, NWPATH *nwpath,
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int func_map(int argc, char *argv[])
|
|
||||||
|
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_same_arg(char *a, char *b)
|
||||||
|
{
|
||||||
|
while (*a || *b) {
|
||||||
|
int ca = *a++;
|
||||||
|
int cb = *b++;
|
||||||
|
if (ca >= 'a' && ca <= 'z') ca -= 32;
|
||||||
|
if (cb >= 'a' && cb <= 'z') cb -= 32;
|
||||||
|
if (ca != cb) return(0);
|
||||||
|
}
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int 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)
|
||||||
{
|
{
|
||||||
uint8 drvstr[22];
|
uint8 drvstr[22];
|
||||||
NWPATH nwpath;
|
NWPATH nwpath;
|
||||||
|
|
||||||
if (!ipx_init()) argc = 1;
|
if (!ipx_init()) argc = 1;
|
||||||
if (!parse_argv(drvstr, &nwpath, argc, argv, 0)) {
|
|
||||||
|
/*
|
||||||
|
* 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 (map_same_arg(argv[1], "/?") || map_same_arg(argv[1], "-?") ||
|
||||||
|
map_same_arg(argv[1], "?")) {
|
||||||
|
fprintf(stderr, "Directory \"/?\" is not locatable.\n");
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (map_same_arg(argv[1], "INS") || map_same_arg(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 (map_same_arg(argv[1], "DEL") || map_same_arg(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 (*(nwpath.path)) {
|
||||||
if (do_map(*drvstr - 'A', &nwpath)< 0)
|
if (do_map(*drvstr - 'A', &nwpath, mode)< 0)
|
||||||
fprintf(stderr, "MAP Error\n");
|
fprintf(stderr, "MAP Error\n");
|
||||||
}
|
}
|
||||||
show_map(drvstr);
|
if (mode != 1)
|
||||||
|
show_map(drvstr);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!parse_argv(drvstr, &nwpath, argc, argv, 0, mode)) {
|
||||||
|
if (*(nwpath.path) || mode==1) {
|
||||||
|
if (do_map(*drvstr - 'A', &nwpath, mode)< 0)
|
||||||
|
fprintf(stderr, "MAP Error\n");
|
||||||
|
}
|
||||||
|
if (mode != 1)
|
||||||
|
show_map(drvstr);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------- */
|
/* ------------------------------------------------- */
|
||||||
static int show_search(uint8 *drvstr)
|
static int show_search(uint8 *drvstr)
|
||||||
{
|
{
|
||||||
@@ -183,38 +423,42 @@ static int show_search(uint8 *drvstr)
|
|||||||
get_search_drive_vektor(drives);
|
get_search_drive_vektor(drives);
|
||||||
while (p->drivenummer != 0xff && j++ < 16) {
|
while (p->drivenummer != 0xff && j++ < 16) {
|
||||||
char path[256];
|
char path[256];
|
||||||
char nwname[256];
|
char nwname_path[300];
|
||||||
|
|
||||||
|
|
||||||
if ( !*drvstr || j == *(drvstr+1)) {
|
if ( !*drvstr || j == *(drvstr+1)) {
|
||||||
if (p->flags && !(p->flags & 0x80)){
|
|
||||||
get_fs_name(p->u.fs.connid, nwname);
|
if (p->drivenummer == 0xfe){
|
||||||
if (get_dir_path(p->u.fs.dhandle, path)) {
|
strcpy(path, p->dospath);
|
||||||
strcpy(path, "ERROR NW");
|
|
||||||
}
|
|
||||||
(void)xadd_char(nwname, '\\', 20);
|
|
||||||
} else {
|
} else {
|
||||||
nwname[0] = '\0';
|
*path = p->drivenummer+'A';
|
||||||
/*
|
*(path+1) = ':';
|
||||||
nwname[0] = '<';
|
strcpy(path+2, p->dospath);
|
||||||
strcpy(nwname+1, "LOCAL");
|
|
||||||
*/
|
|
||||||
if (p->drivenummer == 0xfe){
|
|
||||||
strcpy(path, p->u.d.dospath);
|
|
||||||
} else if (getcurdir((int)(p->drivenummer)+1, path)) {
|
|
||||||
strcpy(path, "ERROR DOS");
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
(void)xadd_char(nwname, '>', 20);
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
strcat(nwname, path);
|
|
||||||
printf("SEARCH%2d = %c: %s\n", j, (char)(p->drivenummer)+'A', nwname);
|
if (p->flags && !(p->flags & 0x80)){
|
||||||
|
char *pp=nwname_path;
|
||||||
|
*pp++ = '[';
|
||||||
|
get_fs_name(p->connid, pp);
|
||||||
|
pp +=strlen(pp);
|
||||||
|
*pp++='\\';
|
||||||
|
if (get_dir_path(p->dhandle, pp)) {
|
||||||
|
strcpy(pp, "ERROR NW");
|
||||||
|
}
|
||||||
|
pp += strlen(pp);
|
||||||
|
*pp ++= ']';
|
||||||
|
*pp = '\0';
|
||||||
|
} else {
|
||||||
|
*nwname_path = '\0';
|
||||||
|
}
|
||||||
|
printf("SEARCH%2d = %s %s\n", j, path, nwname_path);
|
||||||
}
|
}
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int set_search(uint8 *drvstr, NWPATH *nwp)
|
static int set_search(uint8 *drvstr, NWPATH *nwp, int pathmode)
|
||||||
{
|
{
|
||||||
int result=-1;
|
int result=-1;
|
||||||
SEARCH_VECTOR drives;
|
SEARCH_VECTOR drives;
|
||||||
@@ -222,31 +466,252 @@ static int set_search(uint8 *drvstr, NWPATH *nwp)
|
|||||||
int j=0;
|
int j=0;
|
||||||
int entry = (*drvstr=='s') ? *(drvstr+1) : 0;
|
int entry = (*drvstr=='s') ? *(drvstr+1) : 0;
|
||||||
get_search_drive_vektor(drives);
|
get_search_drive_vektor(drives);
|
||||||
|
|
||||||
while (p->drivenummer != 0xff && j++ < 16) {
|
while (p->drivenummer != 0xff && j++ < 16) {
|
||||||
if (!entry && (p->drivenummer + 'A' == *drvstr)) entry=j;
|
if (!entry && (p->drivenummer + 'A' == *drvstr)) entry=j;
|
||||||
|
if (p->drivenummer + 'A' == nwp->path[0] && nwp->path[1] == ':'
|
||||||
|
&& !strcmp(nwp->path+2, p->dospath)) {
|
||||||
|
p->drivenummer=0xfe;
|
||||||
|
*(p->dospath) = '\0';
|
||||||
|
}
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (entry > 0) {
|
if (entry > 0) {
|
||||||
if (entry > 16) entry = 16;
|
if (entry > 16) entry = 16;
|
||||||
if (--entry < j) p = drives+entry;
|
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;
|
else (p+1)->drivenummer = 0xff;
|
||||||
|
p->flags = 0;
|
||||||
p->drivenummer = 0xfe;
|
p->drivenummer = 0xfe;
|
||||||
strcpy(p->u.d.dospath, nwp->path);
|
if (pathmode==1)
|
||||||
|
*(p->dospath) = '\0';
|
||||||
|
else
|
||||||
|
strcpy(p->dospath, nwp->path);
|
||||||
result = set_search_drive_vektor(drives);
|
result = set_search_drive_vektor(drives);
|
||||||
}
|
}
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
int func_path(int argc, char *argv[])
|
|
||||||
|
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)
|
||||||
{
|
{
|
||||||
uint8 drvstr[22];
|
uint8 drvstr[22];
|
||||||
NWPATH nwpath;
|
NWPATH nwpath;
|
||||||
if (!parse_argv(drvstr, &nwpath, argc, argv, 1)) {
|
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)) result=set_search(drvstr, &nwpath);
|
if (*(nwpath.path) || mode==1)
|
||||||
show_search(drvstr);
|
result=set_search_native(drvstr, &nwpath, mode);
|
||||||
|
if (mode != 1)
|
||||||
|
show_search(drvstr);
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "Cannot interpret line. errcode=-1\n");
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void remove_nwpathes(void)
|
||||||
|
{
|
||||||
|
SEARCH_VECTOR drives;
|
||||||
|
SEARCH_VECTOR_ENTRY *p=drives;
|
||||||
|
int j=0;
|
||||||
|
get_search_drive_vektor(drives);
|
||||||
|
while (p->drivenummer != 0xff && j++ < 16) {
|
||||||
|
if (p->flags && !(p->flags & 0x80)){
|
||||||
|
p->flags=0;
|
||||||
|
p->drivenummer=0xfe;
|
||||||
|
*(p->dospath) ='\0';
|
||||||
|
}
|
||||||
|
++p;
|
||||||
|
}
|
||||||
|
set_search_drive_vektor(drives);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
103
ncpcall.c
Executable file → Normal file
103
ncpcall.c
Executable file → Normal file
@@ -283,3 +283,106 @@ int ncp_17_4b(uint8 *cryptkey, uint8 *objname, uint16 objtyp,
|
|||||||
if (neterrno) return(-1);
|
if (neterrno) return(-1);
|
||||||
return(0);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
803
ndir.c
Normal file
803
ndir.c
Normal file
@@ -0,0 +1,803 @@
|
|||||||
|
/* ndir.c - first Novell NDIR-like directory listing utility */
|
||||||
|
|
||||||
|
#include "net.h"
|
||||||
|
#include "c32ncp.h"
|
||||||
|
#include <dos.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#ifndef S_IFDIR
|
||||||
|
#define S_IFDIR 0040000
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#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
|
||||||
|
|
||||||
|
#define NDIR_OPT_FILES_ONLY 0x0001
|
||||||
|
#define NDIR_OPT_DIRS_ONLY 0x0002
|
||||||
|
#define NDIR_OPT_RIGHTS 0x0004
|
||||||
|
#define NDIR_OPT_DATES 0x0008
|
||||||
|
#define NDIR_OPT_SUB 0x0010
|
||||||
|
#define NDIR_OPT_SHORT 0x0020
|
||||||
|
|
||||||
|
/* NCP effective-rights bits returned by NCP87 subfunction 29. */
|
||||||
|
#define NDIR_NCP_RIGHT_READ 0x0001
|
||||||
|
#define NDIR_NCP_RIGHT_WRITE 0x0002
|
||||||
|
#define NDIR_NCP_RIGHT_CREATE 0x0008
|
||||||
|
#define NDIR_NCP_RIGHT_DELETE 0x0010
|
||||||
|
#define NDIR_NCP_RIGHT_OWNER 0x0020
|
||||||
|
#define NDIR_NCP_RIGHT_SEARCH 0x0040
|
||||||
|
#define NDIR_NCP_RIGHT_MODIFY 0x0080
|
||||||
|
#define NDIR_NCP_RIGHT_SUPER 0x0100
|
||||||
|
|
||||||
|
static void ndir_dos_date(unsigned date, char *out);
|
||||||
|
static void ndir_dos_datetime(unsigned date, unsigned time, char *out);
|
||||||
|
|
||||||
|
#define NDIR_OLD_RIGHT_S 0x01
|
||||||
|
#define NDIR_OLD_RIGHT_R 0x02
|
||||||
|
#define NDIR_OLD_RIGHT_W 0x04
|
||||||
|
#define NDIR_OLD_RIGHT_C 0x08
|
||||||
|
#define NDIR_OLD_RIGHT_E 0x10
|
||||||
|
#define NDIR_OLD_RIGHT_M 0x20
|
||||||
|
#define NDIR_OLD_RIGHT_F 0x40
|
||||||
|
#define NDIR_OLD_RIGHT_A 0x80
|
||||||
|
|
||||||
|
|
||||||
|
static void ndir_usage(void)
|
||||||
|
{
|
||||||
|
fprintf(stdout, "usage: NDIR [path] [/option...]\n");
|
||||||
|
fprintf(stdout, "path: [path] [filename] [,filename, ...] (up to 16 in chain)\n");
|
||||||
|
fprintf(stdout, "options: [format], [flag], [sortspec], [restriction], [FO] (files only),\n");
|
||||||
|
fprintf(stdout, " [DO] (directories only), [SUBdirectories], [Continuous], [HELP]\n");
|
||||||
|
fprintf(stdout, "\n");
|
||||||
|
fprintf(stdout, "format: DATES, RIGHTS, MACintosh, LONGnames\n");
|
||||||
|
fprintf(stdout, "\n");
|
||||||
|
fprintf(stdout, "flag: [NOT] RO, S, A, X, H, SY, T, I, P, RA, WA, CI, DI, RI\n");
|
||||||
|
fprintf(stdout, "\n");
|
||||||
|
fprintf(stdout, "sortspec: [REVerse] SORT [OWner], [SIze], [UPdate], [CReate],\n");
|
||||||
|
fprintf(stdout, " [ACcess], [ARchive], [UNsorted]\n");
|
||||||
|
fprintf(stdout, "\n");
|
||||||
|
fprintf(stdout, "restriction: OWner <operator> <name>\n");
|
||||||
|
fprintf(stdout, " SIze <operator> <number>\n");
|
||||||
|
fprintf(stdout, " UPdate <operator> <date>\n");
|
||||||
|
fprintf(stdout, " CReate <operator> <date>\n");
|
||||||
|
fprintf(stdout, " ACcess <operator> <date>\n");
|
||||||
|
fprintf(stdout, " ARchive <operator> <date>\n");
|
||||||
|
fprintf(stdout, "\n");
|
||||||
|
fprintf(stdout, "operator: [NOT] Less than, GReater than,\n");
|
||||||
|
fprintf(stdout, " EQual to, BEfore, AFter\n");
|
||||||
|
fprintf(stdout, "\n");
|
||||||
|
fprintf(stdout, "To search filenames equivalent to any of the capitalized KEYWORD options\n");
|
||||||
|
fprintf(stdout, "shown above, the filename must be preceded by a drive letter or path.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ndir_is_help(char *s)
|
||||||
|
{
|
||||||
|
if (!s) return(0);
|
||||||
|
return(tool_is_help_arg(s) || tool_strsame(s, "/HELP") ||
|
||||||
|
tool_strsame(s, "-HELP") || tool_strsame(s, "HELP"));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ndir_is_files_only(char *s)
|
||||||
|
{
|
||||||
|
if (!s) return(0);
|
||||||
|
return(tool_strsame(s, "/FO") || tool_strsame(s, "-FO") ||
|
||||||
|
tool_strsame(s, "/FILESONLY") || tool_strsame(s, "-FILESONLY") ||
|
||||||
|
tool_strsame(s, "FO") || tool_strsame(s, "FILESONLY"));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ndir_is_dirs_only(char *s)
|
||||||
|
{
|
||||||
|
if (!s) return(0);
|
||||||
|
return(tool_strsame(s, "/DO") || tool_strsame(s, "-DO") ||
|
||||||
|
tool_strsame(s, "/DIRSONLY") || tool_strsame(s, "-DIRSONLY") ||
|
||||||
|
tool_strsame(s, "/DIRECTORIES") || tool_strsame(s, "-DIRECTORIES") ||
|
||||||
|
tool_strsame(s, "DO") || tool_strsame(s, "DIRSONLY") ||
|
||||||
|
tool_strsame(s, "DIRECTORIES"));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ndir_is_continuous(char *s)
|
||||||
|
{
|
||||||
|
if (!s) return(0);
|
||||||
|
return(tool_strsame(s, "/CONTINUOUS") || tool_strsame(s, "-CONTINUOUS") ||
|
||||||
|
tool_strsame(s, "/CONTINUE") || tool_strsame(s, "-CONTINUE") ||
|
||||||
|
tool_strsame(s, "/C") || tool_strsame(s, "-C") ||
|
||||||
|
tool_strsame(s, "CONTINUOUS") || tool_strsame(s, "CONTINUE"));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ndir_is_rights(char *s)
|
||||||
|
{
|
||||||
|
if (!s) return(0);
|
||||||
|
return(tool_strsame(s, "/RIGHTS") || tool_strsame(s, "-RIGHTS") ||
|
||||||
|
tool_strsame(s, "RIGHTS"));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ndir_is_dates(char *s)
|
||||||
|
{
|
||||||
|
if (!s) return(0);
|
||||||
|
return(tool_strsame(s, "/DATES") || tool_strsame(s, "-DATES") ||
|
||||||
|
tool_strsame(s, "DATES"));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ndir_is_subdirs(char *s)
|
||||||
|
{
|
||||||
|
if (!s) return(0);
|
||||||
|
return(tool_strsame(s, "/SUB") || tool_strsame(s, "-SUB") ||
|
||||||
|
tool_strsame(s, "/SUBDIRECTORIES") || tool_strsame(s, "-SUBDIRECTORIES") ||
|
||||||
|
tool_strsame(s, "SUB") || tool_strsame(s, "SUBDIRECTORIES"));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ndir_is_short(char *s)
|
||||||
|
{
|
||||||
|
if (!s) return(0);
|
||||||
|
return(tool_strsame(s, "/SHORT") || tool_strsame(s, "-SHORT") ||
|
||||||
|
tool_strsame(s, "/BRIEF") || tool_strsame(s, "-BRIEF") ||
|
||||||
|
tool_strsame(s, "SHORT") || tool_strsame(s, "BRIEF"));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ndir_is_accepted_stub(char *s)
|
||||||
|
{
|
||||||
|
if (!s) return(0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Keep this version tolerant of common NDIR format/options so users
|
||||||
|
* can compare command lines while unimplemented formats remain harmless.
|
||||||
|
*/
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ndir_path_is_dir(char *path)
|
||||||
|
{
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
if (!path || !*path || tool_is_current_path(path))
|
||||||
|
return(1);
|
||||||
|
|
||||||
|
if (stat(path, &st) == 0) {
|
||||||
|
if (st.st_mode & S_IFDIR)
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ndir_split_spec(char *spec, char *dir, char *pat)
|
||||||
|
{
|
||||||
|
if (!spec || !*spec || tool_is_current_path(spec)) {
|
||||||
|
strmaxcpy(dir, ".", 259);
|
||||||
|
strmaxcpy(pat, "*.*", 259);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!tool_has_wildcards(spec) && ndir_path_is_dir(spec)) {
|
||||||
|
strmaxcpy(dir, spec, 259);
|
||||||
|
strmaxcpy(pat, "*.*", 259);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
tool_parent_pattern(dir, pat, spec, 260, 260);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ndir_dos_date(unsigned date, char *out)
|
||||||
|
{
|
||||||
|
int year;
|
||||||
|
int month;
|
||||||
|
int day;
|
||||||
|
|
||||||
|
year = ((date >> 9) & 0x7f) + 1980;
|
||||||
|
month = (date >> 5) & 0x0f;
|
||||||
|
day = date & 0x1f;
|
||||||
|
|
||||||
|
sprintf(out, "%02d-%02d-%02d", month, day, year % 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ndir_dos_datetime_or_blank(unsigned date, unsigned time, char *out)
|
||||||
|
{
|
||||||
|
if (!date) {
|
||||||
|
strcpy(out, "0-00-00 0:00 A");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ndir_dos_datetime(date, time, out);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ndir_dos_date_or_blank(unsigned date, char *out)
|
||||||
|
{
|
||||||
|
if (!date) {
|
||||||
|
strcpy(out, "0-00-00");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ndir_dos_date(date, out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void ndir_dos_datetime(unsigned date, unsigned time, char *out)
|
||||||
|
{
|
||||||
|
int year;
|
||||||
|
int month;
|
||||||
|
int day;
|
||||||
|
int hour;
|
||||||
|
int minute;
|
||||||
|
char ap;
|
||||||
|
|
||||||
|
year = ((date >> 9) & 0x7f) + 1980;
|
||||||
|
month = (date >> 5) & 0x0f;
|
||||||
|
day = date & 0x1f;
|
||||||
|
hour = (time >> 11) & 0x1f;
|
||||||
|
minute = (time >> 5) & 0x3f;
|
||||||
|
|
||||||
|
ap = (hour >= 12) ? 'p' : 'a';
|
||||||
|
if (hour == 0)
|
||||||
|
hour = 12;
|
||||||
|
else if (hour > 12)
|
||||||
|
hour -= 12;
|
||||||
|
|
||||||
|
sprintf(out, "%02d-%02d-%02d %2d:%02d%c",
|
||||||
|
month, day, year % 100, hour, minute, ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned long ndir_blocks_for_size(unsigned long size)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Novell NDIR reports allocated bytes/blocks. For this first DOS
|
||||||
|
* findfirst/findnext implementation, approximate with 4 KiB allocation
|
||||||
|
* units so small test files match the observed Novell output more closely.
|
||||||
|
*/
|
||||||
|
if (size == 0L)
|
||||||
|
return(0L);
|
||||||
|
|
||||||
|
return((size + 4095L) / 4096L);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ndir_flags(unsigned attr, char *out)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Keep the first positions close to Novell's default NDIR display,
|
||||||
|
* for example [RW-A------------].
|
||||||
|
*/
|
||||||
|
out[0] = '[';
|
||||||
|
out[1] = 'R';
|
||||||
|
out[2] = (attr & _A_RDONLY) ? 'O' : 'W';
|
||||||
|
out[3] = (attr & _A_SYSTEM) ? 'S' : '-';
|
||||||
|
out[4] = (attr & _A_ARCH) ? 'A' : '-';
|
||||||
|
out[5] = (attr & _A_HIDDEN) ? 'H' : '-';
|
||||||
|
memset(out + 6, '-', 11);
|
||||||
|
out[17] = ']';
|
||||||
|
out[18] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ndir_parent_path(char *dst, char *src, int max)
|
||||||
|
{
|
||||||
|
char tmp[260];
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
tool_upcopy(tmp, src, sizeof(tmp));
|
||||||
|
p = strrchr(tmp, '\\');
|
||||||
|
if (!p) p = strrchr(tmp, ':');
|
||||||
|
|
||||||
|
if (p) {
|
||||||
|
if (*p == ':') {
|
||||||
|
p[1] = '\0';
|
||||||
|
} else {
|
||||||
|
*p = '\0';
|
||||||
|
}
|
||||||
|
strmaxcpy(dst, tmp, max - 1);
|
||||||
|
} else {
|
||||||
|
dst[0] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ndir_old_rights_string(uint8 old_rights, char *out)
|
||||||
|
{
|
||||||
|
out[0] = (old_rights & NDIR_OLD_RIGHT_S) ? 'S' : '-';
|
||||||
|
out[1] = (old_rights & NDIR_OLD_RIGHT_R) ? 'R' : '-';
|
||||||
|
out[2] = (old_rights & NDIR_OLD_RIGHT_W) ? 'W' : '-';
|
||||||
|
out[3] = (old_rights & NDIR_OLD_RIGHT_C) ? 'C' : '-';
|
||||||
|
out[4] = (old_rights & NDIR_OLD_RIGHT_E) ? 'E' : '-';
|
||||||
|
out[5] = (old_rights & NDIR_OLD_RIGHT_M) ? 'M' : '-';
|
||||||
|
out[6] = (old_rights & NDIR_OLD_RIGHT_F) ? 'F' : '-';
|
||||||
|
out[7] = (old_rights & NDIR_OLD_RIGHT_A) ? 'A' : '-';
|
||||||
|
out[8] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ndir_get_ncp_info(char *path, C32_NDIR_INFO *info)
|
||||||
|
{
|
||||||
|
uint8 connid = 0;
|
||||||
|
uint8 dhandle = 0;
|
||||||
|
|
||||||
|
if (!info)
|
||||||
|
return(1);
|
||||||
|
|
||||||
|
memset(info, 0, sizeof(*info));
|
||||||
|
|
||||||
|
if (tool_current_dhandle(&connid, &dhandle))
|
||||||
|
return(1);
|
||||||
|
|
||||||
|
return(c32_ncp87_obtain_ndir_info(tool_is_current_path(path) ? "" : path,
|
||||||
|
(uint16)dhandle,
|
||||||
|
info,
|
||||||
|
NULL, NULL, NULL));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ndir_inherited_rights(char *path, char *out)
|
||||||
|
{
|
||||||
|
C32_NDIR_INFO info;
|
||||||
|
|
||||||
|
strcpy(out, "--------");
|
||||||
|
|
||||||
|
if (!ndir_get_ncp_info(path, &info))
|
||||||
|
ndir_old_rights_string((uint8)info.inherited_rights, out);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ndir_rights_string(uint16 ncp_rights, char *out)
|
||||||
|
{
|
||||||
|
out[0] = (ncp_rights & NDIR_NCP_RIGHT_SUPER) ? 'S' : '-';
|
||||||
|
out[1] = (ncp_rights & NDIR_NCP_RIGHT_READ) ? 'R' : '-';
|
||||||
|
out[2] = (ncp_rights & NDIR_NCP_RIGHT_WRITE) ? 'W' : '-';
|
||||||
|
out[3] = (ncp_rights & NDIR_NCP_RIGHT_CREATE) ? 'C' : '-';
|
||||||
|
out[4] = (ncp_rights & NDIR_NCP_RIGHT_DELETE) ? 'E' : '-';
|
||||||
|
out[5] = (ncp_rights & NDIR_NCP_RIGHT_MODIFY) ? 'M' : '-';
|
||||||
|
out[6] = (ncp_rights & NDIR_NCP_RIGHT_SEARCH) ? 'F' : '-';
|
||||||
|
out[7] = (ncp_rights & NDIR_NCP_RIGHT_OWNER) ? 'A' : '-';
|
||||||
|
out[8] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ndir_effective_rights(char *path, char *out)
|
||||||
|
{
|
||||||
|
uint8 connid = 0;
|
||||||
|
uint8 dhandle = 0;
|
||||||
|
uint8 eff_old = 0;
|
||||||
|
uint16 ncp_rights = 0;
|
||||||
|
char usepath[260];
|
||||||
|
int newhandle;
|
||||||
|
|
||||||
|
strcpy(out, "--------");
|
||||||
|
|
||||||
|
if (tool_current_dhandle(&connid, &dhandle))
|
||||||
|
return;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Prefer Client32 NCP87 effective-rights. If that fails for a listed
|
||||||
|
* entry, fall back to the older directory-handle effective-rights path
|
||||||
|
* that RIGHTS also uses.
|
||||||
|
*/
|
||||||
|
if (!c32_ncp87_get_effective_rights(tool_is_current_path(path) ? "" : path,
|
||||||
|
(uint16)dhandle,
|
||||||
|
&ncp_rights,
|
||||||
|
NULL, NULL, NULL)) {
|
||||||
|
ndir_rights_string(ncp_rights, out);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ndir_parent_path(usepath, path, sizeof(usepath));
|
||||||
|
newhandle = alloc_temp_dir_handle(dhandle, usepath, 0, &eff_old);
|
||||||
|
if (newhandle >= 0) {
|
||||||
|
dealloc_dir_handle(newhandle);
|
||||||
|
ndir_old_rights_string(eff_old, out);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (usepath[0]) {
|
||||||
|
int subdir = 1;
|
||||||
|
int r = ncp_16_02(dhandle, (uint8 *)usepath, &subdir,
|
||||||
|
NULL, NULL, NULL);
|
||||||
|
if (r >= 0)
|
||||||
|
ndir_old_rights_string((uint8)r, out);
|
||||||
|
} else {
|
||||||
|
ndir_old_rights_string(0xff, out);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ndir_is_dot_dir(char *name)
|
||||||
|
{
|
||||||
|
if (!name) return(0);
|
||||||
|
if (name[0] == '.' && name[1] == '\0') return(1);
|
||||||
|
if (name[0] == '.' && name[1] == '.' && name[2] == '\0') return(1);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ndir_print_file(char *dir, struct find_t *ff, int options,
|
||||||
|
int *line_count, int *continuous)
|
||||||
|
{
|
||||||
|
char dt[24];
|
||||||
|
char d[12];
|
||||||
|
char fl[20]; /* [RW-A------------] plus NUL */
|
||||||
|
char path[260];
|
||||||
|
char eff[10];
|
||||||
|
char inh[10];
|
||||||
|
char arch[24];
|
||||||
|
char acc[12];
|
||||||
|
char crea[24];
|
||||||
|
C32_NDIR_INFO info;
|
||||||
|
int have_info = 0;
|
||||||
|
|
||||||
|
tool_join_path(path, dir, ff->name, sizeof(path));
|
||||||
|
have_info = !ndir_get_ncp_info(path, &info);
|
||||||
|
|
||||||
|
if (have_info)
|
||||||
|
ndir_dos_datetime(info.modify_date, info.modify_time, dt);
|
||||||
|
else
|
||||||
|
ndir_dos_datetime(ff->wr_date, ff->wr_time, dt);
|
||||||
|
|
||||||
|
ndir_dos_date(ff->wr_date, d);
|
||||||
|
ndir_flags(ff->attrib, fl);
|
||||||
|
|
||||||
|
if (options & NDIR_OPT_RIGHTS) {
|
||||||
|
ndir_effective_rights(path, eff);
|
||||||
|
ndir_inherited_rights(path, inh);
|
||||||
|
fprintf(stdout, "%-16.16s %-18.18s [%8.8s] [%8.8s]\n",
|
||||||
|
ff->name, fl, inh, eff);
|
||||||
|
} else if (options & NDIR_OPT_DATES) {
|
||||||
|
/*
|
||||||
|
* DOS findfirst gives us the update timestamp only. Keep the Novell
|
||||||
|
* /DATES layout and use placeholders for archive/access data until
|
||||||
|
* full NetWare namespace date fields are available.
|
||||||
|
*/
|
||||||
|
if (have_info) {
|
||||||
|
ndir_dos_datetime_or_blank(info.archive_date, info.archive_time, arch);
|
||||||
|
ndir_dos_date_or_blank(info.last_access_date, acc);
|
||||||
|
ndir_dos_datetime_or_blank(info.creation_date, info.creation_time, crea);
|
||||||
|
fprintf(stdout, "%-16.16s %-17.17s %-17.17s %-8.8s %-17.17s\n",
|
||||||
|
ff->name, dt, arch, acc, crea);
|
||||||
|
} else {
|
||||||
|
fprintf(stdout, "%-16.16s %-17.17s 0-00-00 0:00 A %-8.8s %-17.17s\n",
|
||||||
|
ff->name, dt, d, dt);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fprintf(stdout, "%-16.16s %12lu %-17.17s %-18.18s\n",
|
||||||
|
ff->name, (unsigned long)ff->size, dt, fl);
|
||||||
|
}
|
||||||
|
|
||||||
|
tool_page_line(line_count, continuous);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ndir_print_dir(char *dir, struct find_t *ff, int options,
|
||||||
|
int *line_count, int *continuous)
|
||||||
|
{
|
||||||
|
char dt[24];
|
||||||
|
char path[260];
|
||||||
|
char eff[10];
|
||||||
|
char inh[10];
|
||||||
|
C32_NDIR_INFO info;
|
||||||
|
|
||||||
|
tool_join_path(path, dir, ff->name, sizeof(path));
|
||||||
|
if (!ndir_get_ncp_info(path, &info))
|
||||||
|
ndir_dos_datetime(info.creation_date, info.creation_time, dt);
|
||||||
|
else
|
||||||
|
ndir_dos_datetime(ff->wr_date, ff->wr_time, dt);
|
||||||
|
|
||||||
|
if (options & (NDIR_OPT_RIGHTS | NDIR_OPT_DIRS_ONLY)) {
|
||||||
|
ndir_effective_rights(path, eff);
|
||||||
|
ndir_inherited_rights(path, inh);
|
||||||
|
fprintf(stdout, "%-16.16s [%8.8s] [%8.8s] %-17.17s\n",
|
||||||
|
ff->name, inh, eff, dt);
|
||||||
|
} else {
|
||||||
|
fprintf(stdout, "%-16.16s <DIR> %-17.17s\n", ff->name, dt);
|
||||||
|
}
|
||||||
|
|
||||||
|
tool_page_line(line_count, continuous);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ndir_scan_files(char *dir, char *search, int options,
|
||||||
|
int *line_count, int *continuous,
|
||||||
|
int *file_count, unsigned long *total_bytes,
|
||||||
|
unsigned long *total_blocks)
|
||||||
|
{
|
||||||
|
struct find_t ff;
|
||||||
|
int rc;
|
||||||
|
int shown = 0;
|
||||||
|
|
||||||
|
rc = _dos_findfirst(search, _A_NORMAL | _A_RDONLY | _A_HIDDEN |
|
||||||
|
_A_SYSTEM | _A_ARCH | _A_SUBDIR, &ff);
|
||||||
|
while (rc == 0) {
|
||||||
|
if (!(ff.attrib & _A_SUBDIR)) {
|
||||||
|
ndir_print_file(dir, &ff, options, line_count, continuous);
|
||||||
|
(*file_count)++;
|
||||||
|
*total_bytes += (unsigned long)ff.size;
|
||||||
|
*total_blocks += ndir_blocks_for_size((unsigned long)ff.size);
|
||||||
|
shown = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = _dos_findnext(&ff);
|
||||||
|
}
|
||||||
|
|
||||||
|
return(shown);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ndir_scan_dirs(char *dir, char *search, int options,
|
||||||
|
int *line_count, int *continuous,
|
||||||
|
int *dir_count)
|
||||||
|
{
|
||||||
|
struct find_t ff;
|
||||||
|
int rc;
|
||||||
|
int shown = 0;
|
||||||
|
|
||||||
|
rc = _dos_findfirst(search, _A_NORMAL | _A_RDONLY | _A_HIDDEN |
|
||||||
|
_A_SYSTEM | _A_ARCH | _A_SUBDIR, &ff);
|
||||||
|
while (rc == 0) {
|
||||||
|
if ((ff.attrib & _A_SUBDIR) && !ndir_is_dot_dir(ff.name)) {
|
||||||
|
ndir_print_dir(dir, &ff, options, line_count, continuous);
|
||||||
|
(*dir_count)++;
|
||||||
|
shown = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = _dos_findnext(&ff);
|
||||||
|
}
|
||||||
|
|
||||||
|
return(shown);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ndir_list_one(char *spec, int options, int *continuous)
|
||||||
|
{
|
||||||
|
char dir[260];
|
||||||
|
char pat[260];
|
||||||
|
char search[260];
|
||||||
|
char display[300];
|
||||||
|
int got = 0;
|
||||||
|
int files_shown = 0;
|
||||||
|
int dirs_shown = 0;
|
||||||
|
int file_count = 0;
|
||||||
|
int dir_count = 0;
|
||||||
|
unsigned long total_bytes = 0L;
|
||||||
|
unsigned long total_blocks = 0L;
|
||||||
|
int line_count = 0;
|
||||||
|
|
||||||
|
ndir_split_spec(spec, dir, pat);
|
||||||
|
tool_join_path(search, dir, pat, sizeof(search));
|
||||||
|
|
||||||
|
tool_header_path(display, dir, sizeof(display));
|
||||||
|
fprintf(stdout, "%s\n", display);
|
||||||
|
tool_page_line(&line_count, continuous);
|
||||||
|
|
||||||
|
if (!(options & NDIR_OPT_DIRS_ONLY)) {
|
||||||
|
if (!(options & NDIR_OPT_SHORT)) {
|
||||||
|
if (options & NDIR_OPT_RIGHTS) {
|
||||||
|
fprintf(stdout, "Files: Flags Rights Rights Owner\n");
|
||||||
|
fprintf(stdout, "---------------- ------------------ ----------- ----------- --------\n");
|
||||||
|
} else if (options & NDIR_OPT_DATES) {
|
||||||
|
fprintf(stdout, "Files: Last Updated Last Archived Accessed Created/Copied\n");
|
||||||
|
fprintf(stdout, "---------------- ----------------- ----------------- -------- -----------------\n");
|
||||||
|
} else {
|
||||||
|
fprintf(stdout, "Files: Size Last Updated Flags Owner\n");
|
||||||
|
fprintf(stdout, "---------------- ---------------- ----------------- ------------------ --------\n");
|
||||||
|
}
|
||||||
|
tool_page_line(&line_count, continuous);
|
||||||
|
tool_page_line(&line_count, continuous);
|
||||||
|
}
|
||||||
|
|
||||||
|
files_shown = ndir_scan_files(dir, search, options, &line_count,
|
||||||
|
continuous, &file_count,
|
||||||
|
&total_bytes, &total_blocks);
|
||||||
|
if (files_shown)
|
||||||
|
got = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(options & NDIR_OPT_FILES_ONLY)) {
|
||||||
|
if (!(options & NDIR_OPT_DIRS_ONLY) && !(options & NDIR_OPT_SHORT))
|
||||||
|
fprintf(stdout, "\n");
|
||||||
|
|
||||||
|
if (!(options & NDIR_OPT_SHORT)) {
|
||||||
|
if (options & (NDIR_OPT_RIGHTS | NDIR_OPT_DIRS_ONLY)) {
|
||||||
|
fprintf(stdout, "Directories: Rights Rights Owner Created/Copied\n");
|
||||||
|
fprintf(stdout, "---------------- ----------- ----------- ----------- -----------------\n");
|
||||||
|
} else {
|
||||||
|
fprintf(stdout, "Directories:\n");
|
||||||
|
fprintf(stdout, "----------------\n");
|
||||||
|
}
|
||||||
|
tool_page_line(&line_count, continuous);
|
||||||
|
tool_page_line(&line_count, continuous);
|
||||||
|
}
|
||||||
|
|
||||||
|
dirs_shown = ndir_scan_dirs(dir, search, options, &line_count,
|
||||||
|
continuous, &dir_count);
|
||||||
|
if (dirs_shown)
|
||||||
|
got = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!got && (options & NDIR_OPT_DIRS_ONLY) && !(options & NDIR_OPT_SHORT))
|
||||||
|
fprintf(stdout, "No files of given specification found or directory is empty.\n");
|
||||||
|
|
||||||
|
if (!(options & NDIR_OPT_DIRS_ONLY)) {
|
||||||
|
if (options & NDIR_OPT_SHORT) {
|
||||||
|
if (file_count)
|
||||||
|
fprintf(stdout, " %lu bytes, %d files, %lu blocks\n",
|
||||||
|
total_bytes, file_count, total_blocks);
|
||||||
|
} else {
|
||||||
|
fprintf(stdout, "\n");
|
||||||
|
fprintf(stdout, "%12lu bytes in %5d files\n", total_bytes, file_count);
|
||||||
|
fprintf(stdout, "%12lu bytes in %5lu blocks\n", total_blocks * 4096L,
|
||||||
|
total_blocks);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return(got ? 0 : 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int ndir_spec_has_output(char *spec, int options)
|
||||||
|
{
|
||||||
|
struct find_t ff;
|
||||||
|
char dir[260];
|
||||||
|
char pat[260];
|
||||||
|
char search[260];
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
ndir_split_spec(spec, dir, pat);
|
||||||
|
tool_join_path(search, dir, pat, sizeof(search));
|
||||||
|
|
||||||
|
rc = _dos_findfirst(search, _A_NORMAL | _A_RDONLY | _A_HIDDEN |
|
||||||
|
_A_SYSTEM | _A_ARCH | _A_SUBDIR, &ff);
|
||||||
|
while (rc == 0) {
|
||||||
|
if (ff.attrib & _A_SUBDIR) {
|
||||||
|
if (!ndir_is_dot_dir(ff.name) && !(options & NDIR_OPT_FILES_ONLY))
|
||||||
|
return(1);
|
||||||
|
} else {
|
||||||
|
if (!(options & NDIR_OPT_DIRS_ONLY))
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = _dos_findnext(&ff);
|
||||||
|
}
|
||||||
|
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int ndir_list_subdirs(char *dir, char *pattern, int options,
|
||||||
|
int *continuous)
|
||||||
|
{
|
||||||
|
struct find_t ff;
|
||||||
|
char search[260];
|
||||||
|
char subdir[260];
|
||||||
|
char subspec[260];
|
||||||
|
int rc;
|
||||||
|
int result = 0;
|
||||||
|
int had_any = 0;
|
||||||
|
|
||||||
|
tool_join_path(search, dir, "*.*", sizeof(search));
|
||||||
|
|
||||||
|
rc = _dos_findfirst(search, _A_NORMAL | _A_RDONLY | _A_HIDDEN |
|
||||||
|
_A_SYSTEM | _A_ARCH | _A_SUBDIR, &ff);
|
||||||
|
while (rc == 0) {
|
||||||
|
if ((ff.attrib & _A_SUBDIR) && !ndir_is_dot_dir(ff.name)) {
|
||||||
|
tool_join_path(subdir, dir, ff.name, sizeof(subdir));
|
||||||
|
tool_join_path(subspec, subdir, pattern, sizeof(subspec));
|
||||||
|
|
||||||
|
if (!(options & NDIR_OPT_SHORT) ||
|
||||||
|
ndir_spec_has_output(subspec, options & ~NDIR_OPT_SUB)) {
|
||||||
|
fprintf(stdout, "\n");
|
||||||
|
if (ndir_list_one(subspec, options & ~NDIR_OPT_SUB, continuous))
|
||||||
|
result = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
had_any = 1;
|
||||||
|
if (ndir_list_subdirs(subdir, pattern, options, continuous))
|
||||||
|
result = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = _dos_findnext(&ff);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!had_any)
|
||||||
|
return(result);
|
||||||
|
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ndir_list(char *spec, int options, int *continuous)
|
||||||
|
{
|
||||||
|
char dir[260];
|
||||||
|
char pat[260];
|
||||||
|
int result;
|
||||||
|
|
||||||
|
result = ndir_list_one(spec, options & ~NDIR_OPT_SUB, continuous);
|
||||||
|
|
||||||
|
if (!(options & NDIR_OPT_SUB))
|
||||||
|
return(result);
|
||||||
|
|
||||||
|
ndir_split_spec(spec, dir, pat);
|
||||||
|
if (!pat[0])
|
||||||
|
strmaxcpy(pat, "*.*", sizeof(pat) - 1);
|
||||||
|
|
||||||
|
return(ndir_list_subdirs(dir, pat, options, continuous) ? 1 : result);
|
||||||
|
}
|
||||||
|
|
||||||
|
int func_ndir(int argc, char *argv[], int mode)
|
||||||
|
{
|
||||||
|
char *path = ".";
|
||||||
|
int have_path = 0;
|
||||||
|
int options = 0;
|
||||||
|
int continuous = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
(void)mode;
|
||||||
|
|
||||||
|
if (argc > 1 && ndir_is_help(argv[1])) {
|
||||||
|
ndir_usage();
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 1; i < argc; i++) {
|
||||||
|
if (ndir_is_help(argv[i])) {
|
||||||
|
ndir_usage();
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ndir_is_files_only(argv[i])) {
|
||||||
|
options |= NDIR_OPT_FILES_ONLY;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ndir_is_dirs_only(argv[i])) {
|
||||||
|
options |= NDIR_OPT_DIRS_ONLY;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ndir_is_continuous(argv[i])) {
|
||||||
|
continuous = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ndir_is_rights(argv[i])) {
|
||||||
|
options |= NDIR_OPT_RIGHTS;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ndir_is_dates(argv[i])) {
|
||||||
|
options |= NDIR_OPT_DATES;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ndir_is_subdirs(argv[i])) {
|
||||||
|
options |= NDIR_OPT_SUB;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ndir_is_short(argv[i])) {
|
||||||
|
options |= NDIR_OPT_SHORT;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ndir_is_accepted_stub(argv[i])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tool_is_option(argv[i])) {
|
||||||
|
fprintf(stdout, "Type \"ndir /help\" on the command line for usage information.\n");
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (have_path) {
|
||||||
|
fprintf(stdout, "Too many filenames in chain.\n");
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
path = argv[i];
|
||||||
|
have_path = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((options & NDIR_OPT_FILES_ONLY) && (options & NDIR_OPT_DIRS_ONLY)) {
|
||||||
|
fprintf(stdout, "No files of given specification found or directory is empty.\n");
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return(ndir_list(path, options, &continuous));
|
||||||
|
}
|
||||||
128
net.c
Executable file → Normal file
128
net.c
Executable file → Normal file
@@ -1,65 +1,121 @@
|
|||||||
/* net.c 14-Mar-96 */
|
/* net.c */
|
||||||
/* simple client programm to act with mars_nwe */
|
#define VERS_DATE "21-May-96"
|
||||||
|
/* simple client program to act with mars_nwe */
|
||||||
|
|
||||||
/****************************************************************
|
/****************************************************************
|
||||||
* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany *
|
* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany *
|
||||||
****************************************************************/
|
****************************************************************/
|
||||||
|
|
||||||
#include "net.h"
|
#include "net.h"
|
||||||
|
|
||||||
char *funcname=NULL;
|
char *funcname=NULL;
|
||||||
typedef int (*NET_FUNC)(int argc, char *argv[]);
|
char prgpath[65];
|
||||||
|
|
||||||
|
typedef int (*NET_FUNC)(int argc, char *argv[], int mode);
|
||||||
|
|
||||||
static struct s_net_functions {
|
static struct s_net_functions {
|
||||||
char *name;
|
char *name;
|
||||||
char *description;
|
char *description;
|
||||||
NET_FUNC func;
|
NET_FUNC func;
|
||||||
|
int mode;
|
||||||
} net_functions[] = {
|
} net_functions[] = {
|
||||||
{"LOGIN", "login to Server as User" , func_login },
|
|
||||||
{"MAP", "list maps and map drives" , func_map },
|
{"SPAWN", "spawn program(command file)" , func_exec , 0},
|
||||||
{"PATH", "list and set search path" , func_path },
|
{"EXEC", "execute program(command file)", func_exec , 1},
|
||||||
{"LOGOUT", "logout from Server", func_logout },
|
{"ECHO", "echoes string (command file)" , func_echo , 0},
|
||||||
#if 0
|
{"CD", "change directory (command file)" , func_cwd , 0},
|
||||||
{"SLIST", "list Servers", func_slist },
|
{"LOGIN", "login to server as user" , func_login , 0},
|
||||||
#endif
|
{"PROFILE","read command file" , func_profile, 0},
|
||||||
{"PASSWD", "change password", func_passwd },
|
{"CAPTURE","list and redirect printers" , func_capture, 0},
|
||||||
|
{"ENDCAP", "cancel redirect printers" , func_capture, 1},
|
||||||
|
{"MAP", "list maps and map drives" , func_map , 0},
|
||||||
|
{"MAPDEL", "removes maps" , func_map , 1},
|
||||||
|
{"PATH", "list and set search path" , func_path , 0},
|
||||||
|
{"PATHDEL","removes search path" , func_path , 1},
|
||||||
|
{"PATHINS","insert search path" , func_path , 2},
|
||||||
|
{"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},
|
||||||
|
{"WHOAMI", "show current NetWare user", func_whoami , 0},
|
||||||
|
{"PASSWD", "change password", func_passwd , 0},
|
||||||
#if 1
|
#if 1
|
||||||
{"TESTS", "only testroutines!", func_tests },
|
{"TESTS", "only testroutines!", func_tests , 0},
|
||||||
#endif
|
#endif
|
||||||
{"DEBUG", "set debug level, for mars_nwe only !", func_debug }
|
{"DEBUG", "set debug level, for mars_nwe only !", func_debug , 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MAX_FUNCS (sizeof(net_functions) / sizeof(struct s_net_functions))
|
#define MAX_FUNCS (sizeof(net_functions) / sizeof(struct s_net_functions))
|
||||||
|
|
||||||
|
static int get_entry_nr(char *fstr)
|
||||||
|
{
|
||||||
|
int entry = MAX_FUNCS;
|
||||||
|
char buff[200];
|
||||||
|
char funcn[100];
|
||||||
|
char *pp;
|
||||||
|
strmaxcpy(buff, fstr, sizeof(buff)-1);
|
||||||
|
korrpath(buff);
|
||||||
|
get_path_fn(buff, NULL, funcn);
|
||||||
|
pp=strrchr(funcn, '.');
|
||||||
|
if (NULL != pp) *pp = '\0';
|
||||||
|
upstr(funcn);
|
||||||
|
while (entry--) {
|
||||||
|
if (!strcmp(funcn, net_functions[entry].name)) return(entry);
|
||||||
|
}
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int call_func_entry(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int funcmode;
|
||||||
|
int result = -1;
|
||||||
|
NET_FUNC func = NULL;
|
||||||
|
int entry = get_entry_nr(argv[0]);
|
||||||
|
if (entry > -1) {
|
||||||
|
func = net_functions[entry].func;
|
||||||
|
funcmode = net_functions[entry].mode;
|
||||||
|
funcname = net_functions[entry].name;
|
||||||
|
}
|
||||||
|
if (NULL != func) {
|
||||||
|
if (ipx_init() || func == func_map) {
|
||||||
|
result = (*func)(argc, argv, funcmode);
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "Cannot init IPX\n");
|
||||||
|
}
|
||||||
|
} else result = -0xff;
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void get_path(char *path)
|
||||||
|
{
|
||||||
|
char buf[100];
|
||||||
|
strmaxcpy(buf, path, sizeof(buf)-1);
|
||||||
|
korrpath(buf);
|
||||||
|
get_path_fn(buf, prgpath, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
NET_FUNC func = NULL;
|
int result = -0xff;
|
||||||
int result = -1;
|
get_path(argv[0]);
|
||||||
if (argc > 1) {
|
result = call_func_entry(argc, argv);
|
||||||
char funcn[200];
|
if (result == -0xff)
|
||||||
int k= MAX_FUNCS;
|
result = call_func_entry(argc-1, argv+1);
|
||||||
strmaxcpy(funcn, argv[1], sizeof(funcn)-1);
|
if (result == -0xff) {
|
||||||
upstr(funcn);
|
|
||||||
while (k--) {
|
|
||||||
if (!strcmp(funcn, net_functions[k].name)) {
|
|
||||||
func=net_functions[k].func;
|
|
||||||
funcname=net_functions[k].name;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (func != NULL) {
|
|
||||||
if (ipx_init() || func == func_map) {
|
|
||||||
result = (*func) (argc-1, &(argv[1]));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
int k= MAX_FUNCS;
|
int k= MAX_FUNCS;
|
||||||
char progname[256];
|
char progname[256];
|
||||||
strmaxcpy(progname, argv[0], sizeof(progname)-1);
|
strmaxcpy(progname, argv[0], sizeof(progname)-1);
|
||||||
upstr(progname);
|
upstr(progname);
|
||||||
fprintf(stderr, "\n"
|
fprintf(stderr, "\n"
|
||||||
"****************************************************************\n"
|
"* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany *\n"
|
||||||
"* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany *\n"
|
" Version: %s\n\n", VERS_DATE);
|
||||||
"****************************************************************\n\n" );
|
|
||||||
fprintf(stderr, "Usage:\t%s func ... \nfuncs:", progname);
|
fprintf(stderr, "Usage:\t%s func ... \nfuncs:", progname);
|
||||||
while (k--) {
|
while (k--) {
|
||||||
if (net_functions[k].func) {
|
if (net_functions[k].func) {
|
||||||
|
|||||||
136
net.h
Executable file → Normal file
136
net.h
Executable file → Normal file
@@ -1,4 +1,4 @@
|
|||||||
/* net.h: 01-Feb-96 */
|
/* net.h: 20-May-96 */
|
||||||
|
|
||||||
/****************************************************************
|
/****************************************************************
|
||||||
* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany *
|
* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany *
|
||||||
@@ -15,8 +15,13 @@
|
|||||||
#include <dos.h>
|
#include <dos.h>
|
||||||
#include <process.h>
|
#include <process.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
#ifdef __WATCOMC__
|
||||||
|
#include <direct.h>
|
||||||
|
extern int tool_page_line(int *line_count, int *continuous);
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef unsigned int UI;
|
typedef unsigned int UI;
|
||||||
|
typedef unsigned int uint;
|
||||||
typedef unsigned char UC;
|
typedef unsigned char UC;
|
||||||
typedef unsigned char uint8;
|
typedef unsigned char uint8;
|
||||||
typedef unsigned short int uint16;
|
typedef unsigned short int uint16;
|
||||||
@@ -54,7 +59,7 @@ typedef struct {
|
|||||||
uint16 fragment_count; /* Anzahl Fragment Buffers */
|
uint16 fragment_count; /* Anzahl Fragment Buffers */
|
||||||
uint8 *fragment_1;
|
uint8 *fragment_1;
|
||||||
uint16 fragment_1_size;
|
uint16 fragment_1_size;
|
||||||
/* K”nnen auch mehr sein */
|
/* K�nnen auch mehr sein */
|
||||||
} ECB;
|
} ECB;
|
||||||
|
|
||||||
#include "kern.h"
|
#include "kern.h"
|
||||||
@@ -102,39 +107,93 @@ typedef struct {
|
|||||||
#define NWCLIENT 4
|
#define NWCLIENT 4
|
||||||
#define NWBIND 5
|
#define NWBIND 5
|
||||||
|
|
||||||
|
#define NCP_BINDERY_FSERVER 0x0004
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32 object_id;
|
||||||
|
uint16 object_type;
|
||||||
|
uint8 object_name[49];
|
||||||
|
uint8 object_flags;
|
||||||
|
uint8 object_security;
|
||||||
|
uint8 object_has_prop;
|
||||||
|
} BINDERY_OBJECT;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8 value[128];
|
||||||
|
uint8 more_flag;
|
||||||
|
uint8 property_flag;
|
||||||
|
} NW_PROPERTY;
|
||||||
|
|
||||||
|
|
||||||
/* net.c */
|
/* net.c */
|
||||||
extern char *funcname;
|
extern char *funcname;
|
||||||
|
extern char prgpath[];
|
||||||
|
|
||||||
|
extern int call_func_entry(int argc, char *argv[]);
|
||||||
|
|
||||||
/* tools.c */
|
/* tools.c */
|
||||||
extern void clear_kb(void);
|
extern void clear_kb(void);
|
||||||
extern int key_pressed(void);
|
extern int key_pressed(void);
|
||||||
extern int ask_user(char *p, ...);
|
extern int ask_user(char *p, ...);
|
||||||
|
#define xfree(p) x_x_xfree((char **)&(p))
|
||||||
|
extern void x_x_xfree(char **p);
|
||||||
|
extern char *xmalloc(uint size);
|
||||||
|
extern char *xcmalloc(uint size);
|
||||||
|
|
||||||
extern int strmaxcpy(char *dest, char *source, int len);
|
extern int strmaxcpy(char *dest, char *source, int len);
|
||||||
extern char *xadd_char(char *s, int c, int maxlen);
|
extern char *xadd_char(char *s, int c, int maxlen);
|
||||||
extern uint8 *upstr(uint8 *s);
|
extern uint8 *upstr(uint8 *s);
|
||||||
|
extern void korrpath(char *s);
|
||||||
|
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 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_prefix(char *out, int max);
|
||||||
|
extern int tool_is_current_path(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_pattern(char *dir, char *pattern, char *path,
|
||||||
|
int maxdir, int maxpat);
|
||||||
|
|
||||||
|
#define reb(s) deb((s)),leb((s))
|
||||||
|
|
||||||
|
extern void deb(uint8 *s);
|
||||||
|
extern void leb(uint8 *s);
|
||||||
|
|
||||||
|
|
||||||
#define add_char(s, c) xadd_char((s), (c), -1)
|
#define add_char(s, c) xadd_char((s), (c), -1)
|
||||||
|
|
||||||
extern char *getglobenv(char *option);
|
extern char *getglobenv(char *option);
|
||||||
extern int putglobenv(char *option);
|
extern int putglobenv(char *option);
|
||||||
|
|
||||||
|
#ifdef __WATCOMC__
|
||||||
|
/* Borland C compatibility wrappers implemented in tools.c. */
|
||||||
|
extern int getcurdir(int drive, char *directory);
|
||||||
|
extern void setdisk(int drive);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* NETCALLS */
|
/* NETCALLS */
|
||||||
#define DRIVE_ADD 1
|
#define DRIVE_ADD 1
|
||||||
#define DRIVE_INSERT 2
|
#define DRIVE_INSERT 2
|
||||||
#define DRIVE_DELETE 3
|
#define DRIVE_DELETE 3
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8 drivenummer; /* 0xff, 0xfe f<EFBFBD>r DOSPATH mit Pfad */
|
uint8 drivenummer; /* 0xff=last of list, 0xfe only DOSPATH */
|
||||||
uint8 flags;
|
uint8 flags; /* 0x80 = local drive */
|
||||||
union {
|
char dospath[65];
|
||||||
struct {
|
uint8 connid;
|
||||||
char dospath[65];
|
uint8 dhandle;
|
||||||
} d;
|
|
||||||
struct fs {
|
|
||||||
uint8 connid;
|
|
||||||
uint8 dhandle;
|
|
||||||
} fs;
|
|
||||||
} u;
|
|
||||||
} SEARCH_VECTOR_ENTRY;
|
} SEARCH_VECTOR_ENTRY;
|
||||||
|
|
||||||
typedef SEARCH_VECTOR_ENTRY SEARCH_VECTOR[17];
|
typedef SEARCH_VECTOR_ENTRY SEARCH_VECTOR[17];
|
||||||
@@ -148,6 +207,12 @@ extern int neterrno;
|
|||||||
alloc_dir_handle(0x13, (dhandle), (path), (drive), (rights))
|
alloc_dir_handle(0x13, (dhandle), (path), (drive), (rights))
|
||||||
|
|
||||||
extern int ipx_init(void);
|
extern int ipx_init(void);
|
||||||
|
extern int logout(void);
|
||||||
|
extern int redir_device_drive(int devicetyp, uint8 *devname, uint8 *remotename);
|
||||||
|
extern int list_redir(int index, int *devicetyp, uint8 *devname, uint8 *remotename);
|
||||||
|
extern int get_drive_info(uint8 drivenumber, uint8 *connid,
|
||||||
|
uint8 *dhandle, uint8 *statusflags);
|
||||||
|
extern int get_fs_name(int connid, char *name);
|
||||||
|
|
||||||
extern int alloc_dir_handle(int func, int dhandle, char *path,
|
extern int alloc_dir_handle(int func, int dhandle, char *path,
|
||||||
int driveletter, uint8 *effrights);
|
int driveletter, uint8 *effrights);
|
||||||
@@ -168,11 +233,13 @@ extern int ncp_16_02(int dirhandle,
|
|||||||
uint32 *creattime,
|
uint32 *creattime,
|
||||||
uint32 *owner_id);
|
uint32 *owner_id);
|
||||||
|
|
||||||
|
extern int ncp_14_46(uint32 *obj_id);
|
||||||
extern int ncp_17_02(int module, int debuglevel);
|
extern int ncp_17_02(int module, int debuglevel);
|
||||||
extern int ncp_17_14(uint8 *objname, uint16 objtyp, uint8 *password);
|
extern int ncp_17_14(uint8 *objname, uint16 objtyp, uint8 *password);
|
||||||
extern int ncp_17_17(uint8 *key);
|
extern int ncp_17_17(uint8 *key);
|
||||||
extern int ncp_17_18(uint8 *cryptkey, uint8 *objname, uint16 objtyp);
|
extern int ncp_17_18(uint8 *cryptkey, uint8 *objname, uint16 objtyp);
|
||||||
extern uint32 ncp_17_35(uint8 *objname, uint16 objtyp);
|
extern uint32 ncp_17_35(uint8 *objname, uint16 objtyp);
|
||||||
|
extern int ncp_17_36(uint32 obj_id, uint8 *objname, uint16 *objtyp);
|
||||||
extern int ncp_17_40(uint8 *objname, uint16 objtyp, uint8 *password,
|
extern int ncp_17_40(uint8 *objname, uint16 objtyp, uint8 *password,
|
||||||
uint8 *newpassword);
|
uint8 *newpassword);
|
||||||
|
|
||||||
@@ -180,23 +247,46 @@ extern int ncp_17_4b(uint8 *cryptkey, uint8 *objname, uint16 objtyp,
|
|||||||
int passwx, uint8 *newpassword);
|
int passwx, uint8 *newpassword);
|
||||||
|
|
||||||
/* map.c */
|
/* map.c */
|
||||||
extern int func_map(int argc, char *argv[]);
|
extern int func_map (int argc, char *argv[], int mode);
|
||||||
extern int func_path(int argc, char *argv[]);
|
extern int func_path (int argc, char *argv[], int mode);
|
||||||
|
extern void remove_nwpathes(void);
|
||||||
|
|
||||||
/* login.c */
|
/* login.c */
|
||||||
extern int func_login(int argc, char *argv[]);
|
extern int func_login (int argc, char *argv[], int mode);
|
||||||
extern int func_logout(int argc, char *argv[]);
|
extern int func_logout (int argc, char *argv[], int mode);
|
||||||
extern int func_passwd(int argc, char *argv[]);
|
extern int func_passwd (int argc, char *argv[], int mode);
|
||||||
|
extern int func_profile(int argc, char *argv[], int mode);
|
||||||
|
extern int func_cwd (int argc, char *argv[], int mode);
|
||||||
|
extern int func_echo (int argc, char *argv[], int mode);
|
||||||
|
extern int func_exec (int argc, char *argv[], int mode);
|
||||||
|
extern int read_command_file(char *fstr);
|
||||||
|
|
||||||
/* slist.c */
|
/* slist.c */
|
||||||
extern int func_slist(int argc, char *argv[]);
|
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[]);
|
extern int func_debug (int argc, char *argv[], int mode);
|
||||||
|
|
||||||
/* nwtests.c */
|
/* nwtests.c */
|
||||||
extern int func_tests(int argc, char *argv[]);
|
extern int func_tests (int argc, char *argv[], int mode);
|
||||||
|
|
||||||
|
/* capture.c */
|
||||||
|
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 ncp_17_37(uint32 last_id, uint16 objtyp, uint8 *pattern,
|
||||||
|
BINDERY_OBJECT *target);
|
||||||
|
extern int ncp_17_3d(uint16 objtyp, uint8 *objname, int segment,
|
||||||
|
uint8 *propname, NW_PROPERTY *target);
|
||||||
|
|
||||||
|
|||||||
45
netcall.c
Executable file → Normal file
45
netcall.c
Executable file → Normal file
@@ -49,6 +49,8 @@ int logout(void)
|
|||||||
|
|
||||||
int redir_device_drive(int devicetyp, uint8 *devname, uint8 *remotename)
|
int redir_device_drive(int devicetyp, uint8 *devname, uint8 *remotename)
|
||||||
/* if devicetyp == -1, the redir is canceled */
|
/* if devicetyp == -1, the redir is canceled */
|
||||||
|
/* devicetyp 3 = printer */
|
||||||
|
/* devicetyp 4 = disk drive */
|
||||||
{
|
{
|
||||||
REGS regs;
|
REGS regs;
|
||||||
SREGS sregs;
|
SREGS sregs;
|
||||||
@@ -157,16 +159,15 @@ int get_search_drive_vektor(SEARCH_VECTOR_ENTRY *vec)
|
|||||||
char *p1 = path;
|
char *p1 = path;
|
||||||
int len = 0;
|
int len = 0;
|
||||||
while (*path && *path++ !=';') len++;
|
while (*path && *path++ !=';') len++;
|
||||||
if (*(p1+1) == ':'
|
if (*(p1+1) == ':' && *p1 >= 'A' && *p1 <= 'Z') {
|
||||||
&& *p1 >= 'A' && *p1 <= 'Z' &&
|
|
||||||
(len==2 || (len == 3 && *(p1+2) == '.'))) {
|
|
||||||
v->drivenummer = *p1 - 'A';
|
v->drivenummer = *p1 - 'A';
|
||||||
get_drive_info(v->drivenummer, &(v->u.fs.connid),
|
get_drive_info(v->drivenummer, &(v->connid),
|
||||||
&(v->u.fs.dhandle), &(v->flags));
|
&(v->dhandle), &(v->flags));
|
||||||
|
strmaxcpy(v->dospath, p1+2, min(len-2, sizeof(v->dospath)-1));
|
||||||
} else {
|
} else {
|
||||||
v->flags = 0;
|
v->flags = 0;
|
||||||
v->drivenummer = 0xfe; /* ergibt ? */
|
v->drivenummer = 0xfe; /* ergibt ? */
|
||||||
strmaxcpy(v->u.d.dospath, p1, len);
|
strmaxcpy(v->dospath, p1, min(len, sizeof(v->dospath)-1));
|
||||||
}
|
}
|
||||||
(++v)->drivenummer = 0xff;
|
(++v)->drivenummer = 0xff;
|
||||||
if (*path == ';') path++;
|
if (*path == ';') path++;
|
||||||
@@ -181,20 +182,29 @@ int set_search_drive_vektor(SEARCH_VECTOR_ENTRY *vec)
|
|||||||
char *p=path;
|
char *p=path;
|
||||||
SEARCH_VECTOR_ENTRY *v;
|
SEARCH_VECTOR_ENTRY *v;
|
||||||
int plen=strlen(path_env_name);
|
int plen=strlen(path_env_name);
|
||||||
|
int maxcount=16;
|
||||||
strcpy(path, path_env_name);
|
strcpy(path, path_env_name);
|
||||||
path[plen] = '=';
|
path[plen] = '=';
|
||||||
path[++plen] = '\0';
|
path[++plen] = '\0';
|
||||||
while ((NULL != (v = vec++)) && v->drivenummer != 0xff){
|
|
||||||
if (p > path) *p++=';';
|
while (maxcount-- && (NULL != (v = vec++)) && v->drivenummer != 0xff){
|
||||||
else p+=plen;
|
if (v->drivenummer < 26 || *(v->dospath)) {
|
||||||
if (v->drivenummer < 26) {
|
if (p > path) *p++=';';
|
||||||
*p++ = (char) v->drivenummer + 'A';
|
else p+=plen;
|
||||||
*p++ = ':';
|
if (v->drivenummer < 26) {
|
||||||
*p++ = '.';
|
*p++ = (char) v->drivenummer + 'A';
|
||||||
*p = '\0';
|
*p++ = ':';
|
||||||
} else {
|
if (*v->dospath) {
|
||||||
strcpy(p, v->u.d.dospath);
|
strcpy(p, v->dospath);
|
||||||
p+= strlen(v->u.d.dospath);
|
p+= strlen(v->dospath);
|
||||||
|
} else {
|
||||||
|
*p++='.';
|
||||||
|
*p ='\0';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
strcpy(p, v->dospath);
|
||||||
|
p+= strlen(v->dospath);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return(putglobenv(path));
|
return(putglobenv(path));
|
||||||
@@ -231,7 +241,6 @@ int alloc_dir_handle(int func,
|
|||||||
printf("alloc_dir_handle, path=%s, len=%d, disk=%c\n", path, pathlen, driveletter);
|
printf("alloc_dir_handle, path=%s, len=%d, disk=%c\n", path, pathlen, driveletter);
|
||||||
*/
|
*/
|
||||||
neterrno = Net_Call(0xE200, &req, &repl);
|
neterrno = Net_Call(0xE200, &req, &repl);
|
||||||
fprintf(stderr, "neterrno=%d\n", neterrno);
|
|
||||||
if (neterrno && neterrno != 0xff) return(-1);
|
if (neterrno && neterrno != 0xff) return(-1);
|
||||||
|
|
||||||
if (effrights) *effrights = repl.effrights;
|
if (effrights) *effrights = repl.effrights;
|
||||||
|
|||||||
BIN
netold.exe
Executable file
BIN
netold.exe
Executable file
Binary file not shown.
113
nwcrypt.c
Executable file → Normal file
113
nwcrypt.c
Executable file → Normal file
@@ -118,6 +118,7 @@ static buf32 encryptkeys =
|
|||||||
0x6B,0x0F,0xD5,0x70,0xAE,0xFB,0xAD,0x11,
|
0x6B,0x0F,0xD5,0x70,0xAE,0xFB,0xAD,0x11,
|
||||||
0xF4,0x47,0xDC,0xA7,0xEC,0xCF,0x50,0xC0};
|
0xF4,0x47,0xDC,0xA7,0xEC,0xCF,0x50,0xC0};
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
#include "nwcrypt.h"
|
#include "nwcrypt.h"
|
||||||
static void
|
static void
|
||||||
shuffle1(buf32 temp, unsigned char *target)
|
shuffle1(buf32 temp, unsigned char *target)
|
||||||
@@ -210,4 +211,116 @@ nw_encrypt(unsigned char *fra,unsigned char *buf,unsigned char *til)
|
|||||||
til[s] = k[s] ^ k[15 - s];
|
til[s] = k[s] ^ k[15 - s];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned char
|
||||||
|
newshuffle[256] =
|
||||||
|
{
|
||||||
|
0x0f, 0x08, 0x05, 0x07, 0x0c, 0x02, 0x0e, 0x09,
|
||||||
|
0x00, 0x01, 0x06, 0x0d, 0x03, 0x04, 0x0b, 0x0a,
|
||||||
|
0x02, 0x0c, 0x0e, 0x06, 0x0f, 0x00, 0x01, 0x08,
|
||||||
|
0x0d, 0x03, 0x0a, 0x04, 0x09, 0x0b, 0x05, 0x07,
|
||||||
|
|
||||||
|
0x05, 0x02, 0x09, 0x0f, 0x0c, 0x04, 0x0d, 0x00,
|
||||||
|
0x0e, 0x0a, 0x06, 0x08, 0x0b, 0x01, 0x03, 0x07,
|
||||||
|
0x0f, 0x0d, 0x02, 0x06, 0x07, 0x08, 0x05, 0x09,
|
||||||
|
0x00, 0x04, 0x0c, 0x03, 0x01, 0x0a, 0x0b, 0x0e,
|
||||||
|
|
||||||
|
0x05, 0x0e, 0x02, 0x0b, 0x0d, 0x0a, 0x07, 0x00,
|
||||||
|
0x08, 0x06, 0x04, 0x01, 0x0f, 0x0c, 0x03, 0x09,
|
||||||
|
0x08, 0x02, 0x0f, 0x0a, 0x05, 0x09, 0x06, 0x0c,
|
||||||
|
0x00, 0x0b, 0x01, 0x0d, 0x07, 0x03, 0x04, 0x0e,
|
||||||
|
|
||||||
|
0x0e, 0x08, 0x00, 0x09, 0x04, 0x0b, 0x02, 0x07,
|
||||||
|
0x0c, 0x03, 0x0a, 0x05, 0x0d, 0x01, 0x06, 0x0f,
|
||||||
|
0x01, 0x04, 0x08, 0x0a, 0x0d, 0x0b, 0x07, 0x0e,
|
||||||
|
0x05, 0x0f, 0x03, 0x09, 0x00, 0x02, 0x06, 0x0c,
|
||||||
|
|
||||||
|
0x05, 0x03, 0x0c, 0x08, 0x0b, 0x02, 0x0e, 0x0a,
|
||||||
|
0x04, 0x01, 0x0d, 0x00, 0x06, 0x07, 0x0f, 0x09,
|
||||||
|
0x06, 0x00, 0x0b, 0x0e, 0x0d, 0x04, 0x0c, 0x0f,
|
||||||
|
0x07, 0x02, 0x08, 0x0a, 0x01, 0x05, 0x03, 0x09,
|
||||||
|
|
||||||
|
0x0b, 0x05, 0x0a, 0x0e, 0x0f, 0x01, 0x0c, 0x00,
|
||||||
|
0x06, 0x04, 0x02, 0x09, 0x03, 0x0d, 0x07, 0x08,
|
||||||
|
0x07, 0x02, 0x0a, 0x00, 0x0e, 0x08, 0x0f, 0x04,
|
||||||
|
0x0c, 0x0b, 0x09, 0x01, 0x05, 0x0d, 0x03, 0x06,
|
||||||
|
|
||||||
|
0x07, 0x04, 0x0f, 0x09, 0x05, 0x01, 0x0c, 0x0b,
|
||||||
|
0x00, 0x03, 0x08, 0x0e, 0x02, 0x0a, 0x06, 0x0d,
|
||||||
|
0x09, 0x04, 0x08, 0x00, 0x0a, 0x03, 0x01, 0x0c,
|
||||||
|
0x05, 0x0f, 0x07, 0x02, 0x0b, 0x0e, 0x06, 0x0d,
|
||||||
|
|
||||||
|
0x09, 0x05, 0x04, 0x07, 0x0e, 0x08, 0x03, 0x01,
|
||||||
|
0x0d, 0x0b, 0x0c, 0x02, 0x00, 0x0f, 0x06, 0x0a,
|
||||||
|
0x09, 0x0a, 0x0b, 0x0d, 0x05, 0x03, 0x0f, 0x00,
|
||||||
|
0x01, 0x0c, 0x08, 0x07, 0x06, 0x04, 0x0e, 0x02,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const unsigned char final_shuffle[16] = {
|
||||||
|
0x03, 0x0e, 0x0f, 0x02, 0x0d, 0x0c, 0x04, 0x05,
|
||||||
|
0x09, 0x06, 0x00, 0x01, 0x0b, 0x07, 0x0a, 0x08,
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* verschluesseln des neuen Passworts fuer keyed change password
|
||||||
|
* Verwendung:
|
||||||
|
* - Shuffle (aus nwcrypt.c) altes passwort nach old (16 bytes)
|
||||||
|
* - shuffle neues passwort nach new (16 bytes)
|
||||||
|
* - nwpassencrypt (diese Funktion) zweimal aufrufen fuer je 8 bytes:
|
||||||
|
* nwpassencrypt(old+0, new+0, out+0)
|
||||||
|
* nwpassencrypt(old+8, new+8, out+8)
|
||||||
|
* - NCP-Buffer aufbauen:
|
||||||
|
* 2 byte Laenge im Hi-Lo-Format
|
||||||
|
* 1 byte Funktion (0x4b)
|
||||||
|
* 8 byte (nwcrypt Ergebnis analog login/verify password)
|
||||||
|
* 2 byte Objecttype
|
||||||
|
* 1 byte Objectname-Laenge
|
||||||
|
* n byte Objectname
|
||||||
|
* 1 byte (Laenge des eingegebenen neuen Passworts ^ old[0] ^ old[1])&0x7f|0x40
|
||||||
|
* 16 byte (Ergebnis dieser Funktion doppelt aufgerufen, s.o.)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Encrypt the new password for keyed change password
|
||||||
|
* For info on how to use this function, look at ncp_change_login_passwd
|
||||||
|
* in ncplib.c.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void
|
||||||
|
newpassencrypt(unsigned char *old, unsigned char *npwd)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < 16; i++) {
|
||||||
|
int di, ax;
|
||||||
|
unsigned char *p, *bx;
|
||||||
|
unsigned char cl, dl, ch;
|
||||||
|
unsigned char copy[8];
|
||||||
|
|
||||||
|
memcpy(copy, npwd, 8);
|
||||||
|
for (di = 0, ax = 0, p = old; di < 8; di++, ax += 0x20, p++)
|
||||||
|
{
|
||||||
|
cl = newshuffle[(((copy[di] ^ *p) >> 4) & 0x0f) + ax + 0x10] << 4;
|
||||||
|
dl = newshuffle[((copy[di] ^ *p) & 0xf) + ax];
|
||||||
|
copy[di] = cl | dl;
|
||||||
|
}
|
||||||
|
|
||||||
|
ch = old[7];
|
||||||
|
for (bx = old + 7; bx > old; bx--)
|
||||||
|
{
|
||||||
|
*bx = ((bx[-1] >> 4) & 0x0f) | ((*bx) << 4);
|
||||||
|
}
|
||||||
|
*old = ((ch >> 4) & 0x0f) | (*old) << 4;
|
||||||
|
|
||||||
|
memset(npwd, 0, 8);
|
||||||
|
|
||||||
|
for (di = 0; di < 16; di++)
|
||||||
|
{
|
||||||
|
if (final_shuffle[di] & 1)
|
||||||
|
ch = ((copy[final_shuffle[di] / 2] >> 4) & 0x0f);
|
||||||
|
else
|
||||||
|
ch = copy[final_shuffle[di] / 2] & 0x0f;
|
||||||
|
npwd[di / 2] |= ((di & 1) ? ch << 4 : ch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
2
nwcrypt.h
Executable file → Normal file
2
nwcrypt.h
Executable file → Normal file
@@ -5,3 +5,5 @@ extern void shuffle(unsigned char *lon,
|
|||||||
|
|
||||||
extern void nw_encrypt(unsigned char *fra,
|
extern void nw_encrypt(unsigned char *fra,
|
||||||
unsigned char *buf,unsigned char *til);
|
unsigned char *buf,unsigned char *til);
|
||||||
|
|
||||||
|
extern void newpassencrypt(unsigned char *old, unsigned char *npwd);
|
||||||
|
|||||||
11
nwdebug.c
Executable file → Normal file
11
nwdebug.c
Executable file → Normal file
@@ -1,4 +1,4 @@
|
|||||||
/* nwdebug.c 04-Apr-96 */
|
/* nwdebug.c 21-May-96 */
|
||||||
|
|
||||||
/****************************************************************
|
/****************************************************************
|
||||||
* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany *
|
* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany *
|
||||||
@@ -13,7 +13,7 @@ static int usage(void)
|
|||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int func_debug(int argc, char *argv[])
|
int func_debug(int argc, char *argv[], int mode)
|
||||||
{
|
{
|
||||||
uint8 s[200];
|
uint8 s[200];
|
||||||
int module;
|
int module;
|
||||||
@@ -29,8 +29,11 @@ int func_debug(int argc, char *argv[])
|
|||||||
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 = ncp_17_02(module, level);
|
||||||
if (result < 0) fprintf(stderr, "set debug failed\n");
|
if (result < 0) {
|
||||||
else fprintf(stdout, "Debug level for %s changed from %d to %d\n",
|
fprintf(stderr, "set debug failed\n");
|
||||||
|
fprintf(stderr, "perhaps you did not enable FUNC_17_02_IS_DEBUG\n");
|
||||||
|
fprintf(stderr, "in mars_nwe/config.h ?!");
|
||||||
|
} else fprintf(stdout, "Debug level for %s changed from %d to %d\n",
|
||||||
s, result, level);
|
s, result, level);
|
||||||
return(result < 0 ? result : 0);
|
return(result < 0 ? result : 0);
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
opt/logo-small.png
Normal file
BIN
opt/logo-small.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 380 KiB |
BIN
opt/logo.png
Normal file
BIN
opt/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 MiB |
296
remove.c
Normal file
296
remove.c
Normal file
@@ -0,0 +1,296 @@
|
|||||||
|
/* remove.c - Novell REMOVE-like DOS utility */
|
||||||
|
|
||||||
|
#include "net.h"
|
||||||
|
#include "c32ncp.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 void remove_header_path(char *out, char *path, int max)
|
||||||
|
{
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
trustee_header_path(out, path, max);
|
||||||
|
|
||||||
|
/* Novell REMOVE displays server and volume as SERVER/SYS: while
|
||||||
|
* RIGHTS uses SERVER\SYS:. Keep the rest of the path with DOS
|
||||||
|
* backslashes. */
|
||||||
|
p = strchr(out, '\\');
|
||||||
|
if (p && strchr(out, ':') && p < strchr(out, ':'))
|
||||||
|
*p = '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
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 = c32_ncp87_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 = c32_ncp22_delete_trustee_rights(path, dhandle, object_id);
|
||||||
|
if (rc)
|
||||||
|
rc = c32_ncp87_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];
|
||||||
|
remove_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;
|
||||||
|
}
|
||||||
|
|
||||||
|
trustee_join_path(pattern, path, "*.*", sizeof(pattern));
|
||||||
|
|
||||||
|
if (_dos_findfirst(pattern, _A_SUBDIR, &ff) == 0) {
|
||||||
|
do {
|
||||||
|
if ((ff.attrib & _A_SUBDIR) && !trustee_is_dot_dir(ff.name)) {
|
||||||
|
trustee_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 (trustee_path_is_dir(path)) {
|
||||||
|
strmaxcpy(dir, path, sizeof(dir) - 1);
|
||||||
|
strmaxcpy(pat, "*.*", sizeof(pat) - 1);
|
||||||
|
} else if (trustee_path_has_wildcards(path)) {
|
||||||
|
trustee_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);
|
||||||
|
}
|
||||||
|
|
||||||
|
trustee_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)) {
|
||||||
|
trustee_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 || trustee_is_help(argv[1])) {
|
||||||
|
if (argc < 2) {
|
||||||
|
remove_usage_after_error();
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
remove_usage();
|
||||||
|
return(argc < 2 ? 1 : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i < argc && trustee_same(argv[i], "USER")) {
|
||||||
|
/* Novell treats "REMOVE USER FROM path" as an object lookup for
|
||||||
|
* USER, not as a grammar error. */
|
||||||
|
if ((i + 1) < argc && trustee_same(argv[i + 1], "FROM")) {
|
||||||
|
objtype_given = 0;
|
||||||
|
} else {
|
||||||
|
objtype = TRUSTEE_BINDERY_USER;
|
||||||
|
objtype_given = 1;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
} else if (i < argc && trustee_same(argv[i], "GROUP")) {
|
||||||
|
if ((i + 1) < argc && trustee_same(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 && trustee_same(argv[i], "FROM")) {
|
||||||
|
i++;
|
||||||
|
if (i >= argc) {
|
||||||
|
remove_usage_after_error();
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
path = argv[i++];
|
||||||
|
}
|
||||||
|
|
||||||
|
while (i < argc) {
|
||||||
|
if (!trustee_is_option(argv[i])) {
|
||||||
|
remove_usage_after_error();
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (trustee_is_files_option(argv[i])) {
|
||||||
|
use_files = 1;
|
||||||
|
i++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (trustee_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 (trustee_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);
|
||||||
|
}
|
||||||
|
|
||||||
|
trustee_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);
|
||||||
|
}
|
||||||
301
revoke.c
Normal file
301
revoke.c
Normal file
@@ -0,0 +1,301 @@
|
|||||||
|
/* revoke.c - Novell REVOKE-like DOS utility */
|
||||||
|
|
||||||
|
#include "net.h"
|
||||||
|
#include "c32ncp.h"
|
||||||
|
#include "trustee.h"
|
||||||
|
|
||||||
|
#ifndef _A_NORMAL
|
||||||
|
#define _A_NORMAL 0x00
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static int revoke_last_rc = 0;
|
||||||
|
|
||||||
|
static void revoke_usage_error(void)
|
||||||
|
{
|
||||||
|
fprintf(stdout, "Command line arguments violate grammar defined for REVOKE.\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void revoke_usage(void)
|
||||||
|
{
|
||||||
|
fprintf(stdout, "Usage: REVOKE rightslist* [FOR path] FROM [USER|GROUP] name [options]\n");
|
||||||
|
fprintf(stdout, "Options: /SubDirectories | /Files\n\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* 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;
|
||||||
|
|
||||||
|
is_dir = forced_is_file ? 0 : trustee_path_is_dir(path);
|
||||||
|
|
||||||
|
rc = c32_ncp87_find_trustee_rights(path, dhandle, object_id, &old_rights,
|
||||||
|
NULL, NULL, NULL);
|
||||||
|
revoke_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);
|
||||||
|
}
|
||||||
|
|
||||||
|
new_rights = (uint16)(old_rights & ~revoke_mask);
|
||||||
|
|
||||||
|
if (new_rights == 0) {
|
||||||
|
rc = c32_ncp87_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 {
|
||||||
|
rc = c32_ncp87_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\n", header);
|
||||||
|
fprintf(stdout, "Trustee's access rights set to [%s]\n", bracket);
|
||||||
|
}
|
||||||
|
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int revoke_subdirs(char *path, uint16 dhandle, uint32 object_id,
|
||||||
|
uint16 revoke_mask, int *count)
|
||||||
|
{
|
||||||
|
struct find_t ff;
|
||||||
|
char pattern[260];
|
||||||
|
char child[260];
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
|
if (revoke_one(path, dhandle, object_id, revoke_mask, 0) == 0)
|
||||||
|
(*count)++;
|
||||||
|
else
|
||||||
|
rc = 1;
|
||||||
|
|
||||||
|
trustee_join_path(pattern, path, "*.*", sizeof(pattern));
|
||||||
|
|
||||||
|
if (_dos_findfirst(pattern, _A_SUBDIR, &ff) == 0) {
|
||||||
|
do {
|
||||||
|
if ((ff.attrib & _A_SUBDIR) && !trustee_is_dot_dir(ff.name)) {
|
||||||
|
trustee_join_path(child, path, ff.name, sizeof(child));
|
||||||
|
if (revoke_subdirs(child, dhandle, object_id, revoke_mask, count))
|
||||||
|
rc = 1;
|
||||||
|
}
|
||||||
|
} while (_dos_findnext(&ff) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return(rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
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 (trustee_path_is_dir(path)) {
|
||||||
|
strmaxcpy(dir, path, sizeof(dir) - 1);
|
||||||
|
strmaxcpy(pat, "*.*", sizeof(pat) - 1);
|
||||||
|
} else if (trustee_path_has_wildcards(path)) {
|
||||||
|
trustee_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);
|
||||||
|
}
|
||||||
|
|
||||||
|
trustee_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)) {
|
||||||
|
trustee_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 || trustee_is_help(argv[1])) {
|
||||||
|
if (argc < 2)
|
||||||
|
revoke_usage_error();
|
||||||
|
revoke_usage();
|
||||||
|
return(argc < 2 ? 1 : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (i < argc) {
|
||||||
|
if (trustee_same(argv[i], "FOR") || trustee_same(argv[i], "FROM"))
|
||||||
|
break;
|
||||||
|
if (trustee_is_option(argv[i]))
|
||||||
|
break;
|
||||||
|
if (trustee_parse_right_word(argv[i], &rights)) {
|
||||||
|
fprintf(stdout, "Invalid right specified.\n");
|
||||||
|
revoke_usage();
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
have_rights = 1;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!have_rights || i >= argc) {
|
||||||
|
revoke_usage_error();
|
||||||
|
revoke_usage();
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (trustee_same(argv[i], "FOR")) {
|
||||||
|
i++;
|
||||||
|
if (i >= argc) {
|
||||||
|
revoke_usage_error();
|
||||||
|
revoke_usage();
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
path = argv[i++];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i >= argc || !trustee_same(argv[i], "FROM")) {
|
||||||
|
revoke_usage_error();
|
||||||
|
revoke_usage();
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
|
||||||
|
if (i < argc && trustee_same(argv[i], "USER")) {
|
||||||
|
objtype = TRUSTEE_BINDERY_USER;
|
||||||
|
objtype_given = 1;
|
||||||
|
i++;
|
||||||
|
} else if (i < argc && trustee_same(argv[i], "GROUP")) {
|
||||||
|
objtype = TRUSTEE_BINDERY_GROUP;
|
||||||
|
objtype_given = 1;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i >= argc) {
|
||||||
|
revoke_usage_error();
|
||||||
|
revoke_usage();
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
objname = argv[i++];
|
||||||
|
|
||||||
|
while (i < argc) {
|
||||||
|
if (!trustee_is_option(argv[i])) {
|
||||||
|
revoke_usage_error();
|
||||||
|
revoke_usage();
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (trustee_is_files_option(argv[i])) {
|
||||||
|
use_files = 1;
|
||||||
|
i++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (trustee_is_subdirs_option(argv[i])) {
|
||||||
|
use_subdirs = 1;
|
||||||
|
i++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
revoke_usage_error();
|
||||||
|
revoke_usage();
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (use_files && use_subdirs) {
|
||||||
|
fprintf(stdout, "Revoke cannot do both directories and files in a single pass.\n");
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (trustee_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, "Group \"%s\" not found.\n", objname);
|
||||||
|
else if (objtype_given)
|
||||||
|
fprintf(stdout, "User \"%s\" not found.\n", objname);
|
||||||
|
else
|
||||||
|
fprintf(stdout, "User or group \"%s\" not found.\n", objname);
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
trustee_upcopy(objprint, objname, sizeof(objprint));
|
||||||
|
|
||||||
|
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))
|
||||||
|
fprintf(stdout, "Rights for %d directories were changed for %s.\n", count, objprint);
|
||||||
|
else if (use_files)
|
||||||
|
fprintf(stdout, "Rights for %d files were changed for %s.\n", count, objprint);
|
||||||
|
|
||||||
|
return(rc ? (revoke_last_rc ? revoke_last_rc : 1) : 0);
|
||||||
|
}
|
||||||
320
rights.c
Normal file
320
rights.c
Normal file
@@ -0,0 +1,320 @@
|
|||||||
|
/* rights.c - Novell RIGHTS-like DOS utility, read-only v4 */
|
||||||
|
|
||||||
|
#include "net.h"
|
||||||
|
#include "c32ncp.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_parent_path(char *dst, char *src, int max)
|
||||||
|
{
|
||||||
|
char tmp[260];
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
tool_upcopy(tmp, src, sizeof(tmp));
|
||||||
|
|
||||||
|
p = strrchr(tmp, '\\');
|
||||||
|
if (!p) p = strrchr(tmp, ':');
|
||||||
|
|
||||||
|
if (!p) {
|
||||||
|
dst[0] = '\0';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*p == ':') {
|
||||||
|
p++;
|
||||||
|
*p = '\0';
|
||||||
|
} else {
|
||||||
|
*p = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
strmaxcpy(dst, tmp, max - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
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, C32_NDIR_INFO *info)
|
||||||
|
{
|
||||||
|
uint8 connid = 0;
|
||||||
|
uint8 dhandle = 0;
|
||||||
|
char npath[260];
|
||||||
|
|
||||||
|
if (!info)
|
||||||
|
return(1);
|
||||||
|
|
||||||
|
memset(info, 0, sizeof(*info));
|
||||||
|
|
||||||
|
if (tool_current_dhandle(&connid, &dhandle))
|
||||||
|
return(1);
|
||||||
|
|
||||||
|
rights_ncp_path(npath, path, sizeof(npath));
|
||||||
|
return(c32_ncp87_obtain_ndir_info(npath, (uint16)dhandle,
|
||||||
|
info, NULL, NULL, NULL));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int rights_path_exists(char *path, int *is_dir)
|
||||||
|
{
|
||||||
|
C32_NDIR_INFO info;
|
||||||
|
|
||||||
|
if (rights_get_ncp_info(path, &info))
|
||||||
|
return(0);
|
||||||
|
|
||||||
|
if (is_dir)
|
||||||
|
*is_dir = (info.attributes & 0x10) ? 1 : 0;
|
||||||
|
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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 (!c32_ncp87_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));
|
||||||
|
rights_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 = ncp_16_02(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);
|
||||||
|
}
|
||||||
128
slist.c
Executable file → Normal file
128
slist.c
Executable file → Normal file
@@ -1,15 +1,123 @@
|
|||||||
/* map.c 12-Jan-96 */
|
/* slist.c - list known NetWare file servers, DOS mars-dosutils version */
|
||||||
|
|
||||||
/****************************************************************
|
|
||||||
* (C)opyright (C) 1993,1996 Martin Stover, Marburg, Germany *
|
|
||||||
****************************************************************/
|
|
||||||
|
|
||||||
#include "net.h"
|
#include "net.h"
|
||||||
|
|
||||||
int func_slist(int argc, char *argv[])
|
#define NCP_BINDERY_FSERVER 0x0004
|
||||||
|
|
||||||
|
static int usage(void)
|
||||||
{
|
{
|
||||||
|
fprintf(stdout, "Usage: SLIST [Server] [/Continue] \n");
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int same_arg(char *a, char *b)
|
||||||
|
{
|
||||||
|
while (*a || *b) {
|
||||||
|
int ca = *a++;
|
||||||
|
int cb = *b++;
|
||||||
|
if (ca >= 'a' && ca <= 'z') ca -= 32;
|
||||||
|
if (cb >= 'a' && cb <= 'z') cb -= 32;
|
||||||
|
if (ca != cb) return(0);
|
||||||
|
}
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int is_help_arg(char *s)
|
||||||
|
{
|
||||||
|
if (!s) return(0);
|
||||||
|
return(same_arg(s, "/?") || same_arg(s, "-?") || same_arg(s, "?"));
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned long node_to_number(uint8 *addr)
|
||||||
|
{
|
||||||
|
unsigned long n = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 4; i < 10; i++)
|
||||||
|
n = (n << 8) + addr[i];
|
||||||
|
|
||||||
|
return(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void print_net_node_status(uint8 *addr, int is_default)
|
||||||
|
{
|
||||||
|
fprintf(stdout, "[%08lX][%12lu]%s",
|
||||||
|
(unsigned long)GET_BE32(addr),
|
||||||
|
node_to_number(addr),
|
||||||
|
is_default ? "Default " : "");
|
||||||
|
}
|
||||||
|
|
||||||
|
int func_slist(int argc, char *argv[], int mode)
|
||||||
|
{
|
||||||
|
BINDERY_OBJECT obj;
|
||||||
|
uint32 last_id = MAX_U32;
|
||||||
|
uint8 pattern[50];
|
||||||
|
int explicit_server = 0;
|
||||||
|
int found = 0;
|
||||||
|
int result;
|
||||||
|
int i;
|
||||||
|
int continuous = 0;
|
||||||
|
int line_count = 0;
|
||||||
|
|
||||||
|
(void)mode;
|
||||||
|
|
||||||
|
strcpy(pattern, "*");
|
||||||
|
|
||||||
|
for (i = 1; i < argc; i++) {
|
||||||
|
if (is_help_arg(argv[i])) return(usage());
|
||||||
|
|
||||||
|
if (argv[i][0] == '/' || argv[i][0] == '-') {
|
||||||
|
if (same_arg(argv[i], "/C") || same_arg(argv[i], "/CONTINUE") ||
|
||||||
|
same_arg(argv[i], "-C") || same_arg(argv[i], "-CONTINUE")) {
|
||||||
|
continuous = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return(usage());
|
||||||
|
}
|
||||||
|
|
||||||
|
strmaxcpy(pattern, argv[i], sizeof(pattern) - 1);
|
||||||
|
explicit_server = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
upstr(pattern);
|
||||||
|
|
||||||
|
if (!explicit_server) {
|
||||||
|
fprintf(stdout, "%-48sNetwork Node Address Status\n",
|
||||||
|
"Known NetWare File Servers");
|
||||||
|
fprintf(stdout, "%-48s------- ------------ ------\n",
|
||||||
|
"--------------------------");
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((result = ncp_17_37(last_id, NCP_BINDERY_FSERVER,
|
||||||
|
pattern, &obj)) == 0) {
|
||||||
|
NW_PROPERTY prop;
|
||||||
|
|
||||||
|
found++;
|
||||||
|
last_id = obj.object_id;
|
||||||
|
|
||||||
|
if (explicit_server && found == 1) {
|
||||||
|
fprintf(stdout, "%-47s", obj.object_name);
|
||||||
|
} else {
|
||||||
|
fprintf(stdout, "%-47s", obj.object_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ncp_17_3d(NCP_BINDERY_FSERVER, obj.object_name,
|
||||||
|
1, "NET_ADDRESS", &prop)) {
|
||||||
|
print_net_node_status(prop.value, found == 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stdout, "\n");
|
||||||
|
tool_page_line(&line_count, &continuous);
|
||||||
|
|
||||||
|
if (last_id == MAX_U32) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (explicit_server && !found) {
|
||||||
|
fprintf(stdout, "Server %s not found.\n", pattern);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stdout, "\nTotal of %d file servers found\n", found);
|
||||||
|
|
||||||
|
return(0);
|
||||||
}
|
}
|
||||||
|
|||||||
1
test/README.TXT
Normal file
1
test/README.TXT
Normal file
@@ -0,0 +1 @@
|
|||||||
|
See README.md for the test layout. DOS-run files keep 8.3 names.
|
||||||
34
test/README.md
Normal file
34
test/README.md
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
# MARS dosutils tests
|
||||||
|
|
||||||
|
This directory contains DOS-side regression and compatibility tests for `mars-dosutils`.
|
||||||
|
|
||||||
|
The tests are grouped by feature so that Novell reference-tool checks and our own tool regressions stay separated but easy to compare.
|
||||||
|
|
||||||
|
## Directory layout
|
||||||
|
|
||||||
|
| Directory | Purpose |
|
||||||
|
| --- | --- |
|
||||||
|
| `flag/` | File/directory attribute tests, Novell `NPUBLIC\FLAG` baseline and MARS `PUBLIC\FLAG` regression notes. |
|
||||||
|
| `flagdir/` | Planned: directory-specific FLAG and recursive attribute tests. |
|
||||||
|
| `grant/` | Planned: trustee grant tests. |
|
||||||
|
| `rights/` | Planned: effective-rights and trustee readback tests. |
|
||||||
|
| `map/` | Planned: MAP command and login-script mapping tests. |
|
||||||
|
| `login/` | Planned: LOGIN/NLOGIN compatibility tests. |
|
||||||
|
| `logout/` | Planned: LOGOUT/NLOGOUT compatibility tests. |
|
||||||
|
|
||||||
|
## Naming
|
||||||
|
|
||||||
|
DOS-executed files should use 8.3 names. Keep Novell reference tests and MARS tests close together, but name them clearly.
|
||||||
|
|
||||||
|
Suggested suffixes:
|
||||||
|
|
||||||
|
- `*N.BAT` for Novell-only baseline tests using `NPUBLIC`/`NLOGIN`.
|
||||||
|
- `*M.TST` or `*M.BAT` for MARS/dosutils tests using `PUBLIC`/`LOGIN`.
|
||||||
|
- `*CMP.BAT` for comparison/helper scripts.
|
||||||
|
|
||||||
|
## Expected workflow
|
||||||
|
|
||||||
|
1. Run the Novell baseline test first.
|
||||||
|
2. Check the MARS NWE server log for the expected NCP path and completion codes.
|
||||||
|
3. Run or implement the matching MARS/dosutils regression test.
|
||||||
|
4. Keep notes in the feature directory `README.md`.
|
||||||
101
test/creator/CIXSTA.BAT
Normal file
101
test/creator/CIXSTA.BAT
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
@ECHO OFF
|
||||||
|
REM CIXSTA.BAT
|
||||||
|
REM Automated CREATOR/xattr test for MARS NWE.
|
||||||
|
REM
|
||||||
|
REM Uses PUBLIC\CREATOR.EXE to set creator/modifier/archive metadata through
|
||||||
|
REM the same NCP22/25 Set Directory/File Information path as FILER.
|
||||||
|
REM
|
||||||
|
REM Run as SUPERVISOR.
|
||||||
|
REM
|
||||||
|
REM Test tree:
|
||||||
|
REM F:\CIXTEST
|
||||||
|
REM Result tree:
|
||||||
|
REM F:\CIXCMP
|
||||||
|
|
||||||
|
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 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
|
||||||
|
|
||||||
|
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. >> 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
|
||||||
|
|
||||||
|
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. >> F:\CIXCMP\SUMMARY.TXT
|
||||||
|
ECHO Next Linux-side step: run cix_collect_xattr.sh, then CIXZIP. >> F:\CIXCMP\SUMMARY.TXT
|
||||||
|
|
||||||
|
ECHO.
|
||||||
|
ECHO CIXSTA fertig.
|
||||||
|
ECHO Jetzt auf Linux cix_collect_xattr.sh ausfuehren, dann CIXZIP.
|
||||||
|
ECHO.
|
||||||
26
test/creator/CIXZIP.BAT
Normal file
26
test/creator/CIXZIP.BAT
Normal 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 >> 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.
|
||||||
75
test/creator/README.md
Normal file
75
test/creator/README.md
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
# CREATOR / xattr automated test
|
||||||
|
|
||||||
|
This replaces the old FILER/manual creator-xattr test with a direct test using
|
||||||
|
`PUBLIC\CREATOR.EXE`.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
`PUBLIC\CREATOR.EXE` from the new dosutils tree must be installed.
|
||||||
|
|
||||||
|
## DOS flow
|
||||||
|
|
||||||
|
Run as `SUPERVISOR`:
|
||||||
|
|
||||||
|
```text
|
||||||
|
CIXSTA
|
||||||
|
```
|
||||||
|
|
||||||
|
Then run the Linux-side collector:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo ./cix_collect_xattr.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Then package in DOS:
|
||||||
|
|
||||||
|
```text
|
||||||
|
CIXZIP
|
||||||
|
```
|
||||||
|
|
||||||
|
Result ZIP:
|
||||||
|
|
||||||
|
```text
|
||||||
|
F:\CIXCMP\CIXSTA.ZIP
|
||||||
|
```
|
||||||
|
|
||||||
|
Linux package with server log:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo ./mars_packtest_v3.sh cixsta 5 mario
|
||||||
|
```
|
||||||
|
|
||||||
|
## Test directories
|
||||||
|
|
||||||
|
```text
|
||||||
|
F:\CIXTEST
|
||||||
|
F:\CIXCMP
|
||||||
|
```
|
||||||
|
|
||||||
|
## 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
|
||||||
|
```
|
||||||
|
|
||||||
|
## Important outputs
|
||||||
|
|
||||||
|
```text
|
||||||
|
F:\CIXCMP\POST\CSUP.OUT
|
||||||
|
F:\CIXCMP\POST\CARCH.OUT
|
||||||
|
F:\CIXCMP\POST\CALL.OUT
|
||||||
|
F:\CIXCMP\POST\SUPDAT.OUT
|
||||||
|
F:\CIXCMP\LINUX\getfattr.txt
|
||||||
|
F:\CIXCMP\LINUX\xattr_focus.txt
|
||||||
|
```
|
||||||
64
test/creator/cix_collect_xattr.sh
Normal file
64
test/creator/cix_collect_xattr.sh
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# cix_collect_xattr.sh
|
||||||
|
#
|
||||||
|
# Linux-side collector for the CIXSTA CREATOR/xattr test.
|
||||||
|
#
|
||||||
|
# Run as root after CIXSTA.BAT and before CIXZIP.BAT:
|
||||||
|
# sudo ./cix_collect_xattr.sh
|
||||||
|
#
|
||||||
|
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
SYS="/var/mars_nwe/SYS"
|
||||||
|
TREE="$SYS/CIXTEST"
|
||||||
|
OUT="$SYS/CIXCMP/LINUX"
|
||||||
|
|
||||||
|
mkdir -p "$OUT"
|
||||||
|
|
||||||
|
echo "CIX CREATOR xattr/stat collection" > "$OUT/collector_info.txt"
|
||||||
|
echo "Created: $(date)" >> "$OUT/collector_info.txt"
|
||||||
|
echo "Tree: $TREE" >> "$OUT/collector_info.txt"
|
||||||
|
echo >> "$OUT/collector_info.txt"
|
||||||
|
|
||||||
|
if ! command -v getfattr >/dev/null 2>&1; then
|
||||||
|
echo "ERROR: getfattr not installed. Install attr package." | tee "$OUT/getfattr_missing.txt"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
find "$TREE" -xdev -print | sort > "$OUT/files.txt"
|
||||||
|
|
||||||
|
{
|
||||||
|
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 < "$OUT/files.txt"
|
||||||
|
} > "$OUT/stat.txt"
|
||||||
|
|
||||||
|
{
|
||||||
|
while IFS= read -r p; do
|
||||||
|
echo "### $p"
|
||||||
|
getfattr -m - --absolute-names "$p" 2>/dev/null || true
|
||||||
|
echo
|
||||||
|
done < "$OUT/files.txt"
|
||||||
|
} > "$OUT/xattr_names.txt"
|
||||||
|
|
||||||
|
{
|
||||||
|
while IFS= read -r p; do
|
||||||
|
echo "### $p"
|
||||||
|
getfattr -d -m - -e hex --absolute-names "$p" 2>/dev/null || true
|
||||||
|
echo
|
||||||
|
done < "$OUT/files.txt"
|
||||||
|
} > "$OUT/getfattr.txt"
|
||||||
|
|
||||||
|
grep -iE 'mars|netware|trust|owner|creator|modifier|archiv|fileinfo|dos|attr|nwe' "$OUT/getfattr.txt" > "$OUT/xattr_focus.txt" || true
|
||||||
|
|
||||||
|
chmod -R a+r "$OUT"
|
||||||
|
|
||||||
|
echo "Wrote:"
|
||||||
|
echo " $OUT/collector_info.txt"
|
||||||
|
echo " $OUT/files.txt"
|
||||||
|
echo " $OUT/stat.txt"
|
||||||
|
echo " $OUT/xattr_names.txt"
|
||||||
|
echo " $OUT/getfattr.txt"
|
||||||
|
echo " $OUT/xattr_focus.txt"
|
||||||
37
test/deploy.sh
Normal file
37
test/deploy.sh
Normal 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
63
test/filer/FILCMPN.BAT
Normal 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
149
test/filer/FILPOSTN.BAT
Normal 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
153
test/filer/FILPREN.BAT
Normal 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
33
test/filer/FILTSTM.TST
Normal 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
211
test/filer/FILTSTN.BAT
Normal 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
172
test/filer/README.md
Normal 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
101
test/flag/FLGC.BAT
Normal 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
191
test/flag/FLGTSTA.BAT
Normal 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
25
test/flag/FLGTZIP.BAT
Normal 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
50
test/flag/README.md
Normal 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
79
test/flagdir/FDGC.BAT
Normal 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
147
test/flagdir/FDGTSTA.BAT
Normal 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
25
test/flagdir/FDGTZIP.BAT
Normal 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
51
test/flagdir/README.md
Normal 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
165
test/grant/GRNTC.BAT
Normal 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
491
test/grant/GRNTSTA.BAT
Normal 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
26
test/grant/GRNTZIP.BAT
Normal 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
42
test/grant/README.md
Normal 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
87
test/login/LGNTC.BAT
Normal 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
160
test/login/LGNTSTA.BAT
Normal 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
27
test/login/LGNTZIP.BAT
Normal 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
75
test/login/README.md
Normal 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
4
test/logout/README.md
Normal 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
178
test/map/MAPTSTA.BAT
Normal 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
26
test/map/MAPTZIP.BAT
Normal 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.
|
||||||
64
test/map/README.md
Normal file
64
test/map/README.md
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
# MAP automated test
|
||||||
|
|
||||||
|
Novell MAP baseline using `NPUBLIC\MAP`.
|
||||||
|
|
||||||
|
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
161
test/mars_packtest_v3.sh
Normal 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
56
test/ncopy/NCPCMPN.BAT
Normal 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
|
||||||
171
test/ncopy/NCPTSTA.BAT
Normal file
171
test/ncopy/NCPTSTA.BAT
Normal file
@@ -0,0 +1,171 @@
|
|||||||
|
@ECHO OFF
|
||||||
|
REM NCPTSTA.BAT
|
||||||
|
REM Automated Novell NCOPY baseline for MARS NWE.
|
||||||
|
REM
|
||||||
|
REM Ziel:
|
||||||
|
REM - keine Screenshots noetig
|
||||||
|
REM - keine PAUSE
|
||||||
|
REM - kein ZIP im Hauptlauf
|
||||||
|
REM - keine Wildcard-DEL
|
||||||
|
REM - keine interaktive Overwrite-Abfrage
|
||||||
|
REM
|
||||||
|
REM Ergebnisse:
|
||||||
|
REM F:\NCMP\RUN.LOG
|
||||||
|
REM F:\NCMP\SUMMARY.TXT
|
||||||
|
REM F:\NCMP\PRE\*.OUT
|
||||||
|
REM F:\NCMP\POST\*.OUT
|
||||||
|
REM F:\NCMP\CMP\*.OUT
|
||||||
|
|
||||||
|
F:
|
||||||
|
CD \
|
||||||
|
|
||||||
|
REM --- Clean generated test/result directories (contents only). ---
|
||||||
|
IF EXIST NCPTEST\NUL DELTREE /Y NCPTEST\*.*
|
||||||
|
IF EXIST NCPCMP\NUL DELTREE /Y NCPCMP\*.*
|
||||||
|
|
||||||
|
REM --- Directory setup, DOS-kompatibel mit DIR\NUL ---
|
||||||
|
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\PRE\NUL MD NCMP\PRE
|
||||||
|
IF NOT EXIST NCMP\POST\NUL MD NCMP\POST
|
||||||
|
IF NOT EXIST NCMP\CMP\NUL MD NCMP\CMP
|
||||||
|
|
||||||
|
REM --- Einzeldateien loeschen, aber nur wenn vorhanden ---
|
||||||
|
IF EXIST F:\NCMP\RUN.LOG DEL F:\NCMP\RUN.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
|
||||||
|
|
||||||
|
IF EXIST F:\NCMP\PRE\SRCA.OUT DEL F:\NCMP\PRE\SRCA.OUT
|
||||||
|
IF EXIST F:\NCMP\PRE\SRCB.OUT DEL F:\NCMP\PRE\SRCB.OUT
|
||||||
|
IF EXIST F:\NCMP\PRE\SRCC.OUT DEL F:\NCMP\PRE\SRCC.OUT
|
||||||
|
IF EXIST F:\NCMP\PRE\SRCNDIR.OUT DEL F:\NCMP\PRE\SRCNDIR.OUT
|
||||||
|
IF EXIST F:\NCMP\PRE\SRCDATE.OUT DEL F:\NCMP\PRE\SRCDATE.OUT
|
||||||
|
IF EXIST F:\NCMP\PRE\SRCRGHT.OUT DEL F:\NCMP\PRE\SRCRGHT.OUT
|
||||||
|
IF EXIST F:\NCMP\PRE\SRCTRST.OUT DEL F:\NCMP\PRE\SRCTRST.OUT
|
||||||
|
|
||||||
|
IF EXIST F:\NCMP\POST\SRCA.OUT DEL F:\NCMP\POST\SRCA.OUT
|
||||||
|
IF EXIST F:\NCMP\POST\SRCB.OUT DEL F:\NCMP\POST\SRCB.OUT
|
||||||
|
IF EXIST F:\NCMP\POST\SRCC.OUT DEL F:\NCMP\POST\SRCC.OUT
|
||||||
|
IF EXIST F:\NCMP\POST\DSTA1.OUT DEL F:\NCMP\POST\DSTA1.OUT
|
||||||
|
IF EXIST F:\NCMP\POST\DSTAV.OUT DEL F:\NCMP\POST\DSTAV.OUT
|
||||||
|
IF EXIST F:\NCMP\POST\DSTB.OUT DEL F:\NCMP\POST\DSTB.OUT
|
||||||
|
IF EXIST F:\NCMP\POST\SRCNDIR.OUT DEL F:\NCMP\POST\SRCNDIR.OUT
|
||||||
|
IF EXIST F:\NCMP\POST\SRCDATE.OUT DEL F:\NCMP\POST\SRCDATE.OUT
|
||||||
|
IF EXIST F:\NCMP\POST\DSTNDIR.OUT DEL F:\NCMP\POST\DSTNDIR.OUT
|
||||||
|
IF EXIST F:\NCMP\POST\DSTDATE.OUT DEL F:\NCMP\POST\DSTDATE.OUT
|
||||||
|
IF EXIST F:\NCMP\POST\SCPYSUB.OUT DEL F:\NCMP\POST\SCPYSUB.OUT
|
||||||
|
IF EXIST F:\NCMP\POST\ECPYSUB.OUT DEL F:\NCMP\POST\ECPYSUB.OUT
|
||||||
|
IF EXIST F:\NCMP\POST\ARCHSUB.OUT DEL F:\NCMP\POST\ARCHSUB.OUT
|
||||||
|
|
||||||
|
IF EXIST F:\NCMP\CMP\SRCA.OUT DEL F:\NCMP\CMP\SRCA.OUT
|
||||||
|
IF EXIST F:\NCMP\CMP\SRCB.OUT DEL F:\NCMP\CMP\SRCB.OUT
|
||||||
|
IF EXIST F:\NCMP\CMP\SRCC.OUT DEL F:\NCMP\CMP\SRCC.OUT
|
||||||
|
IF EXIST F:\NCMP\CMP\SRCNDIR.OUT DEL F:\NCMP\CMP\SRCNDIR.OUT
|
||||||
|
IF EXIST F:\NCMP\CMP\SRCDATE.OUT DEL F:\NCMP\CMP\SRCDATE.OUT
|
||||||
|
|
||||||
|
ECHO NCPTSTA automated NCOPY test > F:\NCMP\RUN.LOG
|
||||||
|
DATE >> F:\NCMP\RUN.LOG
|
||||||
|
TIME >> F:\NCMP\RUN.LOG
|
||||||
|
ECHO. >> F:\NCMP\RUN.LOG
|
||||||
|
|
||||||
|
ECHO === SETUP === >> 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
|
||||||
|
|
||||||
|
ECHO Normalisiere Attribute... >> F:\NCMP\RUN.LOG
|
||||||
|
NPUBLIC\FLAG F:\TCOPY\SRC\A.TXT N >> F:\NCMP\RUN.LOG
|
||||||
|
NPUBLIC\FLAG F:\TCOPY\SRC\B.TXT N >> F:\NCMP\RUN.LOG
|
||||||
|
NPUBLIC\FLAG F:\TCOPY\SRC\SUB\C.TXT N >> F:\NCMP\RUN.LOG
|
||||||
|
NPUBLIC\FLAG F:\TCOPY\DST\A.TXT N >> F:\NCMP\RUN.LOG
|
||||||
|
|
||||||
|
ECHO Setze Testattribute... >> F:\NCMP\RUN.LOG
|
||||||
|
NPUBLIC\FLAG F:\TCOPY\SRC\A.TXT +H +A >> F:\NCMP\RUN.LOG
|
||||||
|
NPUBLIC\FLAG F:\TCOPY\SRC\B.TXT +RO +A >> F:\NCMP\RUN.LOG
|
||||||
|
NPUBLIC\FLAG F:\TCOPY\SRC\SUB\C.TXT +A >> F:\NCMP\RUN.LOG
|
||||||
|
|
||||||
|
ECHO === PRE CAPTURE === >> F:\NCMP\RUN.LOG
|
||||||
|
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 === NCOPY SINGLE FILES === >> F:\NCMP\RUN.LOG
|
||||||
|
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
|
||||||
|
|
||||||
|
NPUBLIC\NCOPY F:\TCOPY\SRC\A.TXT TO F:\TCOPY\DST\A1.TXT >> F:\NCMP\RUN.LOG
|
||||||
|
NPUBLIC\NCOPY F:\TCOPY\SRC\B.TXT TO F:\TCOPY\DST\B.TXT >> F:\NCMP\RUN.LOG
|
||||||
|
NPUBLIC\NCOPY F:\TCOPY\SRC\A.TXT TO F:\TCOPY\DST\AV.TXT /V >> F:\NCMP\RUN.LOG
|
||||||
|
|
||||||
|
ECHO === NCOPY SUBDIRS === >> F:\NCMP\RUN.LOG
|
||||||
|
NPUBLIC\NCOPY F:\TCOPY\SRC\*.* TO F:\TCOPY\DST\SCPY /S >> F:\NCMP\RUN.LOG
|
||||||
|
NPUBLIC\NCOPY F:\TCOPY\SRC\*.* TO F:\TCOPY\DST\ECPY /S /E >> F:\NCMP\RUN.LOG
|
||||||
|
|
||||||
|
ECHO === NCOPY ARCHIVE MODES === >> F:\NCMP\RUN.LOG
|
||||||
|
NPUBLIC\NCOPY F:\TCOPY\SRC\*.* TO F:\TCOPY\ARCH\ACPY /A /S >> F:\NCMP\RUN.LOG
|
||||||
|
NPUBLIC\NCOPY F:\TCOPY\SRC\*.* TO F:\TCOPY\ARCH\MCPY /M /S >> F:\NCMP\RUN.LOG
|
||||||
|
|
||||||
|
ECHO === POST CAPTURE === >> F:\NCMP\RUN.LOG
|
||||||
|
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\AV.TXT > F:\NCMP\POST\DSTAV.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 === COMPARE === >> F:\NCMP\RUN.LOG
|
||||||
|
FC F:\NCMP\PRE\SRCA.OUT F:\NCMP\POST\SRCA.OUT > F:\NCMP\CMP\SRCA.OUT
|
||||||
|
FC F:\NCMP\PRE\SRCB.OUT F:\NCMP\POST\SRCB.OUT > F:\NCMP\CMP\SRCB.OUT
|
||||||
|
FC F:\NCMP\PRE\SRCC.OUT F:\NCMP\POST\SRCC.OUT > F:\NCMP\CMP\SRCC.OUT
|
||||||
|
FC F:\NCMP\PRE\SRCNDIR.OUT F:\NCMP\POST\SRCNDIR.OUT > F:\NCMP\CMP\SRCNDIR.OUT
|
||||||
|
FC F:\NCMP\PRE\SRCDATE.OUT F:\NCMP\POST\SRCDATE.OUT > F:\NCMP\CMP\SRCDATE.OUT
|
||||||
|
|
||||||
|
ECHO === SUMMARY === > F:\NCMP\SUMMARY.TXT
|
||||||
|
ECHO NCOPY automated test finished. >> F:\NCMP\SUMMARY.TXT
|
||||||
|
ECHO. >> F:\NCMP\SUMMARY.TXT
|
||||||
|
ECHO Expected notes: >> F:\NCMP\SUMMARY.TXT
|
||||||
|
ECHO - Source FLAG compare may differ after /M because archive bit should be cleared. >> F:\NCMP\SUMMARY.TXT
|
||||||
|
ECHO - DSTNDIR.OUT should show A1.TXT, AV.TXT, B.TXT and copy directories. >> F:\NCMP\SUMMARY.TXT
|
||||||
|
ECHO - SCPYSUB.OUT should include copied SUB\C.TXT. >> F:\NCMP\SUMMARY.TXT
|
||||||
|
ECHO - ECPYSUB.OUT should include copied SUB\C.TXT and possibly EMPTY directory. >> F:\NCMP\SUMMARY.TXT
|
||||||
|
ECHO - ARCHSUB.OUT should show /A and /M archive-copy result directories. >> F:\NCMP\SUMMARY.TXT
|
||||||
|
ECHO. >> F:\NCMP\SUMMARY.TXT
|
||||||
|
ECHO Optional pack results with NCPTZIP.BAT. >> F:\NCMP\SUMMARY.TXT
|
||||||
|
|
||||||
|
ECHO === CLEANUP ATTRIBUTES === >> F:\NCMP\RUN.LOG
|
||||||
|
NPUBLIC\FLAG F:\TCOPY\SRC\A.TXT N >> F:\NCMP\RUN.LOG
|
||||||
|
NPUBLIC\FLAG F:\TCOPY\SRC\B.TXT N >> F:\NCMP\RUN.LOG
|
||||||
|
NPUBLIC\FLAG F:\TCOPY\SRC\SUB\C.TXT N >> F:\NCMP\RUN.LOG
|
||||||
|
NPUBLIC\FLAG F:\TCOPY\DST\A.TXT N >> F:\NCMP\RUN.LOG
|
||||||
|
NPUBLIC\FLAG F:\TCOPY\DST\A1.TXT N >> F:\NCMP\RUN.LOG
|
||||||
|
NPUBLIC\FLAG F:\TCOPY\DST\AV.TXT N >> F:\NCMP\RUN.LOG
|
||||||
|
NPUBLIC\FLAG F:\TCOPY\DST\B.TXT N >> F:\NCMP\RUN.LOG
|
||||||
|
|
||||||
|
ECHO.
|
||||||
|
ECHO NCPTSTA fertig.
|
||||||
|
ECHO Ergebnisse liegen in F:\NCMP
|
||||||
|
ECHO Optional: NCPTZIP ausfuehren.
|
||||||
|
ECHO.
|
||||||
32
test/ncopy/NCPTSTM.TST
Normal file
32
test/ncopy/NCPTSTM.TST
Normal 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
262
test/ncopy/NCPTSTN.BAT
Normal 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.
|
||||||
28
test/ncopy/NCPTZIP.BAT
Normal file
28
test/ncopy/NCPTZIP.BAT
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
@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 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 \TCOPY\NUL DELTREE /Y \TCOPY >> ZIP.LOG
|
||||||
|
IF EXIST \TNCOPY\NUL DELTREE /Y \TNCOPY >> ZIP.LOG
|
||||||
|
IF EXIST \NCPTEST\NUL DELTREE /Y \NCPTEST >> ZIP.LOG
|
||||||
|
CD \
|
||||||
|
ECHO.
|
||||||
|
ECHO ZIP step finished.
|
||||||
|
ECHO Check:
|
||||||
|
ECHO F:\NCMP\NCPTSTA.ZIP
|
||||||
|
ECHO F:\NCMP\ZIP.LOG
|
||||||
|
ECHO.
|
||||||
64
test/ncopy/README.md
Normal file
64
test/ncopy/README.md
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
# NCOPY tests
|
||||||
|
|
||||||
|
Novell-only NCOPY tests.
|
||||||
|
|
||||||
|
## Files
|
||||||
|
|
||||||
|
| File | Purpose |
|
||||||
|
| --- | --- |
|
||||||
|
| `NCPTSTA.BAT` | Automated no-pause/no-screenshot NCOPY test. Writes results to `F:\NCMP`. |
|
||||||
|
| `README_AUTO.md` | Details 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. |
|
||||||
|
|
||||||
|
## Recommended now
|
||||||
|
|
||||||
|
Use:
|
||||||
|
|
||||||
|
```text
|
||||||
|
NCPTSTA.BAT
|
||||||
|
```
|
||||||
|
|
||||||
|
Then collect:
|
||||||
|
|
||||||
|
```text
|
||||||
|
F:\NCMP\NCPTSTA.ZIP
|
||||||
|
```
|
||||||
|
|
||||||
|
or, if ZIP is not installed yet:
|
||||||
|
|
||||||
|
```text
|
||||||
|
F:\NCMP\RUN.LOG
|
||||||
|
F:\NCMP\SUMMARY.TXT
|
||||||
|
F:\NCMP\PRE\*.OUT
|
||||||
|
F:\NCMP\POST\*.OUT
|
||||||
|
F:\NCMP\CMP\*.OUT
|
||||||
|
```
|
||||||
|
# NCOPY automated BAT test
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```text
|
||||||
|
NCPTSTA
|
||||||
|
```
|
||||||
|
|
||||||
|
The test writes all useful output to:
|
||||||
|
|
||||||
|
```text
|
||||||
|
F:\NCMP
|
||||||
|
```
|
||||||
|
|
||||||
|
Upload either the directory contents or run:
|
||||||
|
|
||||||
|
```text
|
||||||
|
NCPTZIP
|
||||||
|
```
|
||||||
|
|
||||||
|
and upload:
|
||||||
|
|
||||||
|
```text
|
||||||
|
F:\NCMP\NCPTSTA.ZIP
|
||||||
|
```
|
||||||
|
|
||||||
|
This version avoids wildcard deletes, interactive overwrite prompts, PAUSE, and automatic ZIP.
|
||||||
45
test/ncopy/README_AUTO.md
Normal file
45
test/ncopy/README_AUTO.md
Normal 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.
|
||||||
134
test/ndir/NDIRCMP.BAT
Normal file
134
test/ndir/NDIRCMP.BAT
Normal 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 ===
|
||||||
172
test/ndir/NDIRTSTA.BAT
Normal file
172
test/ndir/NDIRTSTA.BAT
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
@ECHO OFF
|
||||||
|
REM NDIRTSTA.BAT
|
||||||
|
REM Automated Novell NDIR baseline for MARS NWE.
|
||||||
|
REM
|
||||||
|
REM No PAUSE, no screenshots required.
|
||||||
|
REM All output is redirected into F:\NDCMP.
|
||||||
|
REM
|
||||||
|
REM Test tree:
|
||||||
|
REM F:\TNDIR
|
||||||
|
REM
|
||||||
|
REM Results:
|
||||||
|
REM F:\NDCMP\RUN.LOG
|
||||||
|
REM F:\NDCMP\SUMMARY.TXT
|
||||||
|
REM F:\NDCMP\OUT\*.OUT
|
||||||
|
|
||||||
|
F:
|
||||||
|
CD \
|
||||||
|
|
||||||
|
REM --- Clean generated test/result directories (contents only). ---
|
||||||
|
IF EXIST NDIRTEST\NUL DELTREE /Y NDIRTEST\*.*
|
||||||
|
IF EXIST NDIRCMP\NUL DELTREE /Y NDIRCMP\*.*
|
||||||
|
|
||||||
|
REM --- Directory setup ---
|
||||||
|
IF NOT EXIST TNDIR\NUL MD TNDIR
|
||||||
|
IF NOT EXIST TNDIR\SUBDIR\NUL MD TNDIR\SUBDIR
|
||||||
|
IF NOT EXIST NDCMP\NUL MD NDCMP
|
||||||
|
IF NOT EXIST NDCMP\OUT\NUL MD NDCMP\OUT
|
||||||
|
|
||||||
|
REM --- Clean result files, no wildcard DEL to avoid DOS prompts ---
|
||||||
|
IF EXIST F:\NDCMP\RUN.LOG DEL F:\NDCMP\RUN.LOG
|
||||||
|
IF EXIST F:\NDCMP\SUMMARY.TXT DEL F:\NDCMP\SUMMARY.TXT
|
||||||
|
IF EXIST F:\NDCMP\ZIP.LOG DEL F:\NDCMP\ZIP.LOG
|
||||||
|
IF EXIST F:\NDCMP\NDIRTSTA.ZIP DEL F:\NDCMP\NDIRTSTA.ZIP
|
||||||
|
|
||||||
|
IF EXIST F:\NDCMP\OUT\N01_ROOT.OUT DEL F:\NDCMP\OUT\N01_ROOT.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N02_ALFA.OUT DEL F:\NDCMP\OUT\N02_ALFA.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N02_BETA.OUT DEL F:\NDCMP\OUT\N02_BETA.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N03_DATES.OUT DEL F:\NDCMP\OUT\N03_DATES.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N03_ADATE.OUT DEL F:\NDCMP\OUT\N03_ADATE.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N04_RGT.OUT DEL F:\NDCMP\OUT\N04_RGT.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N04_RGTA.OUT DEL F:\NDCMP\OUT\N04_RGTA.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N05_FLGA.OUT DEL F:\NDCMP\OUT\N05_FLGA.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N05_FLGB.OUT DEL F:\NDCMP\OUT\N05_FLGB.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N05_FLGG.OUT DEL F:\NDCMP\OUT\N05_FLGG.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N06_ATTR.OUT DEL F:\NDCMP\OUT\N06_ATTR.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N06_ADAT.OUT DEL F:\NDCMP\OUT\N06_ADAT.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N07_H.OUT DEL F:\NDCMP\OUT\N07_H.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N07_RO.OUT DEL F:\NDCMP\OUT\N07_RO.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N07_SY.OUT DEL F:\NDCMP\OUT\N07_SY.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N07_A.OUT DEL F:\NDCMP\OUT\N07_A.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N08_NOTH.OUT DEL F:\NDCMP\OUT\N08_NOTH.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N08_NOTR.OUT DEL F:\NDCMP\OUT\N08_NOTR.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N09_SUN.OUT DEL F:\NDCMP\OUT\N09_SUN.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N09_SSI.OUT DEL F:\NDCMP\OUT\N09_SSI.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N09_SUP.OUT DEL F:\NDCMP\OUT\N09_SUP.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N10_TXT.OUT DEL F:\NDCMP\OUT\N10_TXT.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N10_DAT.OUT DEL F:\NDCMP\OUT\N10_DAT.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N11_FO.OUT DEL F:\NDCMP\OUT\N11_FO.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N11_DO.OUT DEL F:\NDCMP\OUT\N11_DO.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N12_SUB.OUT DEL F:\NDCMP\OUT\N12_SUB.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N12_SDIR.OUT DEL F:\NDCMP\OUT\N12_SDIR.OUT
|
||||||
|
IF EXIST F:\NDCMP\OUT\N14_FINAL.OUT DEL F:\NDCMP\OUT\N14_FINAL.OUT
|
||||||
|
|
||||||
|
ECHO NDIRTSTA automated Novell NDIR baseline > F:\NDCMP\RUN.LOG
|
||||||
|
ECHO Date/time stamp skipped to avoid DOS prompt. >> F:\NDCMP\RUN.LOG
|
||||||
|
ECHO. >> F:\NDCMP\RUN.LOG
|
||||||
|
|
||||||
|
ECHO === SETUP TEST TREE === >> F:\NDCMP\RUN.LOG
|
||||||
|
|
||||||
|
REM Reset test files.
|
||||||
|
IF EXIST F:\TNDIR\ALPHA.TXT DEL F:\TNDIR\ALPHA.TXT
|
||||||
|
IF EXIST F:\TNDIR\BETA.TXT DEL F:\TNDIR\BETA.TXT
|
||||||
|
IF EXIST F:\TNDIR\GAMMA.DAT DEL F:\TNDIR\GAMMA.DAT
|
||||||
|
IF EXIST F:\TNDIR\SUBDIR\SUB.TXT DEL F:\TNDIR\SUBDIR\SUB.TXT
|
||||||
|
|
||||||
|
IF NOT EXIST F:\TNDIR\NUL MD F:\TNDIR
|
||||||
|
IF NOT EXIST F:\TNDIR\SUBDIR\NUL MD F:\TNDIR\SUBDIR
|
||||||
|
|
||||||
|
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 === 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
|
||||||
|
|
||||||
|
ECHO === N01 BASIS DIRECTORY === >> F:\NDCMP\RUN.LOG
|
||||||
|
NPUBLIC\NDIR F:\TNDIR > F:\NDCMP\OUT\N01_ROOT.OUT
|
||||||
|
|
||||||
|
ECHO === N02 DIRECT FILES === >> F:\NDCMP\RUN.LOG
|
||||||
|
NPUBLIC\NDIR F:\TNDIR\ALPHA.TXT > F:\NDCMP\OUT\N02_ALFA.OUT
|
||||||
|
NPUBLIC\NDIR F:\TNDIR\BETA.TXT > F:\NDCMP\OUT\N02_BETA.OUT
|
||||||
|
|
||||||
|
ECHO === N03 DATES === >> F:\NDCMP\RUN.LOG
|
||||||
|
NPUBLIC\NDIR F:\TNDIR /DATES > F:\NDCMP\OUT\N03_DATES.OUT
|
||||||
|
NPUBLIC\NDIR F:\TNDIR\ALPHA.TXT /DATES > F:\NDCMP\OUT\N03_ADATE.OUT
|
||||||
|
|
||||||
|
ECHO === N04 RIGHTS === >> F:\NDCMP\RUN.LOG
|
||||||
|
NPUBLIC\RIGHTS F:\TNDIR > F:\NDCMP\OUT\N04_RGT.OUT
|
||||||
|
NPUBLIC\NDIR F:\TNDIR /RIGHTS >> F:\NDCMP\OUT\N04_RGT.OUT
|
||||||
|
NPUBLIC\NDIR F:\TNDIR\ALPHA.TXT /RIGHTS > F:\NDCMP\OUT\N04_RGTA.OUT
|
||||||
|
|
||||||
|
ECHO === N05 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\FLAG F:\TNDIR\ALPHA.TXT > F:\NDCMP\OUT\N05_FLGA.OUT
|
||||||
|
NPUBLIC\FLAG F:\TNDIR\BETA.TXT > F:\NDCMP\OUT\N05_FLGB.OUT
|
||||||
|
NPUBLIC\FLAG F:\TNDIR\GAMMA.DAT > F:\NDCMP\OUT\N05_FLGG.OUT
|
||||||
|
|
||||||
|
ECHO === N06 NDIR AFTER ATTRIBUTES === >> F:\NDCMP\RUN.LOG
|
||||||
|
NPUBLIC\NDIR F:\TNDIR > F:\NDCMP\OUT\N06_ATTR.OUT
|
||||||
|
NPUBLIC\NDIR F:\TNDIR /DATES > F:\NDCMP\OUT\N06_ADAT.OUT
|
||||||
|
|
||||||
|
ECHO === N07 ATTRIBUTE FILTERS === >> F:\NDCMP\RUN.LOG
|
||||||
|
NPUBLIC\NDIR F:\TNDIR /H > F:\NDCMP\OUT\N07_H.OUT
|
||||||
|
NPUBLIC\NDIR F:\TNDIR /RO > F:\NDCMP\OUT\N07_RO.OUT
|
||||||
|
NPUBLIC\NDIR F:\TNDIR /SY > F:\NDCMP\OUT\N07_SY.OUT
|
||||||
|
NPUBLIC\NDIR F:\TNDIR /A > F:\NDCMP\OUT\N07_A.OUT
|
||||||
|
|
||||||
|
ECHO === N08 NOT FILTERS === >> F:\NDCMP\RUN.LOG
|
||||||
|
NPUBLIC\NDIR F:\TNDIR /NOT H > F:\NDCMP\OUT\N08_NOTH.OUT
|
||||||
|
NPUBLIC\NDIR F:\TNDIR /NOT RO > F:\NDCMP\OUT\N08_NOTR.OUT
|
||||||
|
|
||||||
|
ECHO === N09 SORT TESTS === >> F:\NDCMP\RUN.LOG
|
||||||
|
NPUBLIC\NDIR F:\TNDIR /SORT UN > F:\NDCMP\OUT\N09_SUN.OUT
|
||||||
|
NPUBLIC\NDIR F:\TNDIR /SORT SI > F:\NDCMP\OUT\N09_SSI.OUT
|
||||||
|
NPUBLIC\NDIR F:\TNDIR /SORT UP > F:\NDCMP\OUT\N09_SUP.OUT
|
||||||
|
|
||||||
|
ECHO === N10 WILDCARDS === >> F:\NDCMP\RUN.LOG
|
||||||
|
NPUBLIC\NDIR F:\TNDIR\*.TXT > F:\NDCMP\OUT\N10_TXT.OUT
|
||||||
|
NPUBLIC\NDIR F:\TNDIR\*.DAT > F:\NDCMP\OUT\N10_DAT.OUT
|
||||||
|
|
||||||
|
ECHO === N11 FILES ONLY / DIRS ONLY === >> F:\NDCMP\RUN.LOG
|
||||||
|
NPUBLIC\NDIR F:\TNDIR /FO > F:\NDCMP\OUT\N11_FO.OUT
|
||||||
|
NPUBLIC\NDIR F:\TNDIR /DO > F:\NDCMP\OUT\N11_DO.OUT
|
||||||
|
|
||||||
|
ECHO === N12 SUBDIRECTORY TEST === >> F:\NDCMP\RUN.LOG
|
||||||
|
NPUBLIC\NDIR F:\TNDIR /SUB > F:\NDCMP\OUT\N12_SUB.OUT
|
||||||
|
NPUBLIC\NDIR F:\TNDIR\SUBDIR > F:\NDCMP\OUT\N12_SDIR.OUT
|
||||||
|
|
||||||
|
ECHO === N14 CLEANUP ATTRIBUTES === >> 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\NDIR F:\TNDIR > F:\NDCMP\OUT\N14_FINAL.OUT
|
||||||
|
|
||||||
|
ECHO === SUMMARY === > F:\NDCMP\SUMMARY.TXT
|
||||||
|
ECHO NDIRTSTA automated Novell NDIR baseline finished. >> F:\NDCMP\SUMMARY.TXT
|
||||||
|
ECHO. >> F:\NDCMP\SUMMARY.TXT
|
||||||
|
ECHO Outputs are in F:\NDCMP\OUT. >> F:\NDCMP\SUMMARY.TXT
|
||||||
|
ECHO Expected highlights: >> F:\NDCMP\SUMMARY.TXT
|
||||||
|
ECHO - N01_ROOT lists ALPHA.TXT, BETA.TXT, GAMMA.DAT and SUBDIR. >> F:\NDCMP\SUMMARY.TXT
|
||||||
|
ECHO - N03_DATES shows date fields. >> F:\NDCMP\SUMMARY.TXT
|
||||||
|
ECHO - N04_RGT shows rights. >> F:\NDCMP\SUMMARY.TXT
|
||||||
|
ECHO - N05_FLG* shows H, RO, SY/A attribute setup. >> F:\NDCMP\SUMMARY.TXT
|
||||||
|
ECHO - N07_* filters isolate attributes. >> F:\NDCMP\SUMMARY.TXT
|
||||||
|
ECHO - N09_* sort modes run without error. >> F:\NDCMP\SUMMARY.TXT
|
||||||
|
ECHO - N10_TXT lists TXT files; N10_DAT lists GAMMA.DAT. >> F:\NDCMP\SUMMARY.TXT
|
||||||
|
ECHO - N11_FO/N11_DO separate files/directories where supported. >> F:\NDCMP\SUMMARY.TXT
|
||||||
|
ECHO - N12_SUB includes SUBDIR\SUB.TXT. >> F:\NDCMP\SUMMARY.TXT
|
||||||
|
ECHO Optional pack results with NDIRZIP.BAT. >> F:\NDCMP\SUMMARY.TXT
|
||||||
|
|
||||||
|
ECHO.
|
||||||
|
ECHO NDIRTSTA fertig.
|
||||||
|
ECHO Ergebnisse liegen in F:\NDCMP
|
||||||
|
ECHO Optional: NDIRZIP ausfuehren.
|
||||||
|
ECHO.
|
||||||
27
test/ndir/NDIRZIP.BAT
Normal file
27
test/ndir/NDIRZIP.BAT
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
@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 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 \TNDIR\NUL DELTREE /Y \TNDIR >> ZIP.LOG
|
||||||
|
IF EXIST \NDIRTEST\NUL DELTREE /Y \NDIRTEST >> ZIP.LOG
|
||||||
|
CD \
|
||||||
|
ECHO.
|
||||||
|
ECHO ZIP step finished.
|
||||||
|
ECHO Check:
|
||||||
|
ECHO F:\NDCMP\NDIRTSTA.ZIP
|
||||||
|
ECHO F:\NDCMP\ZIP.LOG
|
||||||
|
ECHO.
|
||||||
56
test/ndir/README.md
Normal file
56
test/ndir/README.md
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
# NDIR automated test
|
||||||
|
|
||||||
|
Automated Novell-only baseline for `NPUBLIC\NDIR`.
|
||||||
|
|
||||||
|
## Run
|
||||||
|
|
||||||
|
```text
|
||||||
|
NDIRTSTA
|
||||||
|
```
|
||||||
|
|
||||||
|
Results:
|
||||||
|
|
||||||
|
```text
|
||||||
|
F:\NDCMP\RUN.LOG
|
||||||
|
F:\NDCMP\SUMMARY.TXT
|
||||||
|
F:\NDCMP\OUT\*.OUT
|
||||||
|
```
|
||||||
|
|
||||||
|
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`, `/NOT RO`
|
||||||
|
- sorts `/SORT UN`, `/SORT SI`, `/SORT UP`
|
||||||
|
- wildcards `*.TXT`, `*.DAT`
|
||||||
|
- `/FO`, `/DO`
|
||||||
|
- `/SUB`
|
||||||
|
- cleanup
|
||||||
38
test/remove/README.md
Normal file
38
test/remove/README.md
Normal 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
168
test/remove/RMVC.BAT
Normal 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
595
test/remove/RMVSTA.BAT
Normal 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
26
test/remove/RMVZIP.BAT
Normal 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
55
test/renmove/README.md
Normal 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
188
test/renmove/RMTSTA.BAT
Normal 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
28
test/renmove/RMTZIP.BAT
Normal 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.
|
||||||
31
test/revoke/README.md
Normal file
31
test/revoke/README.md
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# REVOKE baseline test
|
||||||
|
|
||||||
|
Scripts:
|
||||||
|
|
||||||
|
- `RVKSTA.BAT` creates `F:\RVKTEST`, uses Novell `\NPUBLIC\GRANT` for setup, then captures Novell `\NPUBLIC\REVOKE` output into `F:\RVKCMP\OUT`. User `MARIO` is used as trustee target.
|
||||||
|
- `RVKZIP.BAT` packages `RUN.LOG`, `SUMMARY.TXT`, `SETUP`, and `OUT` as `F:\RVKCMP\RVKSTA.ZIP`.
|
||||||
|
|
||||||
|
Run as `SUPERVISOR` or an equivalent user with Access Control rights on `F:\RVKTEST`.
|
||||||
|
|
||||||
|
Covered cases:
|
||||||
|
|
||||||
|
- help and no-argument grammar
|
||||||
|
- normal directory revoke
|
||||||
|
- `ALL` revoke / trustee removal
|
||||||
|
- `/SUBDIRECTORIES` with trustees placed directly on child directories
|
||||||
|
- `/FILES` on an explicit file and on a directory file set
|
||||||
|
- relative path invocation from inside the test directory while invoking `\NPUBLIC\REVOKE` absolutely
|
||||||
|
- no trustee, missing user, missing path behavior, `/FILES` plus `/SUBDIRECTORIES` option-combination behavior, and bad grammar
|
||||||
|
|
||||||
|
This test is still Novell-baseline-only. Later comparison scripts should run the same command set through `NPUBLIC` and `PUBLIC` with normalized output.
|
||||||
|
|
||||||
|
Notes from the first baseline run:
|
||||||
|
|
||||||
|
- `REVOKE /SUBDIRECTORIES` did not exercise child paths unless trustees existed on the child directories themselves, so `D20` now uses `SUBTST\S1` and `SUBTST\S2` with direct trustee setup.
|
||||||
|
- Novell `REVOKE` may report `No trustee for the specified directory.` for a missing path before a separate missing-path diagnostic is reached; `D92` records that baseline behavior.
|
||||||
|
- `D93` now uses an independent tree with directory, file, and subdirectory trustees so the `/FILES /SUBDIRECTORIES` option combination is tested without being masked by missing trustee setup.
|
||||||
|
Retest focus after the fix:
|
||||||
|
|
||||||
|
- `D20_SUBDIRS_REVOKE_CE.OUT` should no longer be masked by a missing trustee on the named root.
|
||||||
|
- `D92_MISSING_PATH.OUT` records the exact Novell diagnostic for a missing path, even if that diagnostic is still `No trustee for the specified directory.`
|
||||||
|
- `D93_FILES_AND_SUBDIRS.OUT` runs on a prepared tree with directory, file, and subdirectory trustees, so the `/FILES /SUBDIRECTORIES` combination is no longer masked by setup.
|
||||||
121
test/revoke/RVKSTA.BAT
Normal file
121
test/revoke/RVKSTA.BAT
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
@ECHO OFF
|
||||||
|
REM RVKSTA.BAT
|
||||||
|
REM Automated REVOKE baseline test for MARS NWE.
|
||||||
|
REM
|
||||||
|
REM Run as SUPERVISOR or a user with Access Control on F:\RVKTEST.
|
||||||
|
REM Uses \NPUBLIC\GRANT for setup and \NPUBLIC\REVOKE as Novell baseline.
|
||||||
|
REM
|
||||||
|
REM Result tree:
|
||||||
|
REM F:\RVKCMP
|
||||||
|
REM Test tree:
|
||||||
|
REM F:\RVKTEST
|
||||||
|
|
||||||
|
F:
|
||||||
|
CD \
|
||||||
|
|
||||||
|
REM --- Clean generated test/result directories (contents only). ---
|
||||||
|
IF EXIST RVKTEST\NUL DELTREE /Y RVKTEST\*.*
|
||||||
|
IF EXIST RVKCMP\NUL DELTREE /Y RVKCMP\*.*
|
||||||
|
|
||||||
|
IF NOT EXIST RVKTEST\NUL MD RVKTEST
|
||||||
|
IF NOT EXIST RVKTEST\ONE\NUL MD RVKTEST\ONE
|
||||||
|
IF NOT EXIST RVKTEST\TREE\NUL MD RVKTEST\TREE
|
||||||
|
IF NOT EXIST RVKTEST\TREE\SUB1\NUL MD RVKTEST\TREE\SUB1
|
||||||
|
IF NOT EXIST RVKTEST\TREE\SUB2\NUL MD RVKTEST\TREE\SUB2
|
||||||
|
IF NOT EXIST RVKTEST\SUBTST\NUL MD RVKTEST\SUBTST
|
||||||
|
IF NOT EXIST RVKTEST\SUBTST\S1\NUL MD RVKTEST\SUBTST\S1
|
||||||
|
IF NOT EXIST RVKTEST\SUBTST\S2\NUL MD RVKTEST\SUBTST\S2
|
||||||
|
IF NOT EXIST RVKTEST\OPTBOTH\NUL MD RVKTEST\OPTBOTH
|
||||||
|
IF NOT EXIST RVKTEST\OPTBOTH\SUB\NUL MD RVKTEST\OPTBOTH\SUB
|
||||||
|
IF NOT EXIST RVKTEST\FILES\NUL MD RVKTEST\FILES
|
||||||
|
IF NOT EXIST RVKTEST\EMPTY\NUL MD RVKTEST\EMPTY
|
||||||
|
IF NOT EXIST RVKCMP\NUL MD RVKCMP
|
||||||
|
IF NOT EXIST RVKCMP\OUT\NUL MD RVKCMP\OUT
|
||||||
|
IF NOT EXIST RVKCMP\SETUP\NUL MD RVKCMP\SETUP
|
||||||
|
|
||||||
|
ECHO REVOKE ONE FILE > F:\RVKTEST\ONE\ONE.TXT
|
||||||
|
ECHO REVOKE TREE FILE > F:\RVKTEST\TREE\TROOT.TXT
|
||||||
|
ECHO REVOKE SUB1 FILE > F:\RVKTEST\TREE\SUB1\SUB1.TXT
|
||||||
|
ECHO REVOKE SUB2 FILE > F:\RVKTEST\TREE\SUB2\SUB2.TXT
|
||||||
|
ECHO REVOKE SUBDIRECTORY S1 > F:\RVKTEST\SUBTST\S1\S1.TXT
|
||||||
|
ECHO REVOKE SUBDIRECTORY S2 > F:\RVKTEST\SUBTST\S2\S2.TXT
|
||||||
|
ECHO REVOKE OPTION ROOT > F:\RVKTEST\OPTBOTH\ROOT.TXT
|
||||||
|
ECHO REVOKE OPTION SUB > F:\RVKTEST\OPTBOTH\SUB\SUB.TXT
|
||||||
|
ECHO REVOKE FILE A > F:\RVKTEST\FILES\A.TXT
|
||||||
|
ECHO REVOKE FILE B > F:\RVKTEST\FILES\B.TXT
|
||||||
|
|
||||||
|
ECHO RVKSTA REVOKE baseline test > F:\RVKCMP\RUN.LOG
|
||||||
|
ECHO Run this as SUPERVISOR or equivalent. >> F:\RVKCMP\RUN.LOG
|
||||||
|
ECHO Setup uses \NPUBLIC\GRANT, test captures \NPUBLIC\REVOKE output for user MARIO. >> F:\RVKCMP\RUN.LOG
|
||||||
|
ECHO. >> F:\RVKCMP\RUN.LOG
|
||||||
|
|
||||||
|
ECHO === SETUP grants === >> F:\RVKCMP\RUN.LOG
|
||||||
|
\NPUBLIC\GRANT R W C E M F A FOR F:\RVKTEST\ONE TO USER MARIO > F:\RVKCMP\SETUP\S01_ONE_GRANT.OUT
|
||||||
|
\NPUBLIC\GRANT R W C E M F A FOR F:\RVKTEST\TREE TO USER MARIO /SUBDIRECTORIES > F:\RVKCMP\SETUP\S02_TREE_GRANT.OUT
|
||||||
|
\NPUBLIC\GRANT R W C E M F A FOR F:\RVKTEST\FILES\A.TXT TO USER MARIO /FILES > F:\RVKCMP\SETUP\S03_FILE_A_GRANT.OUT
|
||||||
|
\NPUBLIC\GRANT R W C E M F A FOR F:\RVKTEST\FILES\B.TXT TO USER MARIO /FILES > F:\RVKCMP\SETUP\S04_FILE_B_GRANT.OUT
|
||||||
|
REM Direct subdirectory trustees for D20, because REVOKE /SUBDIRECTORIES acts on trustees below the named directory.
|
||||||
|
\NPUBLIC\GRANT R W C E M F A FOR F:\RVKTEST\SUBTST\S1 TO USER MARIO > F:\RVKCMP\SETUP\S05_SUBTST_S1_GRANT.OUT
|
||||||
|
\NPUBLIC\GRANT R W C E M F A FOR F:\RVKTEST\SUBTST\S2 TO USER MARIO > F:\RVKCMP\SETUP\S06_SUBTST_S2_GRANT.OUT
|
||||||
|
REM Independent tree with both files and subdirectories for D93 option-combination behavior.
|
||||||
|
\NPUBLIC\GRANT R W C E M F A FOR F:\RVKTEST\OPTBOTH TO USER MARIO > F:\RVKCMP\SETUP\S07_OPTBOTH_ROOT_GRANT.OUT
|
||||||
|
\NPUBLIC\GRANT R W C E M F A FOR F:\RVKTEST\OPTBOTH\SUB TO USER MARIO > F:\RVKCMP\SETUP\S08_OPTBOTH_SUB_GRANT.OUT
|
||||||
|
\NPUBLIC\GRANT R W C E M F A FOR F:\RVKTEST\OPTBOTH\ROOT.TXT TO USER MARIO /FILES > F:\RVKCMP\SETUP\S09_OPTBOTH_FILE_GRANT.OUT
|
||||||
|
|
||||||
|
ECHO === D01 usage/help === >> F:\RVKCMP\RUN.LOG
|
||||||
|
\NPUBLIC\REVOKE /? > F:\RVKCMP\OUT\D01_HELP.OUT
|
||||||
|
|
||||||
|
ECHO === D02 no arguments === >> F:\RVKCMP\RUN.LOG
|
||||||
|
\NPUBLIC\REVOKE > F:\RVKCMP\OUT\D02_NOARGS.OUT
|
||||||
|
|
||||||
|
ECHO === D10 revoke W M from directory === >> F:\RVKCMP\RUN.LOG
|
||||||
|
\NPUBLIC\REVOKE W M FOR F:\RVKTEST\ONE FROM USER MARIO > F:\RVKCMP\OUT\D10_DIR_REVOKE_WM.OUT
|
||||||
|
|
||||||
|
ECHO === D11 revoke ALL from directory / remove trustee === >> F:\RVKCMP\RUN.LOG
|
||||||
|
\NPUBLIC\REVOKE ALL FOR F:\RVKTEST\ONE FROM USER MARIO > F:\RVKCMP\OUT\D11_DIR_REVOKE_ALL.OUT
|
||||||
|
|
||||||
|
ECHO === D20 revoke C E recursively from direct subdirectory trustees === >> F:\RVKCMP\RUN.LOG
|
||||||
|
\NPUBLIC\REVOKE C E FOR F:\RVKTEST\SUBTST FROM USER MARIO /SUBDIRECTORIES > F:\RVKCMP\OUT\D20_SUBDIRS_REVOKE_CE.OUT
|
||||||
|
|
||||||
|
ECHO === D21 revoke R from one explicit file === >> F:\RVKCMP\RUN.LOG
|
||||||
|
\NPUBLIC\REVOKE R FOR F:\RVKTEST\FILES\A.TXT FROM USER MARIO /FILES > F:\RVKCMP\OUT\D21_FILE_REVOKE_R.OUT
|
||||||
|
|
||||||
|
ECHO === D22 revoke W from files in a directory === >> F:\RVKCMP\RUN.LOG
|
||||||
|
\NPUBLIC\REVOKE W FOR F:\RVKTEST\FILES FROM USER MARIO /FILES > F:\RVKCMP\OUT\D22_FILES_DIR_REVOKE_W.OUT
|
||||||
|
|
||||||
|
ECHO === D30 relative path from F:\RVKTEST === >> F:\RVKCMP\RUN.LOG
|
||||||
|
\NPUBLIC\GRANT R W C E M F A FOR F:\RVKTEST\ONE TO USER MARIO > F:\RVKCMP\SETUP\S30_ONE_REGRANT.OUT
|
||||||
|
CD \RVKTEST
|
||||||
|
\NPUBLIC\REVOKE W FOR ONE FROM USER MARIO > F:\RVKCMP\OUT\D30_REL_DIR_REVOKE_W.OUT
|
||||||
|
CD \
|
||||||
|
|
||||||
|
ECHO === D90 no trustee on directory === >> F:\RVKCMP\RUN.LOG
|
||||||
|
\NPUBLIC\REVOKE R FOR F:\RVKTEST\EMPTY FROM USER MARIO > F:\RVKCMP\OUT\D90_NO_TRUSTEE.OUT
|
||||||
|
|
||||||
|
ECHO === D91 missing user === >> F:\RVKCMP\RUN.LOG
|
||||||
|
\NPUBLIC\REVOKE R FOR F:\RVKTEST\ONE FROM USER NO_SUCH_USER > F:\RVKCMP\OUT\D91_MISSING_USER.OUT
|
||||||
|
|
||||||
|
ECHO === D92 missing path === >> F:\RVKCMP\RUN.LOG
|
||||||
|
\NPUBLIC\REVOKE R FOR F:\RVKTEST\MISSING\NOFILE.TXT FROM USER MARIO > F:\RVKCMP\OUT\D92_MISSING_PATH.OUT
|
||||||
|
|
||||||
|
ECHO === D93 both /FILES and /SUBDIRECTORIES === >> F:\RVKCMP\RUN.LOG
|
||||||
|
\NPUBLIC\REVOKE R FOR F:\RVKTEST\OPTBOTH FROM USER MARIO /FILES /SUBDIRECTORIES > F:\RVKCMP\OUT\D93_FILES_AND_SUBDIRS.OUT
|
||||||
|
|
||||||
|
ECHO === D94 bad grammar / missing FROM === >> F:\RVKCMP\RUN.LOG
|
||||||
|
\NPUBLIC\REVOKE R FOR F:\RVKTEST\ONE USER MARIO > F:\RVKCMP\OUT\D94_BAD_GRAMMAR.OUT
|
||||||
|
|
||||||
|
ECHO === SUMMARY === > F:\RVKCMP\SUMMARY.TXT
|
||||||
|
ECHO RVKSTA REVOKE baseline finished. >> F:\RVKCMP\SUMMARY.TXT
|
||||||
|
ECHO. >> F:\RVKCMP\SUMMARY.TXT
|
||||||
|
ECHO Expected: >> F:\RVKCMP\SUMMARY.TXT
|
||||||
|
ECHO - D10/D11 capture normal directory revoke and trustee removal. >> F:\RVKCMP\SUMMARY.TXT
|
||||||
|
ECHO - D20 captures /SUBDIRECTORIES behavior using direct trustees on child directories. >> F:\RVKCMP\SUMMARY.TXT
|
||||||
|
ECHO - D21/D22 capture /FILES behavior for explicit files and directory file sets. >> F:\RVKCMP\SUMMARY.TXT
|
||||||
|
ECHO - D30 captures relative path behavior with absolute \NPUBLIC\REVOKE invocation. >> F:\RVKCMP\SUMMARY.TXT
|
||||||
|
ECHO - D90-D94 capture no-trustee, missing-user, missing-path/Novell no-trustee behavior, option combination, and grammar errors. >> F:\RVKCMP\SUMMARY.TXT
|
||||||
|
ECHO. >> F:\RVKCMP\SUMMARY.TXT
|
||||||
|
ECHO Optional: RVKZIP ausfuehren. >> F:\RVKCMP\SUMMARY.TXT
|
||||||
|
|
||||||
|
ECHO RVKSTA fertig.
|
||||||
|
ECHO Ergebnisse liegen in F:\RVKCMP
|
||||||
|
ECHO Optional: RVKZIP ausfuehren.
|
||||||
26
test/revoke/RVKZIP.BAT
Normal file
26
test/revoke/RVKZIP.BAT
Normal 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 SETUP 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 \RVKTEST\NUL DELTREE /Y \RVKTEST >> ZIP.LOG
|
||||||
|
CD \
|
||||||
|
ECHO.
|
||||||
|
ECHO ZIP step finished.
|
||||||
|
ECHO Check:
|
||||||
|
ECHO F:\RVKCMP\RVKSTA.ZIP
|
||||||
|
ECHO F:\RVKCMP\ZIP.LOG
|
||||||
|
ECHO.
|
||||||
45
test/rights/README.md
Normal file
45
test/rights/README.md
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
# RGHTSTA - RIGHTS comparison test
|
||||||
|
|
||||||
|
`RGHTSTA.BAT` compares Novell `RIGHTS` with the current implementation.
|
||||||
|
|
||||||
|
Result directories:
|
||||||
|
|
||||||
|
```text
|
||||||
|
F:\RGHTCMP\OUT Novell baseline using \NPUBLIC\RIGHTS
|
||||||
|
F:\RGHTCMP\PUBOUT current implementation using \PUBLIC\RIGHTS
|
||||||
|
F:\RGHTCMP\COMPARE.LOG
|
||||||
|
```
|
||||||
|
|
||||||
|
The test keeps the original Novell-baseline behavior and adds the public-tool
|
||||||
|
comparison layer.
|
||||||
|
|
||||||
|
Coverage:
|
||||||
|
|
||||||
|
- default/current directory from `F:\`
|
||||||
|
- explicit directory and subdirectory paths
|
||||||
|
- explicit file and nested file paths
|
||||||
|
- default/current directory from inside the test directory
|
||||||
|
- relative file and relative directory paths
|
||||||
|
- missing directory/file paths
|
||||||
|
- too-many-arguments and `/?` usage/help cases
|
||||||
|
|
||||||
|
operation. Its redirected output must be identical to the normal Novell output.
|
||||||
|
That means:
|
||||||
|
|
||||||
|
```text
|
||||||
|
OUT == PUBOUT
|
||||||
|
```
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bat
|
||||||
|
F:
|
||||||
|
CD \
|
||||||
|
RGHTSTA
|
||||||
|
RGHTZIP
|
||||||
|
```
|
||||||
|
|
||||||
|
The generated test tree is `F:\RGHTEST`. `RGHTZIP.BAT` packages the result and
|
||||||
|
then removes `F:\RGHTEST` again so the SYS root stays clean.
|
||||||
|
|
||||||
|
Note: `RIGHTS` currently has no short-output comparison in this baseline test. That switch exists for NDIR-style output control and should only be added to RIGHTS later if the tool implements it explicitly.
|
||||||
165
test/rights/RGHTC.BAT
Normal file
165
test/rights/RGHTC.BAT
Normal 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
370
test/rights/RGHTSTA.BAT
Normal 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
26
test/rights/RGHTZIP.BAT
Normal 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
76
test/rightsuser/README.md
Normal 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
Reference in New Issue
Block a user