Message ID | 20240108204909.564514-3-dwmw2@infradead.org (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Rework matching of network devices to -nic options | expand |
On 08/01/2024 21.26, David Woodhouse wrote: > From: David Woodhouse <dwmw@amazon.co.uk> > > By noting the models for which a configuration was requested, we can give > the user an accurate list of which NIC models were actually available on > the platform/configuration that was otherwise chosen. > > Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> > Reviewed-by: Paul Durrant <paul@xen.org> > --- > net/net.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 94 insertions(+) > > diff --git a/net/net.c b/net/net.c > index aeb7f573fc..962904eaef 100644 > --- a/net/net.c > +++ b/net/net.c > @@ -75,6 +75,8 @@ typedef QSIMPLEQ_HEAD(, NetdevQueueEntry) NetdevQueue; > > static NetdevQueue nd_queue = QSIMPLEQ_HEAD_INITIALIZER(nd_queue); > > +static GHashTable *nic_model_help; > + > /***********************************************************/ > /* network device redirectors */ > > @@ -1087,12 +1089,94 @@ static int net_init_nic(const Netdev *netdev, const char *name, > return idx; > } > > +static gboolean add_nic_result(gpointer key, gpointer value, gpointer user_data) > +{ > + GPtrArray *results = user_data; > + GPtrArray *alias_list = value; > + const char *model = key; > + char *result; > + > + if (!alias_list) { > + result = g_strdup(model); > + } else { > + GString *result_str = g_string_new(model); > + int i; > + > + g_string_append(result_str, " (aka "); It's an abbreviation, so I'd rather use "a.k.a." instead of "aka". Apart from that, the patch looks reasonable to me. Thomas > + for (i = 0; i < alias_list->len; i++) { > + if (i) { > + g_string_append(result_str, ", "); > + } > + g_string_append(result_str, alias_list->pdata[i]); > + } > + g_string_append(result_str, ")"); > + result = result_str->str; > + g_string_free(result_str, false); > + g_ptr_array_unref(alias_list); > + } > + g_ptr_array_add(results, result); > + return true; > +} ...
On Fri, 2024-01-26 at 15:33 +0100, Thomas Huth wrote: > > It's an abbreviation, so I'd rather use "a.k.a." instead of "aka". > > Apart from that, the patch looks reasonable to me. I was going for shorter line length in the output. I will note that we have only 47 instances of 'a\.k\.a' in the code base, and about 117 instances of 'aka '. The latter does include a few false positives, but it also includes *all* the user-visible occurrences (mostly in CPU model names). It is literally in the dictionary as "aka": https://dictionary.cambridge.org/dictionary/english/aka ... unlike e.g. "e.g." which the dictionary does show as such, albeit with a very reluctant "also eg" in very small letters: https://dictionary.cambridge.org/dictionary/english/eg Definitely not a hill I'm prepared to die on though :)
On 26/01/2024 15.46, David Woodhouse wrote: > On Fri, 2024-01-26 at 15:33 +0100, Thomas Huth wrote: >> >> It's an abbreviation, so I'd rather use "a.k.a." instead of "aka". >> >> Apart from that, the patch looks reasonable to me. > > I was going for shorter line length in the output. > > I will note that we have only 47 instances of 'a\.k\.a' in the code > base, and about 117 instances of 'aka '. The latter does include a few > false positives, but it also includes *all* the user-visible > occurrences (mostly in CPU model names). > > It is literally in the dictionary as "aka": > https://dictionary.cambridge.org/dictionary/english/aka > ... unlike e.g. "e.g." which the dictionary does show as such, albeit > with a very reluctant "also eg" in very small letters: > https://dictionary.cambridge.org/dictionary/english/eg > > Definitely not a hill I'm prepared to die on though :) OK, I'm not a native speaker ... if "aka" is fine for you, then it's fine for me, too ;-) Thomas
diff --git a/net/net.c b/net/net.c index aeb7f573fc..962904eaef 100644 --- a/net/net.c +++ b/net/net.c @@ -75,6 +75,8 @@ typedef QSIMPLEQ_HEAD(, NetdevQueueEntry) NetdevQueue; static NetdevQueue nd_queue = QSIMPLEQ_HEAD_INITIALIZER(nd_queue); +static GHashTable *nic_model_help; + /***********************************************************/ /* network device redirectors */ @@ -1087,12 +1089,94 @@ static int net_init_nic(const Netdev *netdev, const char *name, return idx; } +static gboolean add_nic_result(gpointer key, gpointer value, gpointer user_data) +{ + GPtrArray *results = user_data; + GPtrArray *alias_list = value; + const char *model = key; + char *result; + + if (!alias_list) { + result = g_strdup(model); + } else { + GString *result_str = g_string_new(model); + int i; + + g_string_append(result_str, " (aka "); + for (i = 0; i < alias_list->len; i++) { + if (i) { + g_string_append(result_str, ", "); + } + g_string_append(result_str, alias_list->pdata[i]); + } + g_string_append(result_str, ")"); + result = result_str->str; + g_string_free(result_str, false); + g_ptr_array_unref(alias_list); + } + g_ptr_array_add(results, result); + return true; +} + +static int model_cmp(char **a, char **b) +{ + return strcmp(*a, *b); +} + +static void show_nic_models(void) +{ + GPtrArray *results = g_ptr_array_new(); + int i; + + g_hash_table_foreach_remove(nic_model_help, add_nic_result, results); + g_ptr_array_sort(results, (GCompareFunc)model_cmp); + + printf("Available NIC models for this configuration:\n"); + for (i = 0 ; i < results->len; i++) { + printf("%s\n", (char *)results->pdata[i]); + } + g_hash_table_unref(nic_model_help); + nic_model_help = NULL; +} + +static void add_nic_model_help(const char *model, const char *alias) +{ + GPtrArray *alias_list = NULL; + + if (g_hash_table_lookup_extended(nic_model_help, model, NULL, + (gpointer *)&alias_list)) { + /* Already exists, no alias to add: return */ + if (!alias) { + return; + } + if (alias_list) { + /* Check if this alias is already in the list. Add if not. */ + if (!g_ptr_array_find_with_equal_func(alias_list, alias, + g_str_equal, NULL)) { + g_ptr_array_add(alias_list, g_strdup(alias)); + } + return; + } + } + /* Either this model wasn't in the list already, or a first alias added */ + if (alias) { + alias_list = g_ptr_array_new(); + g_ptr_array_set_free_func(alias_list, g_free); + g_ptr_array_add(alias_list, g_strdup(alias)); + } + g_hash_table_replace(nic_model_help, g_strdup(model), alias_list); +} + NICInfo *qemu_find_nic_info(const char *typename, bool match_default, const char *alias) { NICInfo *nd; int i; + if (nic_model_help) { + add_nic_model_help(typename, alias); + } + for (i = 0; i < nb_nics; i++) { nd = &nd_table[i]; @@ -1606,6 +1690,10 @@ void net_check_clients(void) NetClientState *nc; int i; + if (nic_model_help) { + show_nic_models(); + exit(0); + } net_hub_check_clients(); QTAILQ_FOREACH(nc, &net_clients, next) { @@ -1685,6 +1773,12 @@ static int net_param_nic(void *dummy, QemuOpts *opts, Error **errp) memset(ni, 0, sizeof(*ni)); ni->model = qemu_opt_get_del(opts, "model"); + if (!nic_model_help && !g_strcmp0(ni->model, "help")) { + nic_model_help = g_hash_table_new_full(g_str_hash, g_str_equal, + g_free, NULL); + return 0; + } + /* Create an ID if the user did not specify one */ nd_id = g_strdup(qemu_opts_id(opts)); if (!nd_id) {