svn commit: r352808 - head/tools/tools/controlelf
Ed Maste
emaste at FreeBSD.org
Fri Sep 27 18:49:14 UTC 2019
Author: emaste
Date: Fri Sep 27 18:49:13 2019
New Revision: 352808
URL: https://svnweb.freebsd.org/changeset/base/352808
Log:
controlelf: simplify feature string parsing
Also add error handling on failure to seek/write updated value.
Modified:
head/tools/tools/controlelf/controlelf.c
Modified: head/tools/tools/controlelf/controlelf.c
==============================================================================
--- head/tools/tools/controlelf/controlelf.c Fri Sep 27 18:43:36 2019 (r352807)
+++ head/tools/tools/controlelf/controlelf.c Fri Sep 27 18:49:13 2019 (r352808)
@@ -56,7 +56,7 @@ static void usage(void);
struct ControlFeatures {
const char *alias;
- unsigned long featureVal;
+ unsigned long value;
const char *desc;
};
@@ -189,30 +189,19 @@ usage(void)
static bool
convert_to_feature_val(char *feature_str, u_int32_t *feature_val)
{
- char *feature_input, *feature;
+ char *feature;
int i, len;
u_int32_t input;
- bool add, set;
+ char operation;
- add = set = false;
input = 0;
-
- if (feature_str[0] == '+')
- add = true;
- else if (feature_str[0] == '=')
- set = true;
- else if (feature_str[0] != '-') {
- warnx("'%c' not an operator - use '+', '-', '='",
- feature_str[0]);
- return (false);
- }
-
- feature_input = feature_str + 1;
+ operation = *feature_str;
+ feature_str++;
len = nitems(featurelist);
- while ((feature = strsep(&feature_input, ",")) != NULL) {
+ while ((feature = strsep(&feature_str, ",")) != NULL) {
for (i = 0; i < len; ++i) {
if (strcmp(featurelist[i].alias, feature) == 0) {
- input |= featurelist[i].featureVal;
+ input |= featurelist[i].value;
break;
}
}
@@ -222,12 +211,16 @@ convert_to_feature_val(char *feature_str, u_int32_t *f
}
}
- if (add) {
+ if (operation == '+') {
*feature_val |= input;
- } else if (set) {
+ } else if (operation == '=') {
*feature_val = input;
+ } else if (operation == '-') {
+ *feature_val &= ~input;
} else {
- *feature_val -= (*feature_val) & input;
+ warnx("'%c' not an operator - use '+', '-', '='",
+ feature_str[0]);
+ return (false);
}
return (true);
}
@@ -246,8 +239,12 @@ edit_file_features(Elf *elf, int phcount, int fd, char
if (!convert_to_feature_val(val, &features))
return (false);
- lseek(fd, off, SEEK_SET);
- write(fd, &features, sizeof(u_int32_t));
+ if (lseek(fd, off, SEEK_SET) == -1 ||
+ write(fd, &features, sizeof(features)) <
+ (ssize_t)sizeof(features)) {
+ warnx("error writing feature value");
+ return (false);
+ }
return (true);
}
@@ -277,7 +274,7 @@ print_file_features(Elf *elf, int phcount, int fd, cha
printf("%s\t\t'%s' is ", featurelist[i].alias,
featurelist[i].desc);
- if ((featurelist[i].featureVal & features) == 0)
+ if ((featurelist[i].value & features) == 0)
printf("un");
printf("set.\n");
More information about the svn-src-all
mailing list