|
@@ -347,48 +347,35 @@ static gint ga_strcmp(gconstpointer str1, gconstpointer str2)
|
|
|
}
|
|
|
|
|
|
/* disable commands that aren't safe for fsfreeze */
|
|
|
-static void ga_disable_non_whitelisted(void)
|
|
|
+static void ga_disable_non_whitelisted(QmpCommand *cmd, void *opaque)
|
|
|
{
|
|
|
- char **list_head, **list;
|
|
|
- bool whitelisted;
|
|
|
- int i;
|
|
|
-
|
|
|
- list_head = list = qmp_get_command_list();
|
|
|
- while (*list != NULL) {
|
|
|
- whitelisted = false;
|
|
|
- i = 0;
|
|
|
- while (ga_freeze_whitelist[i] != NULL) {
|
|
|
- if (strcmp(*list, ga_freeze_whitelist[i]) == 0) {
|
|
|
- whitelisted = true;
|
|
|
- }
|
|
|
- i++;
|
|
|
- }
|
|
|
- if (!whitelisted) {
|
|
|
- g_debug("disabling command: %s", *list);
|
|
|
- qmp_disable_command(*list);
|
|
|
+ bool whitelisted = false;
|
|
|
+ int i = 0;
|
|
|
+ const char *name = qmp_command_name(cmd);
|
|
|
+
|
|
|
+ while (ga_freeze_whitelist[i] != NULL) {
|
|
|
+ if (strcmp(name, ga_freeze_whitelist[i]) == 0) {
|
|
|
+ whitelisted = true;
|
|
|
}
|
|
|
- g_free(*list);
|
|
|
- list++;
|
|
|
+ i++;
|
|
|
+ }
|
|
|
+ if (!whitelisted) {
|
|
|
+ g_debug("disabling command: %s", name);
|
|
|
+ qmp_disable_command(name);
|
|
|
}
|
|
|
- g_free(list_head);
|
|
|
}
|
|
|
|
|
|
/* [re-]enable all commands, except those explicitly blacklisted by user */
|
|
|
-static void ga_enable_non_blacklisted(GList *blacklist)
|
|
|
+static void ga_enable_non_blacklisted(QmpCommand *cmd, void *opaque)
|
|
|
{
|
|
|
- char **list_head, **list;
|
|
|
-
|
|
|
- list_head = list = qmp_get_command_list();
|
|
|
- while (*list != NULL) {
|
|
|
- if (g_list_find_custom(blacklist, *list, ga_strcmp) == NULL &&
|
|
|
- !qmp_command_is_enabled(*list)) {
|
|
|
- g_debug("enabling command: %s", *list);
|
|
|
- qmp_enable_command(*list);
|
|
|
- }
|
|
|
- g_free(*list);
|
|
|
- list++;
|
|
|
+ GList *blacklist = opaque;
|
|
|
+ const char *name = qmp_command_name(cmd);
|
|
|
+
|
|
|
+ if (g_list_find_custom(blacklist, name, ga_strcmp) == NULL &&
|
|
|
+ !qmp_command_is_enabled(cmd)) {
|
|
|
+ g_debug("enabling command: %s", name);
|
|
|
+ qmp_enable_command(name);
|
|
|
}
|
|
|
- g_free(list_head);
|
|
|
}
|
|
|
|
|
|
static bool ga_create_file(const char *path)
|
|
@@ -424,7 +411,7 @@ void ga_set_frozen(GAState *s)
|
|
|
return;
|
|
|
}
|
|
|
/* disable all non-whitelisted (for frozen state) commands */
|
|
|
- ga_disable_non_whitelisted();
|
|
|
+ qmp_for_each_command(ga_disable_non_whitelisted, NULL);
|
|
|
g_warning("disabling logging due to filesystem freeze");
|
|
|
ga_disable_logging(s);
|
|
|
s->frozen = true;
|
|
@@ -460,7 +447,7 @@ void ga_unset_frozen(GAState *s)
|
|
|
}
|
|
|
|
|
|
/* enable all disabled, non-blacklisted commands */
|
|
|
- ga_enable_non_blacklisted(s->blacklist);
|
|
|
+ qmp_for_each_command(ga_enable_non_blacklisted, s->blacklist);
|
|
|
s->frozen = false;
|
|
|
if (!ga_delete_file(s->state_filepath_isfrozen)) {
|
|
|
g_warning("unable to delete %s, fsfreeze may not function properly",
|
|
@@ -920,6 +907,11 @@ int64_t ga_get_fd_handle(GAState *s, Error **errp)
|
|
|
return handle;
|
|
|
}
|
|
|
|
|
|
+static void ga_print_cmd(QmpCommand *cmd, void *opaque)
|
|
|
+{
|
|
|
+ printf("%s\n", qmp_command_name(cmd));
|
|
|
+}
|
|
|
+
|
|
|
int main(int argc, char **argv)
|
|
|
{
|
|
|
const char *sopt = "hVvdm:p:l:f:F::b:s:t:";
|
|
@@ -996,15 +988,8 @@ int main(int argc, char **argv)
|
|
|
daemonize = 1;
|
|
|
break;
|
|
|
case 'b': {
|
|
|
- char **list_head, **list;
|
|
|
if (is_help_option(optarg)) {
|
|
|
- list_head = list = qmp_get_command_list();
|
|
|
- while (*list != NULL) {
|
|
|
- printf("%s\n", *list);
|
|
|
- g_free(*list);
|
|
|
- list++;
|
|
|
- }
|
|
|
- g_free(list_head);
|
|
|
+ qmp_for_each_command(ga_print_cmd, NULL);
|
|
|
return 0;
|
|
|
}
|
|
|
for (j = 0, i = 0, len = strlen(optarg); i < len; i++) {
|
|
@@ -1126,7 +1111,7 @@ int main(int argc, char **argv)
|
|
|
s->deferred_options.log_filepath = log_filepath;
|
|
|
}
|
|
|
ga_disable_logging(s);
|
|
|
- ga_disable_non_whitelisted();
|
|
|
+ qmp_for_each_command(ga_disable_non_whitelisted, NULL);
|
|
|
} else {
|
|
|
if (daemonize) {
|
|
|
become_daemon(pid_filepath);
|