aboutsummaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorEd Maste <emaste@FreeBSD.org>2019-09-27 18:49:13 +0000
committerEd Maste <emaste@FreeBSD.org>2019-09-27 18:49:13 +0000
commit6abfc627d681cee69acd7f6d2c7d8ed8894fc885 (patch)
treec1da394acc783c5e694bb63eb56437647d60c0c7 /tools
parentdf08823d07104078a7e7148e27c16810626fa4ba (diff)
Notes
Diffstat (limited to 'tools')
-rw-r--r--tools/tools/controlelf/controlelf.c45
1 files changed, 21 insertions, 24 deletions
diff --git a/tools/tools/controlelf/controlelf.c b/tools/tools/controlelf/controlelf.c
index cec4cb0868de..e505bcb2cd37 100644
--- a/tools/tools/controlelf/controlelf.c
+++ b/tools/tools/controlelf/controlelf.c
@@ -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 *feature_val)
}
}
- 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 *val)
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, char *filename)
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");