zdev: implement option to identify files created by zdev

Enhance the 'chzdev' tool by introducing a new option to discern
files created by 'zdev-tools.' The command usage is as follows:

$ chzdev --is-owner <file-name>

When executed, the command will return an exit code of 0 for all
files generated by zdev-tools. In the case of an unknown file, the
tool will return the exit code 'EXIT_UNKNOWN_FILE i.e 33.'

Signed-off-by: Vineeth Vijayan <vneethv@linux.ibm.com>
Reviewed-by: Peter Oberparleiter <oberpar@linux.ibm.com>
Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com>
This commit is contained in:
Vineeth Vijayan
2024-02-01 16:27:41 +01:00
committed by Jan Höppner
parent 4c2bfb1d47
commit f1f80a8a20
5 changed files with 88 additions and 0 deletions

View File

@@ -50,6 +50,7 @@
* diff of simple function parameter modifications to pass this value.
*/
int global_site_id = SITE_FALLBACK;
#define MAX_HEADER_LENGTH sizeof(CHZDEV_HEADER)
/* Main program action. */
typedef enum {
@@ -60,6 +61,7 @@ typedef enum {
ACT_HELP_ATTRIBS,
ACT_EXPORT,
ACT_IMPORT,
ACT_IS_OWNER,
ACT_APPLY,
ACT_HELP,
ACT_VERSION,
@@ -86,6 +88,7 @@ struct options {
unsigned int help_attribs:1;
char *export;
char *import;
char *is_owner;
unsigned int apply:1;
unsigned int help:1;
unsigned int version:1;
@@ -134,6 +137,7 @@ enum {
OPT_LIST_TYPES = 'L',
OPT_EXPORT = (OPT_ANONYMOUS_BASE+__COUNTER__),
OPT_IMPORT = (OPT_ANONYMOUS_BASE+__COUNTER__),
OPT_IS_OWNER = (OPT_ANONYMOUS_BASE+__COUNTER__),
OPT_APPLY = (OPT_ANONYMOUS_BASE+__COUNTER__),
OPT_ACTIVE = 'a',
OPT_PERSISTENT = 'p',
@@ -187,6 +191,13 @@ static struct opts_conflict conflict_list[] = {
OPT_REMOVE_ALL, OPT_CONFIGURED, OPT_EXISTING, OPT_BY_PATH,
OPT_BY_ATTRIB, OPT_BY_NODE, OPT_BY_INTERFACE,
OPT_DECONFIGURE_ALL, 0),
OPTS_CONFLICT(OPT_IS_OWNER,
OPT_DECONFIGURE, OPT_HELP_ATTRIBS, OPT_LIST_TYPES,
OPT_EXPORT, OPT_IMPORT, OPT_APPLY, OPT_REMOVE,
OPT_REMOVE_ALL, OPT_CONFIGURED, OPT_EXISTING, OPT_ONLINE,
OPT_OFFLINE, OPT_BY_PATH, OPT_BY_NODE, OPT_BY_INTERFACE,
OPT_BY_ATTRIB, OPT_ACTIVE, OPT_PERSISTENT, OPT_FAILED,
OPT_DECONFIGURE_ALL, 0),
OPTS_CONFLICT(OPT_APPLY,
OPT_DECONFIGURE, OPT_LIST_ATTRIBS, OPT_HELP_ATTRIBS,
OPT_LIST_TYPES, OPT_EXPORT, OPT_IMPORT, OPT_REMOVE,
@@ -227,6 +238,7 @@ static const struct option opt_list[] = {
{ "list-types", no_argument, NULL, OPT_LIST_TYPES },
{ "export", required_argument, NULL, OPT_EXPORT },
{ "import", required_argument, NULL, OPT_IMPORT },
{ "is-owner", required_argument, NULL, OPT_IS_OWNER },
{ "apply", no_argument, NULL, OPT_APPLY },
{ "help", no_argument, NULL, OPT_HELP },
{ "version", no_argument, NULL, OPT_VERSION },
@@ -278,6 +290,7 @@ static void free_options(struct options *opts)
return;
free(opts->export);
free(opts->import);
free(opts->is_owner);
select_opts_free(opts->select);
strlist_free(opts->positional);
strlist_free(opts->settings);
@@ -318,6 +331,8 @@ static action_t get_action(struct options *opts)
return ACT_EXPORT;
if (opts->import)
return ACT_IMPORT;
if (opts->is_owner)
return ACT_IS_OWNER;
if (opts->apply)
return ACT_APPLY;
return ACT_CONFIGURE;
@@ -339,6 +354,8 @@ static const char *get_action_option(action_t action)
return "--export";
case ACT_IMPORT:
return "--import";
case ACT_IS_OWNER:
return "--is-owner";
case ACT_APPLY:
return "--apply";
case ACT_HELP:
@@ -902,6 +919,16 @@ static exit_code_t parse_options(struct options *opts, int argc, char *argv[])
opts->import = misc_strdup(optarg);
break;
case OPT_IS_OWNER:
/* --is-owner */
if (opts->is_owner) {
error("Cannot specify '--is-owner' multiple "
"times\n");
return EXIT_USAGE_ERROR;
}
opts->is_owner = misc_strdup(optarg);
break;
case OPT_APPLY:
/* --apply */
opts->apply = 1;
@@ -2929,6 +2956,39 @@ static void apply_selection_to_import(struct util_list *objects,
}
}
static exit_code_t zdev_file_detect(FILE *fd)
{
char buffer[MAX_HEADER_LENGTH];
if (fgets(buffer, MAX_HEADER_LENGTH, fd)) {
if (starts_with(buffer, CHZDEV_HEADER))
return EXIT_OK;
} else {
return EXIT_RUNTIME_ERROR;
}
return EXIT_UNKNOWN_FILE;
}
/* Check if the file mentioned is generated by zdev */
static exit_code_t do_is_owner(struct options *opts)
{
FILE *fd;
exit_code_t rc = EXIT_OK;
fd = fopen(opts->is_owner, "r");
if (!fd) {
error("Could not open file %s: %s\n", opts->is_owner,
strerror(errno));
return EXIT_RUNTIME_ERROR;
}
rc = zdev_file_detect(fd);
fclose(fd);
return rc;
}
/* Import configuration data. */
static exit_code_t do_import(struct options *opts)
{
@@ -3137,6 +3197,9 @@ int main(int argc, char *argv[])
case ACT_IMPORT:
rc = do_import(&opts);
break;
case ACT_IS_OWNER:
rc = do_is_owner(&opts);
break;
case ACT_APPLY:
rc = do_apply(&opts);
break;