dosutils: align Novell-compatible tests and stage NCOPY work

Update the DOS utilities and test suite with the current Novell comparison
state.

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

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

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

Build:
- include ncopy.c in the DOS utility build
- drop the temporary MARS_DOSUTILS_VERSION define wiring from CMake
This commit is contained in:
Mario Fetka
2026-05-29 07:40:04 +02:00
parent 5da600c2a5
commit 4a952b4c4c
36 changed files with 5873 additions and 943 deletions

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

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

View File

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

View File

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

View File

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

69
test/creator/cix_collect_xattr.sh Normal file → Executable file
View File

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