[libvirt] PATCH 3/4: SUpport bridge config for openvz
Daniel P. Berrange
berrange at redhat.com
Mon Oct 20 10:49:45 UTC 2008
On Fri, Oct 17, 2008 at 03:58:05PM +0200, Jim Meyering wrote:
> "Daniel P. Berrange" <berrange at redhat.com> wrote:
> ...
> > +int
> > +openvzWriteConfigParam(int vpsid, const char *param, const char *value)
> > +{
> > + char conf_file[PATH_MAX];
> > + char temp_file[PATH_MAX];
> > + char line[PATH_MAX] ;
> > + int fd, temp_fd;
> > +
> > + if (openvzLocateConfFile(vpsid, conf_file, PATH_MAX, "conf")<0)
> > + return -1;
> > + if (openvzLocateConfFile(vpsid, temp_file, PATH_MAX, "tmp")<0)
> > + return -1;
> > +
> > + fd = open(conf_file, O_RDONLY);
> > + if (fd == -1)
> > + return -1;
> > + temp_fd = open(temp_file, O_WRONLY | O_CREAT | O_TRUNC, 0644);
> > + if (temp_fd == -1) {
> > + close(fd);
> > + return -1;
> > + }
> > +
> > + while(1) {
> > + if (openvz_readline(fd, line, sizeof(line)) <= 0)
> > + break;
> > +
> > + if (!STRPREFIX(line, param)) {
> > + if (safewrite(temp_fd, line, strlen(line)) !=
> > + strlen(line))
> > + goto error;
> > + }
> > + }
> > +
> > + if (safewrite(temp_fd, param, strlen(param)) !=
> > + strlen(param))
> > + goto error;
> > + if (safewrite(temp_fd, "=\"", 2) != 2)
> > + goto error;
> > + if (safewrite(temp_fd, value, strlen(value)) !=
> > + strlen(value))
> > + goto error;
> > + if (safewrite(temp_fd, "\"\n", 2) != 2)
> > + goto error;
>
> How about this instead, so the reader doesn't have to
> manually count string lengths and verify that the "VAR" in strlen(VAR)
> on the RHS matches the one on the LHS:
>
> if (safewrite(temp_fd, param, strlen(param)) < 0 ||
> safewrite(temp_fd, "=\"", 2) < 0 ||
> safewrite(temp_fd, value, strlen(value)) < 0 ||
> safewrite(temp_fd, "\"\n", 2) < 0)
> goto error;
Yeah, that's good.
> > + close(fd);
> > + close(temp_fd);
>
> Officially, you should always check for failure when
> you've opened the file descriptor for writing.
Ok, will fix.
>
> > + fd = temp_fd = -1;
> > +
> > + if (rename(temp_file, conf_file) < 0)
> > + goto error;
> > +
> > + return 0;
> > +
> > +error:
> > + fprintf(stderr, "damn %s\n", strerror(errno));
>
> How about mentioning the file name, too:
>
> fprintf(stderr, "failed to write %s: %s\n", conf_file,
> strerror(errno));
That is debugging code I should have removed - we should raise a
proper libvirt error if applicable.
> > +
> > +static int
> > +openvzDomainSetNetworkConfig(virConnectPtr conn,
> > + virDomainDefPtr def)
> > +{
> > + unsigned int i;
> > + virBuffer buf = VIR_BUFFER_INITIALIZER;
> > + char *param;
> > + struct openvz_driver *driver = (struct openvz_driver *) conn->privateData;
> > +
> > + for (i = 0 ; i < def->nnets ; i++) {
> > + if (driver->version < VZCTL_BRIDGE_MIN_VERSION && i > 0)
> > + virBufferAddLit(&buf, ";");
> > +
> > + if (openvzDomainSetNetwork(conn, def->name, def->nets[i], &buf) < 0) {
> > + openvzError(conn, VIR_ERR_INTERNAL_ERROR,
> > + "%s", _("Could not configure network"));
> > + goto exit;
> > + }
> > + }
> > +
> > + param = virBufferContentAndReset(&buf);
> > + if (driver->version < VZCTL_BRIDGE_MIN_VERSION && def->nnets) {
> > + if (openvzWriteConfigParam(strtoI(def->name), "NETIF", param) < 0) {
> > + VIR_FREE(param);
> > + openvzError(conn, VIR_ERR_INTERNAL_ERROR,
> > + "%s", _("cannot replace NETIF config"));
> > + return -1;
> > + }
> > + }
> > +
> > + VIR_FREE(param);
> > + return 0;
>
> param can be NULL and then dereferenced via openvzWriteConfigParam.
> How about this instead:
>
> if (driver->version < VZCTL_BRIDGE_MIN_VERSION && def->nnets) {
> char *param = virBufferContentAndReset(&buf);
> if (openvzWriteConfigParam(strtoI(def->name), "NETIF", param) < 0) {
> VIR_FREE(param);
> openvzError(conn, VIR_ERR_INTERNAL_ERROR,
> "%s", _("cannot replace NETIF config"));
> return -1;
> }
> VIR_FREE(param);
> }
>
> return 0;
>
> > +exit:
> > + param = virBufferContentAndReset(&buf);
> > + VIR_FREE(param);
>
> Then free the above directly.
Yep, good idea.
Daniel
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
More information about the libvir-list
mailing list