mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
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:
committed by
Jan Höppner
parent
4c2bfb1d47
commit
f1f80a8a20
@@ -54,6 +54,9 @@ typedef enum {
|
||||
EXIT_GROUP_FAILED = 31, /* CCW group device grouping failed */
|
||||
EXIT_UNGROUP_FAILED = 32, /* CCW group device ungrouping failed */
|
||||
|
||||
/* is-owner related */
|
||||
EXIT_UNKNOWN_FILE = 33, /* The file is not generated by chzdev */
|
||||
|
||||
EXIT_INTERNAL_ERROR = 99, /* An internal error occurred */
|
||||
} exit_code_t;
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#define NUM_SITES 11
|
||||
#define NUM_USER_SITES (NUM_SITES - 1)
|
||||
#define SITE_FALLBACK NUM_USER_SITES
|
||||
#define CHZDEV_HEADER "# Generated by chzdev"
|
||||
|
||||
/* Helper to find the availability of site-configuration */
|
||||
#define dev_site_configured(dev, x) (dev->site_specific[(x)].exists && \
|
||||
|
||||
@@ -601,6 +601,18 @@ Combining apparently inconsistent settings
|
||||
.PP
|
||||
.RE
|
||||
.
|
||||
.OD is-owner "" "FILENAME"
|
||||
Detect if the file mentioned is generated by zdev tools.
|
||||
|
||||
Return 0 if the
|
||||
.IR FILENAME
|
||||
is generated by zdev tools and 33 otherwise.
|
||||
|
||||
.B Example:
|
||||
.CL chzdev --is-owner /etc/udev/rules/41-dasd-0.0.1234.rules
|
||||
|
||||
.PP
|
||||
.
|
||||
.OD no-root-update "" ""
|
||||
Skip root device update.
|
||||
|
||||
@@ -916,6 +928,14 @@ CCW group device: Grouping failed
|
||||
CCW group device: Ungrouping failed
|
||||
.PP
|
||||
.TP
|
||||
.B 33
|
||||
The file specified by
|
||||
.nh
|
||||
\-\-is-owner
|
||||
.hy
|
||||
is not generated by zdev
|
||||
.PP
|
||||
.TP
|
||||
.B 99
|
||||
An internal error occurred
|
||||
.PP
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -58,5 +58,6 @@ OPTIONS
|
||||
--no-settle Do not wait for udev to settle
|
||||
--auto-conf Apply changes to auto-configuration only
|
||||
-s, --site ID Apply changes to the specified site only
|
||||
--is-owner FILE Examine whether the file is generated by zdev
|
||||
-V, --verbose Print additional run-time information
|
||||
-q, --quiet Print only minimal run-time information
|
||||
|
||||
Reference in New Issue
Block a user