Explorar o código

u-a: Refactor alternative_has_broken_slave() out from alternative_is_broken()

Guillem Jover %!s(int64=13) %!d(string=hai) anos
pai
achega
5ff17948b7
Modificáronse 1 ficheiros con 47 adicións e 37 borrados
  1. 47 37
      utils/update-alternatives.c

+ 47 - 37
utils/update-alternatives.c

@@ -1836,6 +1836,51 @@ alternative_remove(struct alternative *a)
 	checked_rm_args("%s/%s", admdir, a->master_name);
 }
 
+static bool
+alternative_has_broken_slave(struct slave_link *sl, struct fileset *fs)
+{
+	if (fileset_can_install_slave(fs, sl->name)) {
+		char *wanted;
+		char *sl_altlnk, *sl_current;
+
+		/* Verify link -> /etc/alternatives/foo */
+		sl_altlnk = areadlink(sl->link);
+		if (!sl_altlnk)
+			return true;
+		xasprintf(&wanted, "%s/%s", altdir, sl->name);
+		if (strcmp(sl_altlnk, wanted) != 0) {
+			free(wanted);
+			free(sl_altlnk);
+			return true;
+		}
+		free(sl_altlnk);
+		/* Verify /etc/alternatives/foo -> file */
+		sl_current = areadlink(wanted);
+		free(wanted);
+		if (!sl_current)
+			return true;
+		if (strcmp(sl_current, fileset_get_slave(fs, sl->name)) != 0) {
+			free(sl_current);
+			return true;
+		}
+		free(sl_current);
+	} else {
+		char *sl_altlnk;
+
+		/* Slave link must not exist. */
+		if (alternative_path_classify(sl->link) != ALT_PATH_MISSING)
+			return true;
+		xasprintf(&sl_altlnk, "%s/%s", altdir, sl->name);
+		if (alternative_path_classify(sl_altlnk) != ALT_PATH_MISSING) {
+			free(sl_altlnk);
+			return true;
+		}
+		free(sl_altlnk);
+	}
+
+	return false;
+}
+
 static bool
 alternative_is_broken(struct alternative *a)
 {
@@ -1869,43 +1914,8 @@ alternative_is_broken(struct alternative *a)
 
 	/* Check slaves */
 	for (sl = a->slaves; sl; sl = sl->next) {
-		if (fileset_can_install_slave(fs, sl->name)) {
-			char *sl_altlnk, *sl_current;
-
-			/* Verify link -> /etc/alternatives/foo */
-			sl_altlnk = areadlink(sl->link);
-			if (!sl_altlnk)
-				return true;
-			xasprintf(&wanted, "%s/%s", altdir, sl->name);
-			if (strcmp(sl_altlnk, wanted) != 0) {
-				free(wanted);
-				free(sl_altlnk);
-				return true;
-			}
-			free(sl_altlnk);
-			/* Verify /etc/alternatives/foo -> file */
-			sl_current = areadlink(wanted);
-			free(wanted);
-			if (!sl_current)
-				return true;
-			if (strcmp(sl_current, fileset_get_slave(fs, sl->name)) != 0) {
-				free(sl_current);
-				return true;
-			}
-			free(sl_current);
-		} else {
-			char *sl_altlnk;
-
-			/* Slave link must not exist. */
-			if (alternative_path_classify(sl->link) != ALT_PATH_MISSING)
-				return true;
-			xasprintf(&sl_altlnk, "%s/%s", altdir, sl->name);
-			if (alternative_path_classify(sl_altlnk) != ALT_PATH_MISSING) {
-				free(sl_altlnk);
-				return true;
-			}
-			free(sl_altlnk);
-		}
+		if (alternative_has_broken_slave(sl, fs))
+			return true;
 	}
 
 	return false;