diff options
author | midipix <writeonce@midipix.org> | 2025-06-03 10:11:24 +0000 |
---|---|---|
committer | midipix <writeonce@midipix.org> | 2025-06-03 15:16:50 +0000 |
commit | 663098e8be251c89181cc56503d7fb7ab2e8c1c5 (patch) | |
tree | c167f020c69ed1210829b9002d60195c566e6065 /src/cmds/pe_cmd_ar.c | |
parent | c5c7073a522fc96ec5c0270de6d5e48154d5cd62 (diff) | |
download | perk-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.c | 78 |
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; } |