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-head mailing list