Merge pull request #3220 from keszybz/install-fixes
Fix "preset-all" with dangling symlinks and install-section hint emitted too eagerly
This commit is contained in:
commit
4b273d46bb
|
@ -752,9 +752,9 @@ static int list_dependencies_print(const char *name, unsigned int level, unsigne
|
|||
char ts[FORMAT_TIMESPAN_MAX], ts2[FORMAT_TIMESPAN_MAX];
|
||||
|
||||
for (i = level; i != 0; i--)
|
||||
printf("%s", draw_special_char(branches & (1 << (i-1)) ? DRAW_TREE_VERTICAL : DRAW_TREE_SPACE));
|
||||
printf("%s", special_glyph(branches & (1 << (i-1)) ? TREE_VERTICAL : TREE_SPACE));
|
||||
|
||||
printf("%s", draw_special_char(last ? DRAW_TREE_RIGHT : DRAW_TREE_BRANCH));
|
||||
printf("%s", special_glyph(last ? TREE_RIGHT : TREE_BRANCH));
|
||||
|
||||
if (times) {
|
||||
if (times->time)
|
||||
|
|
|
@ -271,34 +271,35 @@ out:
|
|||
}
|
||||
|
||||
|
||||
const char *draw_special_char(DrawSpecialChar ch) {
|
||||
const char *special_glyph(SpecialGlyph code) {
|
||||
|
||||
static const char *draw_table[2][_DRAW_SPECIAL_CHAR_MAX] = {
|
||||
|
||||
/* UTF-8 */ {
|
||||
[DRAW_TREE_VERTICAL] = "\342\224\202 ", /* │ */
|
||||
[DRAW_TREE_BRANCH] = "\342\224\234\342\224\200", /* ├─ */
|
||||
[DRAW_TREE_RIGHT] = "\342\224\224\342\224\200", /* └─ */
|
||||
[DRAW_TREE_SPACE] = " ", /* */
|
||||
[DRAW_TRIANGULAR_BULLET] = "\342\200\243", /* ‣ */
|
||||
[DRAW_BLACK_CIRCLE] = "\342\227\217", /* ● */
|
||||
[DRAW_ARROW] = "\342\206\222", /* → */
|
||||
[DRAW_DASH] = "\342\200\223", /* – */
|
||||
static const char* const draw_table[2][_SPECIAL_GLYPH_MAX] = {
|
||||
/* ASCII fallback */
|
||||
[false] = {
|
||||
[TREE_VERTICAL] = "| ",
|
||||
[TREE_BRANCH] = "|-",
|
||||
[TREE_RIGHT] = "`-",
|
||||
[TREE_SPACE] = " ",
|
||||
[TRIANGULAR_BULLET] = ">",
|
||||
[BLACK_CIRCLE] = "*",
|
||||
[ARROW] = "->",
|
||||
[MDASH] = "-",
|
||||
},
|
||||
|
||||
/* ASCII fallback */ {
|
||||
[DRAW_TREE_VERTICAL] = "| ",
|
||||
[DRAW_TREE_BRANCH] = "|-",
|
||||
[DRAW_TREE_RIGHT] = "`-",
|
||||
[DRAW_TREE_SPACE] = " ",
|
||||
[DRAW_TRIANGULAR_BULLET] = ">",
|
||||
[DRAW_BLACK_CIRCLE] = "*",
|
||||
[DRAW_ARROW] = "->",
|
||||
[DRAW_DASH] = "-",
|
||||
}
|
||||
/* UTF-8 */
|
||||
[ true ] = {
|
||||
[TREE_VERTICAL] = "\342\224\202 ", /* │ */
|
||||
[TREE_BRANCH] = "\342\224\234\342\224\200", /* ├─ */
|
||||
[TREE_RIGHT] = "\342\224\224\342\224\200", /* └─ */
|
||||
[TREE_SPACE] = " ", /* */
|
||||
[TRIANGULAR_BULLET] = "\342\200\243", /* ‣ */
|
||||
[BLACK_CIRCLE] = "\342\227\217", /* ● */
|
||||
[ARROW] = "\342\206\222", /* → */
|
||||
[MDASH] = "\342\200\223", /* – */
|
||||
},
|
||||
};
|
||||
|
||||
return draw_table[!is_locale_utf8()][ch];
|
||||
return draw_table[is_locale_utf8()][code];
|
||||
}
|
||||
|
||||
static const char * const locale_variable_table[_VARIABLE_LC_MAX] = {
|
||||
|
|
|
@ -55,19 +55,19 @@ void init_gettext(void);
|
|||
|
||||
bool is_locale_utf8(void);
|
||||
|
||||
typedef enum DrawSpecialChar {
|
||||
DRAW_TREE_VERTICAL,
|
||||
DRAW_TREE_BRANCH,
|
||||
DRAW_TREE_RIGHT,
|
||||
DRAW_TREE_SPACE,
|
||||
DRAW_TRIANGULAR_BULLET,
|
||||
DRAW_BLACK_CIRCLE,
|
||||
DRAW_ARROW,
|
||||
DRAW_DASH,
|
||||
_DRAW_SPECIAL_CHAR_MAX
|
||||
} DrawSpecialChar;
|
||||
typedef enum {
|
||||
TREE_VERTICAL,
|
||||
TREE_BRANCH,
|
||||
TREE_RIGHT,
|
||||
TREE_SPACE,
|
||||
TRIANGULAR_BULLET,
|
||||
BLACK_CIRCLE,
|
||||
ARROW,
|
||||
MDASH,
|
||||
_SPECIAL_GLYPH_MAX
|
||||
} SpecialGlyph;
|
||||
|
||||
const char *draw_special_char(DrawSpecialChar ch);
|
||||
const char *special_glyph(SpecialGlyph code) _const_;
|
||||
|
||||
const char* locale_variable_to_string(LocaleVariable i) _const_;
|
||||
LocaleVariable locale_variable_from_string(const char *s) _pure_;
|
||||
|
|
|
@ -266,9 +266,9 @@ static int enumerate_binaries(const char *esp_path, const char *path, const char
|
|||
if (r < 0)
|
||||
return r;
|
||||
if (r > 0)
|
||||
printf(" File: %s/%s/%s (%s)\n", draw_special_char(DRAW_TREE_RIGHT), path, de->d_name, v);
|
||||
printf(" File: %s/%s/%s (%s)\n", special_glyph(TREE_RIGHT), path, de->d_name, v);
|
||||
else
|
||||
printf(" File: %s/%s/%s\n", draw_special_char(DRAW_TREE_RIGHT), path, de->d_name);
|
||||
printf(" File: %s/%s/%s\n", special_glyph(TREE_RIGHT), path, de->d_name);
|
||||
c++;
|
||||
}
|
||||
|
||||
|
@ -320,7 +320,7 @@ static int print_efi_option(uint16_t id, bool in_order) {
|
|||
printf(" ID: 0x%04X\n", id);
|
||||
printf(" Status: %sactive%s\n", active ? "" : "in", in_order ? ", boot-order" : "");
|
||||
printf(" Partition: /dev/disk/by-partuuid/%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\n", SD_ID128_FORMAT_VAL(partition));
|
||||
printf(" File: %s%s\n", draw_special_char(DRAW_TREE_RIGHT), path);
|
||||
printf(" File: %s%s\n", special_glyph(TREE_RIGHT), path);
|
||||
printf("\n");
|
||||
|
||||
return 0;
|
||||
|
@ -1077,7 +1077,7 @@ static int bootctl_main(int argc, char*argv[]) {
|
|||
SD_ID128_FORMAT_VAL(loader_part_uuid));
|
||||
else
|
||||
printf(" Partition: n/a\n");
|
||||
printf(" File: %s%s\n", draw_special_char(DRAW_TREE_RIGHT), strna(loader_path));
|
||||
printf(" File: %s%s\n", special_glyph(TREE_RIGHT), strna(loader_path));
|
||||
printf("\n");
|
||||
} else
|
||||
printf("System:\n Not booted with EFI\n");
|
||||
|
|
|
@ -121,6 +121,20 @@ static bool mount_is_automount(const MountParameters *p) {
|
|||
"x-systemd.automount\0");
|
||||
}
|
||||
|
||||
static bool mount_state_active(MountState state) {
|
||||
return IN_SET(state,
|
||||
MOUNT_MOUNTING,
|
||||
MOUNT_MOUNTING_DONE,
|
||||
MOUNT_REMOUNTING,
|
||||
MOUNT_UNMOUNTING,
|
||||
MOUNT_MOUNTING_SIGTERM,
|
||||
MOUNT_MOUNTING_SIGKILL,
|
||||
MOUNT_UNMOUNTING_SIGTERM,
|
||||
MOUNT_UNMOUNTING_SIGKILL,
|
||||
MOUNT_REMOUNTING_SIGTERM,
|
||||
MOUNT_REMOUNTING_SIGKILL);
|
||||
}
|
||||
|
||||
static bool needs_quota(const MountParameters *p) {
|
||||
assert(p);
|
||||
|
||||
|
@ -591,16 +605,7 @@ static void mount_set_state(Mount *m, MountState state) {
|
|||
old_state = m->state;
|
||||
m->state = state;
|
||||
|
||||
if (state != MOUNT_MOUNTING &&
|
||||
state != MOUNT_MOUNTING_DONE &&
|
||||
state != MOUNT_REMOUNTING &&
|
||||
state != MOUNT_UNMOUNTING &&
|
||||
state != MOUNT_MOUNTING_SIGTERM &&
|
||||
state != MOUNT_MOUNTING_SIGKILL &&
|
||||
state != MOUNT_UNMOUNTING_SIGTERM &&
|
||||
state != MOUNT_UNMOUNTING_SIGKILL &&
|
||||
state != MOUNT_REMOUNTING_SIGTERM &&
|
||||
state != MOUNT_REMOUNTING_SIGKILL) {
|
||||
if (!mount_state_active(state)) {
|
||||
m->timer_event_source = sd_event_source_unref(m->timer_event_source);
|
||||
mount_unwatch_control_pid(m);
|
||||
m->control_command = NULL;
|
||||
|
@ -632,17 +637,7 @@ static int mount_coldplug(Unit *u) {
|
|||
|
||||
if (m->control_pid > 0 &&
|
||||
pid_is_unwaited(m->control_pid) &&
|
||||
IN_SET(new_state,
|
||||
MOUNT_MOUNTING,
|
||||
MOUNT_MOUNTING_DONE,
|
||||
MOUNT_REMOUNTING,
|
||||
MOUNT_UNMOUNTING,
|
||||
MOUNT_MOUNTING_SIGTERM,
|
||||
MOUNT_MOUNTING_SIGKILL,
|
||||
MOUNT_UNMOUNTING_SIGTERM,
|
||||
MOUNT_UNMOUNTING_SIGKILL,
|
||||
MOUNT_REMOUNTING_SIGTERM,
|
||||
MOUNT_REMOUNTING_SIGKILL)) {
|
||||
mount_state_active(new_state)) {
|
||||
|
||||
r = unit_watch_pid(UNIT(m), m->control_pid);
|
||||
if (r < 0)
|
||||
|
|
|
@ -105,7 +105,7 @@ static int notify_override_masked(const char *top, const char *bottom) {
|
|||
|
||||
printf("%s%s%s %s %s %s\n",
|
||||
ansi_highlight_red(), "[MASKED]", ansi_normal(),
|
||||
top, draw_special_char(DRAW_ARROW), bottom);
|
||||
top, special_glyph(ARROW), bottom);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -115,7 +115,7 @@ static int notify_override_equivalent(const char *top, const char *bottom) {
|
|||
|
||||
printf("%s%s%s %s %s %s\n",
|
||||
ansi_highlight_green(), "[EQUIVALENT]", ansi_normal(),
|
||||
top, draw_special_char(DRAW_ARROW), bottom);
|
||||
top, special_glyph(ARROW), bottom);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -125,7 +125,7 @@ static int notify_override_redirected(const char *top, const char *bottom) {
|
|||
|
||||
printf("%s%s%s %s %s %s\n",
|
||||
ansi_highlight(), "[REDIRECTED]", ansi_normal(),
|
||||
top, draw_special_char(DRAW_ARROW), bottom);
|
||||
top, special_glyph(ARROW), bottom);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -135,7 +135,7 @@ static int notify_override_overridden(const char *top, const char *bottom) {
|
|||
|
||||
printf("%s%s%s %s %s %s\n",
|
||||
ansi_highlight(), "[OVERRIDDEN]", ansi_normal(),
|
||||
top, draw_special_char(DRAW_ARROW), bottom);
|
||||
top, special_glyph(ARROW), bottom);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -145,7 +145,7 @@ static int notify_override_extended(const char *top, const char *bottom) {
|
|||
|
||||
printf("%s%s%s %s %s %s\n",
|
||||
ansi_highlight(), "[EXTENDED]", ansi_normal(),
|
||||
top, draw_special_char(DRAW_ARROW), bottom);
|
||||
top, special_glyph(ARROW), bottom);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -247,7 +247,7 @@ static int enumerate_dir_d(Hashmap *top, Hashmap *bottom, Hashmap *drops, const
|
|||
return -ENOMEM;
|
||||
d = p + strlen(toppath) + 1;
|
||||
|
||||
log_debug("Adding at top: %s %s %s", d, draw_special_char(DRAW_ARROW), p);
|
||||
log_debug("Adding at top: %s %s %s", d, special_glyph(ARROW), p);
|
||||
k = hashmap_put(top, d, p);
|
||||
if (k >= 0) {
|
||||
p = strdup(p);
|
||||
|
@ -259,7 +259,7 @@ static int enumerate_dir_d(Hashmap *top, Hashmap *bottom, Hashmap *drops, const
|
|||
return k;
|
||||
}
|
||||
|
||||
log_debug("Adding at bottom: %s %s %s", d, draw_special_char(DRAW_ARROW), p);
|
||||
log_debug("Adding at bottom: %s %s %s", d, special_glyph(ARROW), p);
|
||||
free(hashmap_remove(bottom, d));
|
||||
k = hashmap_put(bottom, d, p);
|
||||
if (k < 0) {
|
||||
|
@ -283,7 +283,7 @@ static int enumerate_dir_d(Hashmap *top, Hashmap *bottom, Hashmap *drops, const
|
|||
return -ENOMEM;
|
||||
|
||||
log_debug("Adding to drops: %s %s %s %s %s",
|
||||
unit, draw_special_char(DRAW_ARROW), basename(p), draw_special_char(DRAW_ARROW), p);
|
||||
unit, special_glyph(ARROW), basename(p), special_glyph(ARROW), p);
|
||||
k = hashmap_put(h, basename(p), p);
|
||||
if (k < 0) {
|
||||
free(p);
|
||||
|
@ -334,7 +334,7 @@ static int enumerate_dir(Hashmap *top, Hashmap *bottom, Hashmap *drops, const ch
|
|||
if (!p)
|
||||
return -ENOMEM;
|
||||
|
||||
log_debug("Adding at top: %s %s %s", basename(p), draw_special_char(DRAW_ARROW), p);
|
||||
log_debug("Adding at top: %s %s %s", basename(p), special_glyph(ARROW), p);
|
||||
k = hashmap_put(top, basename(p), p);
|
||||
if (k >= 0) {
|
||||
p = strdup(p);
|
||||
|
@ -345,7 +345,7 @@ static int enumerate_dir(Hashmap *top, Hashmap *bottom, Hashmap *drops, const ch
|
|||
return k;
|
||||
}
|
||||
|
||||
log_debug("Adding at bottom: %s %s %s", basename(p), draw_special_char(DRAW_ARROW), p);
|
||||
log_debug("Adding at bottom: %s %s %s", basename(p), special_glyph(ARROW), p);
|
||||
free(hashmap_remove(bottom, basename(p)));
|
||||
k = hashmap_put(bottom, basename(p), p);
|
||||
if (k < 0) {
|
||||
|
|
|
@ -160,7 +160,7 @@ static int prompt_loop(const char *text, char **l, bool (*is_valid)(const char *
|
|||
_cleanup_free_ char *p = NULL;
|
||||
unsigned u;
|
||||
|
||||
r = ask_string(&p, "%s %s (empty to skip): ", draw_special_char(DRAW_TRIANGULAR_BULLET), text);
|
||||
r = ask_string(&p, "%s %s (empty to skip): ", special_glyph(TRIANGULAR_BULLET), text);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to query user: %m");
|
||||
|
||||
|
@ -371,7 +371,7 @@ static int prompt_hostname(void) {
|
|||
for (;;) {
|
||||
_cleanup_free_ char *h = NULL;
|
||||
|
||||
r = ask_string(&h, "%s Please enter hostname for new system (empty to skip): ", draw_special_char(DRAW_TRIANGULAR_BULLET));
|
||||
r = ask_string(&h, "%s Please enter hostname for new system (empty to skip): ", special_glyph(TRIANGULAR_BULLET));
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to query hostname: %m");
|
||||
|
||||
|
@ -456,8 +456,8 @@ static int prompt_root_password(void) {
|
|||
print_welcome();
|
||||
putchar('\n');
|
||||
|
||||
msg1 = strjoina(draw_special_char(DRAW_TRIANGULAR_BULLET), " Please enter a new root password (empty to skip): ");
|
||||
msg2 = strjoina(draw_special_char(DRAW_TRIANGULAR_BULLET), " Please enter new root password again: ");
|
||||
msg1 = strjoina(special_glyph(TRIANGULAR_BULLET), " Please enter a new root password (empty to skip): ");
|
||||
msg2 = strjoina(special_glyph(TRIANGULAR_BULLET), " Please enter new root password again: ");
|
||||
|
||||
for (;;) {
|
||||
_cleanup_string_free_erase_ char *a = NULL, *b = NULL;
|
||||
|
|
|
@ -74,7 +74,7 @@ int bus_message_dump(sd_bus_message *m, FILE *f, unsigned flags) {
|
|||
"%s%s%s Type=%s%s%s Endian=%c Flags=%u Version=%u Priority=%"PRIi64,
|
||||
m->header->type == SD_BUS_MESSAGE_METHOD_ERROR ? ansi_highlight_red() :
|
||||
m->header->type == SD_BUS_MESSAGE_METHOD_RETURN ? ansi_highlight_green() :
|
||||
m->header->type != SD_BUS_MESSAGE_SIGNAL ? ansi_highlight() : "", draw_special_char(DRAW_TRIANGULAR_BULLET), ansi_normal(),
|
||||
m->header->type != SD_BUS_MESSAGE_SIGNAL ? ansi_highlight() : "", special_glyph(TRIANGULAR_BULLET), ansi_normal(),
|
||||
ansi_highlight(), bus_message_type_to_string(m->header->type), ansi_normal(),
|
||||
m->header->endian,
|
||||
m->header->flags,
|
||||
|
|
|
@ -249,8 +249,8 @@ static void print_subtree(const char *prefix, const char *path, char **l) {
|
|||
l++;
|
||||
}
|
||||
|
||||
vertical = strjoina(prefix, draw_special_char(DRAW_TREE_VERTICAL));
|
||||
space = strjoina(prefix, draw_special_char(DRAW_TREE_SPACE));
|
||||
vertical = strjoina(prefix, special_glyph(TREE_VERTICAL));
|
||||
space = strjoina(prefix, special_glyph(TREE_SPACE));
|
||||
|
||||
for (;;) {
|
||||
bool has_more = false;
|
||||
|
@ -271,7 +271,7 @@ static void print_subtree(const char *prefix, const char *path, char **l) {
|
|||
n++;
|
||||
}
|
||||
|
||||
printf("%s%s%s\n", prefix, draw_special_char(has_more ? DRAW_TREE_BRANCH : DRAW_TREE_RIGHT), *l);
|
||||
printf("%s%s%s\n", prefix, special_glyph(has_more ? TREE_BRANCH : TREE_RIGHT), *l);
|
||||
|
||||
print_subtree(has_more ? vertical : space, *l, l);
|
||||
l = n;
|
||||
|
|
|
@ -110,7 +110,7 @@ static int show_sysfs_one(
|
|||
if (!k)
|
||||
return -ENOMEM;
|
||||
|
||||
printf("%s%s%s\n", prefix, draw_special_char(lookahead ? DRAW_TREE_BRANCH : DRAW_TREE_RIGHT), k);
|
||||
printf("%s%s%s\n", prefix, special_glyph(lookahead ? TREE_BRANCH : TREE_RIGHT), k);
|
||||
|
||||
if (asprintf(&l,
|
||||
"%s%s:%s%s%s%s",
|
||||
|
@ -124,13 +124,13 @@ static int show_sysfs_one(
|
|||
if (!k)
|
||||
return -ENOMEM;
|
||||
|
||||
printf("%s%s%s\n", prefix, lookahead ? draw_special_char(DRAW_TREE_VERTICAL) : " ", k);
|
||||
printf("%s%s%s\n", prefix, lookahead ? special_glyph(TREE_VERTICAL) : " ", k);
|
||||
|
||||
*item = next;
|
||||
if (*item) {
|
||||
_cleanup_free_ char *p = NULL;
|
||||
|
||||
p = strappend(prefix, lookahead ? draw_special_char(DRAW_TREE_VERTICAL) : " ");
|
||||
p = strappend(prefix, lookahead ? special_glyph(TREE_VERTICAL) : " ");
|
||||
if (!p)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -183,7 +183,7 @@ int show_sysfs(const char *seat, const char *prefix, unsigned n_columns) {
|
|||
if (first)
|
||||
show_sysfs_one(udev, seat, &first, "/", prefix, n_columns);
|
||||
else
|
||||
printf("%s%s%s\n", prefix, draw_special_char(DRAW_TREE_RIGHT), "(none)");
|
||||
printf("%s%s%s\n", prefix, special_glyph(TREE_RIGHT), "(none)");
|
||||
|
||||
return r;
|
||||
}
|
||||
|
|
|
@ -750,7 +750,7 @@ static int link_status_one(
|
|||
(void) sd_network_link_get_carrier_bound_to(info->ifindex, &carrier_bound_to);
|
||||
(void) sd_network_link_get_carrier_bound_by(info->ifindex, &carrier_bound_by);
|
||||
|
||||
printf("%s%s%s %i: %s\n", on_color_operational, draw_special_char(DRAW_BLACK_CIRCLE), off_color_operational, info->ifindex, info->name);
|
||||
printf("%s%s%s %i: %s\n", on_color_operational, special_glyph(BLACK_CIRCLE), off_color_operational, info->ifindex, info->name);
|
||||
|
||||
printf(" Link File: %s\n"
|
||||
" Network File: %s\n"
|
||||
|
@ -818,7 +818,7 @@ static int system_status(sd_netlink *rtnl, sd_hwdb *hwdb) {
|
|||
operational_state_to_color(operational_state, &on_color_operational, &off_color_operational);
|
||||
|
||||
printf("%s%s%s State: %s%s%s\n",
|
||||
on_color_operational, draw_special_char(DRAW_BLACK_CIRCLE), off_color_operational,
|
||||
on_color_operational, special_glyph(BLACK_CIRCLE), off_color_operational,
|
||||
on_color_operational, strna(operational_state), off_color_operational);
|
||||
|
||||
(void) dump_addresses(rtnl, " Address: ", 0);
|
||||
|
|
|
@ -1072,7 +1072,7 @@ static int dump_processes(
|
|||
}
|
||||
|
||||
more = i+1 < n || cg->children;
|
||||
special = draw_special_char(more ? DRAW_TREE_BRANCH : DRAW_TREE_RIGHT);
|
||||
special = special_glyph(more ? TREE_BRANCH : TREE_RIGHT);
|
||||
|
||||
fprintf(stdout, "%s%s%*"PID_PRI" %s\n",
|
||||
prefix,
|
||||
|
@ -1108,14 +1108,14 @@ static int dump_processes(
|
|||
name++;
|
||||
|
||||
more = i+1 < n;
|
||||
special = draw_special_char(more ? DRAW_TREE_BRANCH : DRAW_TREE_RIGHT);
|
||||
special = special_glyph(more ? TREE_BRANCH : TREE_RIGHT);
|
||||
|
||||
fputs(prefix, stdout);
|
||||
fputs(special, stdout);
|
||||
fputs(name, stdout);
|
||||
fputc('\n', stdout);
|
||||
|
||||
special = draw_special_char(more ? DRAW_TREE_VERTICAL : DRAW_TREE_SPACE);
|
||||
special = special_glyph(more ? TREE_VERTICAL : TREE_SPACE);
|
||||
|
||||
pp = strappend(prefix, special);
|
||||
if (!pp)
|
||||
|
@ -1199,7 +1199,7 @@ static int dump_extra_processes(
|
|||
|
||||
fprintf(stdout, "%s%s %*" PID_PRI " %s\n",
|
||||
prefix,
|
||||
draw_special_char(DRAW_TRIANGULAR_BULLET),
|
||||
special_glyph(TRIANGULAR_BULLET),
|
||||
width, pids[k],
|
||||
name);
|
||||
}
|
||||
|
|
|
@ -76,9 +76,9 @@ static void show_pid_array(
|
|||
get_process_cmdline(pids[i], n_columns, true, &t);
|
||||
|
||||
if (extra)
|
||||
printf("%s%s ", prefix, draw_special_char(DRAW_TRIANGULAR_BULLET));
|
||||
printf("%s%s ", prefix, special_glyph(TRIANGULAR_BULLET));
|
||||
else
|
||||
printf("%s%s", prefix, draw_special_char(((more || i < n_pids-1) ? DRAW_TREE_BRANCH : DRAW_TREE_RIGHT)));
|
||||
printf("%s%s", prefix, special_glyph(((more || i < n_pids-1) ? TREE_BRANCH : TREE_RIGHT)));
|
||||
|
||||
printf("%*"PID_PRI" %s\n", pid_width, pids[i], strna(t));
|
||||
}
|
||||
|
@ -172,10 +172,10 @@ int show_cgroup_by_path(
|
|||
}
|
||||
|
||||
if (last) {
|
||||
printf("%s%s%s\n", prefix, draw_special_char(DRAW_TREE_BRANCH), cg_unescape(basename(last)));
|
||||
printf("%s%s%s\n", prefix, special_glyph(TREE_BRANCH), cg_unescape(basename(last)));
|
||||
|
||||
if (!p1) {
|
||||
p1 = strappend(prefix, draw_special_char(DRAW_TREE_VERTICAL));
|
||||
p1 = strappend(prefix, special_glyph(TREE_VERTICAL));
|
||||
if (!p1)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
@ -195,7 +195,7 @@ int show_cgroup_by_path(
|
|||
show_cgroup_one_by_path(path, prefix, n_columns, !!last, flags);
|
||||
|
||||
if (last) {
|
||||
printf("%s%s%s\n", prefix, draw_special_char(DRAW_TREE_RIGHT), cg_unescape(basename(last)));
|
||||
printf("%s%s%s\n", prefix, special_glyph(TREE_RIGHT), cg_unescape(basename(last)));
|
||||
|
||||
if (!p2) {
|
||||
p2 = strappend(prefix, " ");
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
#include "hashmap.h"
|
||||
#include "install-printf.h"
|
||||
#include "install.h"
|
||||
#include "locale-util.h"
|
||||
#include "log.h"
|
||||
#include "macro.h"
|
||||
#include "mkdir.h"
|
||||
|
@ -116,6 +117,14 @@ bool unit_type_may_template(UnitType type) {
|
|||
UNIT_PATH);
|
||||
}
|
||||
|
||||
static const char *unit_file_type_table[_UNIT_FILE_TYPE_MAX] = {
|
||||
[UNIT_FILE_TYPE_REGULAR] = "regular",
|
||||
[UNIT_FILE_TYPE_SYMLINK] = "symlink",
|
||||
[UNIT_FILE_TYPE_MASKED] = "masked",
|
||||
};
|
||||
|
||||
DEFINE_PRIVATE_STRING_TABLE_LOOKUP_TO_STRING(unit_file_type, UnitFileType);
|
||||
|
||||
static int in_search_path(const LookupPaths *p, const char *path) {
|
||||
_cleanup_free_ char *parent = NULL;
|
||||
char **i;
|
||||
|
@ -328,7 +337,10 @@ void unit_file_dump_changes(int r, const char *verb, const UnitFileChange *chang
|
|||
switch(changes[i].type) {
|
||||
case UNIT_FILE_SYMLINK:
|
||||
if (!quiet)
|
||||
log_info("Created symlink %s, pointing to %s.", changes[i].path, changes[i].source);
|
||||
log_info("Created symlink %s %s %s.",
|
||||
changes[i].path,
|
||||
special_glyph(ARROW),
|
||||
changes[i].source);
|
||||
break;
|
||||
case UNIT_FILE_UNLINK:
|
||||
if (!quiet)
|
||||
|
@ -338,6 +350,11 @@ void unit_file_dump_changes(int r, const char *verb, const UnitFileChange *chang
|
|||
if (!quiet)
|
||||
log_info("Unit %s is masked, ignoring.", changes[i].path);
|
||||
break;
|
||||
case UNIT_FILE_IS_DANGLING:
|
||||
if (!quiet)
|
||||
log_info("Unit %s is an alias to a unit that is not present, ignoring.",
|
||||
changes[i].path);
|
||||
break;
|
||||
case -EEXIST:
|
||||
if (changes[i].source)
|
||||
log_error_errno(changes[i].type,
|
||||
|
@ -376,8 +393,6 @@ void unit_file_dump_changes(int r, const char *verb, const UnitFileChange *chang
|
|||
log_error_errno(r, "Failed to %s: %m.", verb);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int create_symlink(
|
||||
const char *old_path,
|
||||
const char *new_path,
|
||||
|
@ -393,7 +408,11 @@ static int create_symlink(
|
|||
|
||||
/* Actually create a symlink, and remember that we did. Is
|
||||
* smart enough to check if there's already a valid symlink in
|
||||
* place. */
|
||||
* place.
|
||||
*
|
||||
* Returns 1 if a symlink was created or already exists and points to
|
||||
* the right place, or negative on error.
|
||||
*/
|
||||
|
||||
mkdir_parents_label(new_path, 0755);
|
||||
|
||||
|
@ -418,7 +437,7 @@ static int create_symlink(
|
|||
}
|
||||
|
||||
if (path_equal(dest, old_path))
|
||||
return 0;
|
||||
return 1;
|
||||
|
||||
if (!force) {
|
||||
unit_file_changes_add(changes, n_changes, -EEXIST, new_path, dest);
|
||||
|
@ -1223,6 +1242,7 @@ static int unit_file_search(
|
|||
const LookupPaths *paths,
|
||||
SearchFlags flags) {
|
||||
|
||||
_cleanup_free_ char *template = NULL;
|
||||
char **p;
|
||||
int r;
|
||||
|
||||
|
@ -1247,24 +1267,19 @@ static int unit_file_search(
|
|||
return -ENOMEM;
|
||||
|
||||
r = unit_file_load_or_readlink(c, info, path, paths->root_dir, flags);
|
||||
if (r < 0) {
|
||||
if (r != -ENOENT)
|
||||
return r;
|
||||
} else {
|
||||
if (r >= 0) {
|
||||
info->path = path;
|
||||
path = NULL;
|
||||
return r;
|
||||
}
|
||||
} else if (r != -ENOENT)
|
||||
return r;
|
||||
}
|
||||
|
||||
if (unit_name_is_valid(info->name, UNIT_NAME_INSTANCE)) {
|
||||
|
||||
/* Unit file doesn't exist, however instance
|
||||
* enablement was requested. We will check if it is
|
||||
* possible to load template unit file. */
|
||||
|
||||
_cleanup_free_ char *template = NULL;
|
||||
|
||||
r = unit_name_template(info->name, &template);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
@ -1277,17 +1292,16 @@ static int unit_file_search(
|
|||
return -ENOMEM;
|
||||
|
||||
r = unit_file_load_or_readlink(c, info, path, paths->root_dir, flags);
|
||||
if (r < 0) {
|
||||
if (r != -ENOENT)
|
||||
return r;
|
||||
} else {
|
||||
if (r >= 0) {
|
||||
info->path = path;
|
||||
path = NULL;
|
||||
return r;
|
||||
}
|
||||
} else if (r != -ENOENT)
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
||||
log_debug("Cannot find unit %s%s%s.", info->name, template ? " or " : "", strempty(template));
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
|
@ -1319,6 +1333,11 @@ static int install_info_follow(
|
|||
return unit_file_load_or_readlink(c, i, i->path, root_dir, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* Search for the unit file. If the unit name is a symlink,
|
||||
* follow the symlink to the target, maybe more than once.
|
||||
* Propagate the instance name if present.
|
||||
*/
|
||||
static int install_info_traverse(
|
||||
UnitFileScope scope,
|
||||
InstallContext *c,
|
||||
|
@ -1355,13 +1374,10 @@ static int install_info_traverse(
|
|||
}
|
||||
|
||||
r = install_info_follow(c, i, paths->root_dir, flags);
|
||||
if (r < 0) {
|
||||
if (r == -EXDEV) {
|
||||
_cleanup_free_ char *buffer = NULL;
|
||||
const char *bn;
|
||||
|
||||
if (r != -EXDEV)
|
||||
return r;
|
||||
|
||||
/* Target has a different name, create a new
|
||||
* install info object for that, and continue
|
||||
* with that. */
|
||||
|
@ -1388,12 +1404,15 @@ static int install_info_traverse(
|
|||
if (r < 0)
|
||||
return r;
|
||||
|
||||
/* Try again, with the new target we found. */
|
||||
r = unit_file_search(c, i, paths, flags);
|
||||
if (r < 0)
|
||||
return r;
|
||||
if (r == -ENOENT)
|
||||
/* Translate error code to highlight this specific case */
|
||||
return -ENOLINK;
|
||||
}
|
||||
|
||||
/* Try again, with the new target we found. */
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
if (ret)
|
||||
|
@ -1689,11 +1708,17 @@ static int install_context_mark_for_removal(
|
|||
return r;
|
||||
|
||||
r = install_info_traverse(scope, c, paths, i, SEARCH_LOAD|SEARCH_FOLLOW_CONFIG_SYMLINKS, NULL);
|
||||
if (r < 0)
|
||||
if (r == -ENOLINK)
|
||||
return 0;
|
||||
else if (r < 0)
|
||||
return r;
|
||||
|
||||
if (i->type != UNIT_FILE_TYPE_REGULAR)
|
||||
if (i->type != UNIT_FILE_TYPE_REGULAR) {
|
||||
log_debug("Unit %s has type %s, ignoring.",
|
||||
i->name,
|
||||
unit_file_type_to_string(i->type) ?: "invalid");
|
||||
continue;
|
||||
}
|
||||
|
||||
r = mark_symlink_for_removal(remove_symlinks_to, i->name);
|
||||
if (r < 0)
|
||||
|
@ -2788,6 +2813,9 @@ int unit_file_preset_all(
|
|||
if (r == -ERFKILL)
|
||||
r = unit_file_changes_add(changes, n_changes,
|
||||
UNIT_FILE_IS_MASKED, de->d_name, NULL);
|
||||
else if (r == -ENOLINK)
|
||||
r = unit_file_changes_add(changes, n_changes,
|
||||
UNIT_FILE_IS_DANGLING, de->d_name, NULL);
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
@ -2911,6 +2939,7 @@ static const char* const unit_file_change_type_table[_UNIT_FILE_CHANGE_TYPE_MAX]
|
|||
[UNIT_FILE_SYMLINK] = "symlink",
|
||||
[UNIT_FILE_UNLINK] = "unlink",
|
||||
[UNIT_FILE_IS_MASKED] = "masked",
|
||||
[UNIT_FILE_IS_DANGLING] = "dangling",
|
||||
};
|
||||
|
||||
DEFINE_STRING_TABLE_LOOKUP(unit_file_change_type, UnitFileChangeType);
|
||||
|
|
|
@ -73,6 +73,7 @@ enum UnitFileChangeType {
|
|||
UNIT_FILE_SYMLINK,
|
||||
UNIT_FILE_UNLINK,
|
||||
UNIT_FILE_IS_MASKED,
|
||||
UNIT_FILE_IS_DANGLING,
|
||||
_UNIT_FILE_CHANGE_TYPE_MAX,
|
||||
_UNIT_FILE_CHANGE_INVALID = INT_MIN
|
||||
};
|
||||
|
|
|
@ -483,7 +483,7 @@ static int output_units_list(const UnitInfo *unit_infos, unsigned c) {
|
|||
}
|
||||
|
||||
if (circle_len > 0)
|
||||
printf("%s%s%s ", on_circle, circle ? draw_special_char(DRAW_BLACK_CIRCLE) : " ", off_circle);
|
||||
printf("%s%s%s ", on_circle, circle ? special_glyph(BLACK_CIRCLE) : " ", off_circle);
|
||||
|
||||
printf("%s%-*s%s %s%-*s%s %s%-*s %-*s%s %-*s",
|
||||
on_active, id_len, id, off_active,
|
||||
|
@ -1540,7 +1540,7 @@ static int list_dependencies_print(const char *name, int level, unsigned int bra
|
|||
printf("%s...\n",max_len % 2 ? "" : " ");
|
||||
return 0;
|
||||
}
|
||||
printf("%s", draw_special_char(branches & (1 << i) ? DRAW_TREE_VERTICAL : DRAW_TREE_SPACE));
|
||||
printf("%s", special_glyph(branches & (1 << i) ? TREE_VERTICAL : TREE_SPACE));
|
||||
}
|
||||
len += 2;
|
||||
|
||||
|
@ -1549,7 +1549,7 @@ static int list_dependencies_print(const char *name, int level, unsigned int bra
|
|||
return 0;
|
||||
}
|
||||
|
||||
printf("%s", draw_special_char(last ? DRAW_TREE_RIGHT : DRAW_TREE_BRANCH));
|
||||
printf("%s", special_glyph(last ? TREE_RIGHT : TREE_BRANCH));
|
||||
}
|
||||
|
||||
if (arg_full) {
|
||||
|
@ -1728,7 +1728,7 @@ static int list_dependencies_one(
|
|||
break;
|
||||
}
|
||||
|
||||
printf("%s%s%s ", on, draw_special_char(DRAW_BLACK_CIRCLE), ansi_normal());
|
||||
printf("%s%s%s ", on, special_glyph(BLACK_CIRCLE), ansi_normal());
|
||||
}
|
||||
|
||||
r = list_dependencies_print(*c, level, branches, c[1] == NULL);
|
||||
|
@ -1965,7 +1965,7 @@ static void output_machines_list(struct machine_info *machine_infos, unsigned n)
|
|||
on_failed = off_failed = "";
|
||||
|
||||
if (circle_len > 0)
|
||||
printf("%s%s%s ", on_state, circle ? draw_special_char(DRAW_BLACK_CIRCLE) : " ", off_state);
|
||||
printf("%s%s%s ", on_state, circle ? special_glyph(BLACK_CIRCLE) : " ", off_state);
|
||||
|
||||
if (m->is_host)
|
||||
printf("%-*s (host) %s%-*s%s %s%*" PRIu32 "%s %*" PRIu32 "\n",
|
||||
|
@ -3528,7 +3528,7 @@ static void print_status_info(
|
|||
} else
|
||||
active_on = active_off = "";
|
||||
|
||||
printf("%s%s%s %s", active_on, draw_special_char(DRAW_BLACK_CIRCLE), active_off, strna(i->id));
|
||||
printf("%s%s%s %s", active_on, special_glyph(BLACK_CIRCLE), active_off, strna(i->id));
|
||||
|
||||
if (i->description && !streq_ptr(i->id, i->description))
|
||||
printf(" - %s", i->description);
|
||||
|
@ -3583,7 +3583,7 @@ static void print_status_info(
|
|||
}
|
||||
|
||||
printf("%s\n %s", dir,
|
||||
draw_special_char(DRAW_TREE_RIGHT));
|
||||
special_glyph(TREE_RIGHT));
|
||||
}
|
||||
|
||||
last = ! (*(dropin + 1) && startswith(*(dropin + 1), dir));
|
||||
|
@ -4704,7 +4704,7 @@ static int show_system_status(sd_bus *bus) {
|
|||
} else
|
||||
on = off = "";
|
||||
|
||||
printf("%s%s%s %s\n", on, draw_special_char(DRAW_BLACK_CIRCLE), off, arg_host ? arg_host : hn);
|
||||
printf("%s%s%s %s\n", on, special_glyph(BLACK_CIRCLE), off, arg_host ? arg_host : hn);
|
||||
|
||||
printf(" State: %s%s%s\n",
|
||||
on, strna(mi.state), off);
|
||||
|
|
Loading…
Reference in a new issue