/*
* mars-nwe-dosutils - NetWare/DOS utility tools.
*
* Copyright (C) 2026 Mario Fetka
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*/
/*
* Purpose: Shared trustee and rights helper implementation for GRANT, REMOVE and REVOKE style tools.
* Depends on: net.h, trustee.h, ncpapi.h callers, netcall.c requester helpers, tools.c shared utility routines.
*/
#include "net.h"
#include "trustee.h"
#include
#include
#ifndef S_IFDIR
#define S_IFDIR 0040000
#endif
/*
* trustee_is_subdirs_option
*
* Purpose:
* Recognizes the GRANT/REMOVE/REVOKE option variants that request
* recursive processing of subdirectories.
*
* Parameters:
* s - command-line token to test.
*
* Returns:
* Non-zero when the token is a /SUBDIRS, /SUBDIRECTORIES or /S option,
* otherwise zero.
*/
int trustee_is_subdirs_option(char *s)
{
if (!s) return(0);
return(tool_strsame(s, "/SUBDIRS") || tool_strsame(s, "-SUBDIRS") ||
tool_strsame(s, "/SUBDIRECTORIES") || tool_strsame(s, "-SUBDIRECTORIES") ||
tool_strsame(s, "/S") || tool_strsame(s, "-S"));
}
/*
* trustee_is_files_option
*
* Purpose:
* Recognizes the option variants that request file entries in addition to
* directories for trustee operations.
*
* Parameters:
* s - command-line token to test.
*
* Returns:
* Non-zero for /FILES or /F variants, otherwise zero.
*/
int trustee_is_files_option(char *s)
{
if (!s) return(0);
return(tool_strsame(s, "/FILES") || tool_strsame(s, "-FILES") ||
tool_strsame(s, "/F") || tool_strsame(s, "-F"));
}
/*
* trustee_parse_right_word
*
* Purpose:
* Converts one Novell-style trustee right word into the corresponding
* 386 trustee rights mask bits.
*
* Parameters:
* s - right word or one-letter abbreviation, such as READ, R, CREATE,
* C, SUPERVISOR or S.
* rights - in/out accumulated rights mask updated on success.
*
* Returns:
* 0 when the word was recognized, -1 for an unknown right word.
*
* Notes:
* The command parsers call this repeatedly so individual right words can be
* accumulated into one mask. The historical NONE handling is preserved here
* and should only be changed together with the GRANT/REVOKE compatibility
* tests.
*/
int trustee_parse_right_word(char *s, uint16 *rights)
{
if (tool_strsame(s, "ALL")) {
*rights = TRUSTEE_RIGHT_ALL_386;
return(0);
}
if (tool_strsame(s, "N") || tool_strsame(s, "NONE")) {
*rights = TRUSTEE_RIGHT_ALL_386;
return(0);
}
if (tool_strsame(s, "S") || tool_strsame(s, "SUPERVISOR")) {
*rights |= TRUSTEE_RIGHT_SUPER;
return(0);
}
if (tool_strsame(s, "R") || tool_strsame(s, "READ")) {
*rights |= TRUSTEE_RIGHT_READ;
return(0);
}
if (tool_strsame(s, "W") || tool_strsame(s, "WRITE")) {
*rights |= TRUSTEE_RIGHT_WRITE;
return(0);
}
if (tool_strsame(s, "C") || tool_strsame(s, "CREATE")) {
*rights |= TRUSTEE_RIGHT_CREATE;
return(0);
}
if (tool_strsame(s, "E") || tool_strsame(s, "ERASE") ||
tool_strsame(s, "D") || tool_strsame(s, "DELETE")) {
*rights |= TRUSTEE_RIGHT_DELETE;
return(0);
}
if (tool_strsame(s, "M") || tool_strsame(s, "MODIFY")) {
*rights |= TRUSTEE_RIGHT_MODIFY;
return(0);
}
if (tool_strsame(s, "F") || tool_strsame(s, "FILESCAN") ||
tool_strsame(s, "FILE") || tool_strsame(s, "SCAN")) {
*rights |= TRUSTEE_RIGHT_SEARCH;
return(0);
}
if (tool_strsame(s, "A") || tool_strsame(s, "ACCESS") ||
tool_strsame(s, "CONTROL") || tool_strsame(s, "ACCESSCONTROL")) {
*rights |= TRUSTEE_RIGHT_OWNER;
return(0);
}
return(-1);
}
/*
* trustee_rights_bracket
*
* Purpose:
* Formats a 386 trustee rights mask as the Novell-style eight-character
* bracket body used by GRANT, REMOVE and REVOKE output.
*
* Parameters:
* rights - trustee rights mask.
* out - caller-supplied buffer receiving an 8-character string plus NUL.
*
* Notes:
* Missing rights are rendered as spaces, not dashes. Keep this formatting
* stable because the command output is compared against Novell tools.
*/
void trustee_rights_bracket(uint16 rights, char *out)
{
out[0] = (rights & TRUSTEE_RIGHT_SUPER) ? 'S' : ' ';
out[1] = (rights & TRUSTEE_RIGHT_READ) ? 'R' : ' ';
out[2] = (rights & TRUSTEE_RIGHT_WRITE) ? 'W' : ' ';
out[3] = (rights & TRUSTEE_RIGHT_CREATE) ? 'C' : ' ';
out[4] = (rights & TRUSTEE_RIGHT_DELETE) ? 'E' : ' ';
out[5] = (rights & TRUSTEE_RIGHT_MODIFY) ? 'M' : ' ';
out[6] = (rights & TRUSTEE_RIGHT_SEARCH) ? 'F' : ' ';
out[7] = (rights & TRUSTEE_RIGHT_OWNER) ? 'A' : ' ';
out[8] = '\0';
}
/*
* trustee_lookup_object
*
* Purpose:
* Resolves a trustee name to a bindery object ID for GRANT/REMOVE/REVOKE
* style operations.
*
* Parameters:
* name - bindery object name supplied on the command line.
* objtype - in/out bindery object type. When objtype_given is false,
* receives the matching USER or GROUP type.
* objtype_given - non-zero when the caller already selected a concrete
* bindery object type.
*
* Returns:
* Non-zero bindery object ID on success, or zero when no matching object was
* found.
*
* NCP:
* Uses ncp17_35_get_bindery_object_id(). If no explicit type is supplied,
* USER is tried first and GROUP second, matching the common Novell command
* behavior.
*/
uint32 trustee_lookup_object(char *name, uint16 *objtype, int objtype_given)
{
uint8 namebuf[48];
uint32 object_id;
strmaxcpy(namebuf, name, sizeof(namebuf) - 1);
upstr(namebuf);
if (objtype_given) {
return(ncp17_35_get_bindery_object_id(namebuf, *objtype));
}
*objtype = TRUSTEE_BINDERY_USER;
object_id = ncp17_35_get_bindery_object_id(namebuf, TRUSTEE_BINDERY_USER);
if (object_id)
return(object_id);
*objtype = TRUSTEE_BINDERY_GROUP;
object_id = ncp17_35_get_bindery_object_id(namebuf, TRUSTEE_BINDERY_GROUP);
return(object_id);
}
/*
* trustee_path_is_dir
*
* Purpose:
* Tests whether a path should be treated as a directory by the trustee
* commands.
*
* Parameters:
* path - DOS/NetWare path to test.
*
* Returns:
* Non-zero when the path is empty/current-directory syntax or stat() reports
* a directory, otherwise zero.
*
* Notes:
* This remains in trustee.c because the empty/current-directory handling is
* part of the GRANT/REMOVE/REVOKE trustee command semantics rather than a
* completely generic path predicate.
*/
int trustee_path_is_dir(char *path)
{
struct stat st;
if (!path || !*path || tool_strsame(path, ".") || tool_strsame(path, ".\\") ||
tool_strsame(path, "./"))
return(1);
if (stat(path, &st) == 0) {
if (st.st_mode & S_IFDIR)
return(1);
}
return(0);
}