summaryrefslogtreecommitdiff
path: root/src/cmds/pe_cmd_ar.c
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2025-06-03 10:11:24 +0000
committermidipix <writeonce@midipix.org>2025-06-03 15:16:50 +0000
commit663098e8be251c89181cc56503d7fb7ab2e8c1c5 (patch)
treec167f020c69ed1210829b9002d60195c566e6065 /src/cmds/pe_cmd_ar.c
parentc5c7073a522fc96ec5c0270de6d5e48154d5cd62 (diff)
downloadperk-663098e8be251c89181cc56503d7fb7ab2e8c1c5.tar.bz2
perk-663098e8be251c89181cc56503d7fb7ab2e8c1c5.tar.xz
pe_cmd_ar(): added command-line semantic verification.
Diffstat (limited to 'src/cmds/pe_cmd_ar.c')
-rw-r--r--src/cmds/pe_cmd_ar.c78
1 files changed, 73 insertions, 5 deletions
diff --git a/src/cmds/pe_cmd_ar.c b/src/cmds/pe_cmd_ar.c
index e578ca0..4b4f284 100644
--- a/src/cmds/pe_cmd_ar.c
+++ b/src/cmds/pe_cmd_ar.c
@@ -6,6 +6,76 @@
#include <perk/perk.h>
#include "perk_driver_impl.h"
+#include "perk_errinfo_impl.h"
+#include "perk_ar_impl.h"
+
+static int pe_cmd_ar_verify_cmdline(
+ const struct pe_driver_ctx * dctx,
+ uint64_t flags,
+ const char * posname,
+ const char * arname,
+ const char ** units)
+{
+ uint64_t action;
+ uint64_t poscmd;
+ uint64_t vercmd;
+
+ action = (flags & AR_ACTION_MASK);
+ poscmd = (flags & AR_POSNAME_MASK);
+ vercmd = (flags & PERK_DRIVER_VERSION);
+
+ if (vercmd && !posname && !arname && !units)
+ return 0;
+
+ switch (action) {
+ case 0:
+ return PERK_CUSTOM_ERROR(dctx,
+ PERK_ERR_AR_MISSING_ACTION);
+
+ case PERK_DRIVER_AR_LIST_MEMBERS:
+ case PERK_DRIVER_AR_DELETE_MEMBERS:
+ case PERK_DRIVER_AR_APPEND_MEMBERS:
+ case PERK_DRIVER_AR_EXTRACT_MEMBERS:
+ case PERK_DRIVER_AR_PRINT_ARCHIVE:
+ if (poscmd || posname)
+ return PERK_CUSTOM_ERROR(dctx,
+ PERK_ERR_AR_INVALID_ANCHORS);
+
+ break;
+
+ case AR_UPDATE_MASK:
+ case PERK_DRIVER_AR_REPLACE_MEMBERS:
+ case PERK_DRIVER_AR_MOVE_MEMBERS:
+ switch (poscmd) {
+ case 0:
+ if (posname)
+ return PERK_CUSTOM_ERROR(dctx,
+ PERK_ERR_AR_MISSING_ANCHOR);
+ break;
+
+ case PERK_DRIVER_AR_POSITION_AFTER:
+ case PERK_DRIVER_AR_POSITION_BEFORE:
+ if (!posname)
+ return PERK_CUSTOM_ERROR(dctx,
+ PERK_ERR_AR_NULL_POSNAME);
+ break;
+
+ default:
+ return PERK_CUSTOM_ERROR(dctx,
+ PERK_ERR_AR_MULTIPLE_ANCHORS);
+ }
+
+ default:
+ return PERK_CUSTOM_ERROR(dctx,
+ PERK_ERR_AR_MULTIPLE_ACTIONS);
+ }
+
+ if (!arname)
+ return PERK_CUSTOM_ERROR(dctx,
+ PERK_ERR_AR_NULL_ARNAME);
+
+ return 0;
+}
int pe_cmd_ar(
const struct pe_driver_ctx * dctx,
@@ -14,10 +84,8 @@ int pe_cmd_ar(
const char * arname,
const char ** units)
{
- (void)dctx;
- (void)flags;
- (void)posname;
- (void)arname;
- (void)units;
+ if (pe_cmd_ar_verify_cmdline(dctx,flags,posname,arname,units) < 0)
+ return PERK_NESTED_ERROR(dctx);
+
return 0;
}