summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2022-08-03 13:22:35 +0000
committermidipix <writeonce@midipix.org>2022-09-11 21:05:34 +0000
commit03b27780626d1436dddb5150543ac62d8be0312e (patch)
treefabd022d1c3fac1273e0bcdb03efbaeb51b42b27
parentdcb685978a211909b6bdadbfa62b2acfa40cd0ee (diff)
downloadntux-03b27780626d1436dddb5150543ac62d8be0312e.tar.bz2
ntux-03b27780626d1436dddb5150543ac62d8be0312e.tar.xz
ntux_cmd_chmod(): parse --strmode in a posix-compatible manner.
-rw-r--r--src/cmds/ntux_cmd_chmod.c78
1 files changed, 60 insertions, 18 deletions
diff --git a/src/cmds/ntux_cmd_chmod.c b/src/cmds/ntux_cmd_chmod.c
index 04ebad6..7be2bc8 100644
--- a/src/cmds/ntux_cmd_chmod.c
+++ b/src/cmds/ntux_cmd_chmod.c
@@ -22,10 +22,16 @@
#include "ntux_driver_impl.h"
#include "ntux_nolibc_impl.h"
#include "ntux_errinfo_impl.h"
+#include "nolibc/stdbool.h"
#define __SID_SYSTEM {1,1,{{0,0,0,0,0,5}},{18}}
#define __SID_ADMINISTRATORS {1,2,{{0,0,0,0,0,5}},{32,544}}
+#define NTUX_OPT_MODE_NEUTRAL (0)
+#define NTUX_OPT_MODE_EQUAL (1)
+#define NTUX_OPT_MODE_PLUS (2)
+#define NTUX_OPT_MODE_MINUS (3)
+
static const nt_sid sid_system = __SID_SYSTEM;
static const nt_sid_os sid_admins = __SID_ADMINISTRATORS;
@@ -61,6 +67,9 @@ int ntux_cmd_chmod(const struct ntux_driver_ctx * dctx, const char * dunit)
int32_t status;
int fdout;
int fdcwd;
+ int optmode;
+ const char * strmode;
+ const char * chmode;
const unsigned char * unit;
nt_sd * srcsd;
nt_sd_common_buffer dstsd;
@@ -77,24 +86,57 @@ int ntux_cmd_chmod(const struct ntux_driver_ctx * dctx, const char * dunit)
int fd = -1;
struct __ofd * ofd = 0;
void * hasync = 0;
- uint32_t buf[0x300];
-
- /* ACE propagation: +p, -p */
- if (!dctx->cctx->strmode)
- ace_flags = 0;
-
- else if (!strcmp(dctx->cctx->strmode,"+p"))
- ace_flags = NT_ACE_CONTAINER_INHERIT | NT_ACE_OBJECT_INHERIT;
-
- else if (!strcmp(dctx->cctx->strmode,"-p"))
- ace_flags = 0;
-
- else
- return ntux_cmd_chmod_ret(
- 0,0,0,
- NTUX_CUSTOM_ERROR(
- dctx,
- NTUX_ERR_FLEE_ERROR));
+ uint32_t buf[0x300] = {0};
+
+ /* strmode */
+ strmode = dctx->cctx->strmode ? dctx->cctx->strmode : (char *)buf;
+ optmode = NTUX_OPT_MODE_NEUTRAL;
+ ace_flags = 0;
+
+ for (chmode=strmode; *chmode; chmode++) {
+ switch (*chmode) {
+ case '=':
+ optmode = NTUX_OPT_MODE_EQUAL;
+ ace_flags = 0;
+ break;
+
+ case '+':
+ optmode = NTUX_OPT_MODE_PLUS;
+ break;
+
+ case '-':
+ optmode = NTUX_OPT_MODE_MINUS;
+ break;
+
+ case 'p':
+ switch (optmode) {
+ case NTUX_OPT_MODE_EQUAL:
+ case NTUX_OPT_MODE_PLUS:
+ ace_flags = NT_ACE_CONTAINER_INHERIT | NT_ACE_OBJECT_INHERIT;
+ break;
+
+ case NTUX_OPT_MODE_MINUS:
+ ace_flags = 0;
+ break;
+
+ default:
+ return ntux_cmd_chmod_ret(
+ 0,0,0,
+ NTUX_CUSTOM_ERROR(
+ dctx,
+ NTUX_ERR_FLEE_ERROR));
+ }
+
+ break;
+
+ default:
+ return ntux_cmd_chmod_ret(
+ 0,0,0,
+ NTUX_CUSTOM_ERROR(
+ dctx,
+ NTUX_ERR_FLEE_ERROR));
+ }
+ }
/* initial --owner and --group support: Administrators, SYSTEM */
owner = 0;