On 11/22/2010 06:03 PM, Eduardo Otubo wrote: Apologies for my review backlog (if you haven't guessed, I sometimes table big patches for later, then forget to come back rapidly). > This is the implementation of the previous patch now using virInterface* > API. Ended up this patch got much more simpler, smaller and easier to > review. Here is some details: > > * MAC size and interface name are fixed due to specifications on HMC, > both are created automatically and CAN'T be specified from user. They > have the following format: > > * MAC: 122980003002 HMC represents MAC as a decimal number? How hideous, but not your fault; and this comment in the commit message will be useful for anyone auditing the code in the future. > + /* Getting the remote slot number */ > + > + char_ptr = NULL; > + char_ptr = strchr(iface->mac, '\n'); Redundant assignments (delete the first line). > + if (VIR_ALLOC_N(name, PHYP_IFACENAME_SIZE) < 0) { > + virReportOOMError(); > + goto err; > + } > + > + if (VIR_ALLOC_N(mac, PHYP_MAC_SIZE) < 0) { > + virReportOOMError(); > + goto err; > + } Since these arrays are so small, it's faster to just stack-allocate them: char name[PHYP_IFACENAME_SIZE]; > + /* The next free slot itself: */ > + slot++; > + > + /* Now addig the new network interface */ s/addig/adding/ > + if (exit_status < 0 || ret == NULL) > + goto err; > + > + char_ptr = NULL; > + char_ptr = strchr(ret, '\n'); Another redundant assignment. > + if (memcpy(mac, ret, PHYP_IFACENAME_SIZE) == NULL) > + goto err; > + > + VIR_FREE(cmd); > + VIR_FREE(ret); > + return virGetInterface(conn, name, mac); > + > + err: > + VIR_FREE(name); > + VIR_FREE(cmd); > + VIR_FREE(ret); > + return NULL; This leaks name if you end up calling virGetInterface. And both paths leak mac. But if you change name and mac to be stack-allocated, then you don't have to worry about freeing them. > + ret = phypExec(session, cmd, &exit_status, conn); > + > + if (exit_status < 0 || ret == NULL) > + goto err; > + > + VIR_FREE(cmd); > + return virGetInterface(conn, name, ret); > + > + err: > + VIR_FREE(cmd); > + VIR_FREE(ret); > + return NULL; This leaks ret if virGetInterface is called. > + ret = phypExec(session, cmd, &exit_status, iface->conn); > + > + if (exit_status < 0 || ret == NULL) > + goto err; > + > + if (virStrToLong_i(ret, &char_ptr, 10, &state) == -1) > + goto err; > + > + if (char_ptr) > + *char_ptr = '\0'; > + > + VIR_FREE(cmd); > + return state; Another leak of ret. > +static int > +phypListInterfaces(virConnectPtr conn, char **const names, int nnames) s/int/size_t/ > + ret = phypExec(session, cmd, &exit_status, conn); > + > + /* I need to parse the textual return in order to get the network interfaces */ > + if (exit_status < 0 || ret == NULL) > + goto err; > + else { Rather than indenting the rest of the function inside an else{} block, you can leave the code at the top level indentation since the if() block was an unconditional goto. > + ret = phypExec(session, cmd, &exit_status, conn); > + > + if (exit_status < 0 || ret == NULL) > + goto err; > + > + if (virStrToLong_i(ret, &char_ptr, 10, &nnets) == -1) > + goto err; > + > + if (char_ptr) > + *char_ptr = '\0'; > + > + VIR_FREE(cmd); > + return nnets; Another leak of ret. > > int > @@ -4117,7 +4651,7 @@ phypRegister(void) > return -1; > if (virRegisterStorageDriver(&phypStorageDriver) < 0) > return -1; > - if (virRegisterNetworkDriver(&phypNetworkDriver) < 0) > + if (virRegisterInterfaceDriver(&phypInterfaceDriver) < 0) Are you intending to replace NetworkDriver with InterfaceDriver, or should you be supporting both drivers simultaneously (although this may be more an indication of how unfamiliar I am with the difference between what the two drivers are supposed to provide). -- Eric Blake eblake@xxxxxxxxxx +1-801-349-2682 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