ifupdown: consistently update the state file when exiting

This commit is contained in:
Ariadne Conill 2020-09-09 14:18:16 -06:00
parent 6999a125c8
commit 885126174d

View file

@ -186,6 +186,27 @@ change_auto_interfaces(struct lif_dict *collection, struct lif_dict *state, stru
return true; return true;
} }
int
update_state_file_and_exit(int rc, struct lif_dict *state)
{
if (exec_opts.mock)
{
exit(rc);
return rc;
}
if (!lif_state_write_path(state, exec_opts.state_file))
{
fprintf(stderr, "%s: could not update %s\n", argv0, exec_opts.state_file);
exit(EXIT_FAILURE);
return EXIT_FAILURE;
}
exit(rc);
return rc;
}
int int
ifupdown_main(int argc, char *argv[]) ifupdown_main(int argc, char *argv[])
{ {
@ -217,9 +238,9 @@ ifupdown_main(int argc, char *argv[])
if (match_opts.is_auto) if (match_opts.is_auto)
{ {
if (!change_auto_interfaces(&collection, &state, &match_opts)) if (!change_auto_interfaces(&collection, &state, &match_opts))
return EXIT_FAILURE; return update_state_file_and_exit(EXIT_FAILURE, &state);
return EXIT_SUCCESS; return update_state_file_and_exit(EXIT_SUCCESS, &state);
} }
else if (optind >= argc) else if (optind >= argc)
generic_usage(self_applet, EXIT_FAILURE); generic_usage(self_applet, EXIT_FAILURE);
@ -248,23 +269,17 @@ ifupdown_main(int argc, char *argv[])
if (entry == NULL) if (entry == NULL)
{ {
fprintf(stderr, "%s: unknown interface %s\n", argv0, argv[idx]); fprintf(stderr, "%s: unknown interface %s\n", argv0, argv[idx]);
return EXIT_FAILURE; return update_state_file_and_exit(EXIT_FAILURE, &state);
} }
iface = entry->data; iface = entry->data;
} }
if (!change_interface(iface, &collection, &state, ifname)) if (!change_interface(iface, &collection, &state, ifname))
return EXIT_FAILURE; return update_state_file_and_exit(EXIT_FAILURE, &state);
} }
if (!exec_opts.mock && !lif_state_write_path(&state, exec_opts.state_file)) return update_state_file_and_exit(EXIT_SUCCESS, &state);
{
fprintf(stderr, "%s: could not update %s\n", argv0, exec_opts.state_file);
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
} }
struct if_applet ifup_applet = { struct if_applet ifup_applet = {