On 08/26/2013 06:36 AM, Tomas Meszaros wrote: > Function vshDomainCompler returns domains names which can be used > by various virsh commands, for example: > > virsh> start <TAB> > fedora domain_foo domain_bar > virsh> start f<TAB> > virsh> start fedora > > Michal Privoznik recommended to add global variable virConnectPtr *__my_conn Stale name in the commit message. > so we can get the list of domains from the virConnecTListAllDomains(). > > vshReconnect() is called before the first command is executed > in order to provide autocompletion for the very first command. Stale comment, now that you fixed it to delay until completion requires a connection. > > diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c > index b29b82a..0f30902 100644 > --- a/tools/virsh-domain-monitor.c > +++ b/tools/virsh-domain-monitor.c > @@ -1876,7 +1876,9 @@ const vshCmdDef domMonitoringCmds[] = { > .handler = cmdDomBlkError, > .opts = opts_domblkerror, > .info = info_domblkerror, > - .flags = 0 > + .flags = 0, > + .completer = vshDomainCompleter, > + .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE I'm still not sure I get why we need per-command completers; isn't per-option completion sufficient (by associating the completer with the --domain of each of these commands)? > @@ -1888,7 +1890,10 @@ const vshCmdDef domMonitoringCmds[] = { > .handler = cmdDomblklist, > .opts = opts_domblklist, > .info = info_domblklist, > - .flags = 0 > + .flags = 0, > + .completer = vshDomainCompleter, > + .completer_flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE | > + VIR_CONNECT_LIST_DOMAINS_INACTIVE Style: please use trailing comma after the last element of the struct, so that future additions don't have to modify existing lines when adding even more struct members down the road (throughout this patch, and probably throughout the series). Yeah, I know existing C99 initializers for vshCmdInfo.dad and vshCmdOptDef.help aren't using trailing commas consistently, so maybe that's worth a separate cleanup patch. If we had been following that style, you wouldn't be modifying the .flags lines. > +++ b/tools/virsh.c > @@ -88,6 +88,8 @@ static char *progname; > > static const vshCmdGrp cmdGroups[]; > > +vshControl *vshCtl; This variable should probably be marked static, as I don't see it referenced in any other file. > + > /* Bypass header poison */ > #undef strdup > > @@ -317,6 +319,7 @@ vshCatchDisconnect(virConnectPtr conn ATTRIBUTE_UNUSED, > static void > vshReconnect(vshControl *ctl) > { > + printf("\n>>>\n"); Leftover debugging? > @@ -2510,6 +2513,46 @@ vshCloseLogFile(vshControl *ctl) > > #ifdef USE_READLINE > > +/* ------------- > + * Completers > + * ------------- > + */ > + > +char ** > +vshDomainCompleter(unsigned int flags) Ouch - you have a link error if building without USE_READLINE, since the use of this function was unconditional but its implementation is conditional. How much of this code can you hoist outside of USE_READLINE? If you can't, then please provide the #else half so that at least things still link. > +{ > + virDomainPtr *domains; > + size_t i; > + char **names = NULL; > + int ndomains; > + > + if (!vshCtl->conn) > + return NULL; > + > + ndomains = virConnectListAllDomains(vshCtl->conn, &domains, flags); > + > + if (ndomains < 0) > + return NULL; > + > + names = vshMalloc(NULL, sizeof(char *) * (ndomains + 1)); > + VIR_ALLOC_N seems nicer for the task. > + for (i = 0; i < ndomains; i++) { > + const char *name = virDomainGetName(domains[i]); > + if (VIR_STRDUP(names[i], name) < 0) { > + virDomainFree(domains[i]); > + goto error; > + } > + virDomainFree(domains[i]); > + } > + names[i] = NULL; > + VIR_FREE(domains); > + return names; > + > +error: Memory leak - if you get here, you don't finish calling virDomainFree() on the tail of the list, nor VIR_FREE(domains). That cleanup needs to be unconditional. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
Attachment:
signature.asc
Description: OpenPGP digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list