On Tue, Dec 18, 2012 at 10:24:06AM +0100, Jiri Denemark wrote:
On Tue, Dec 11, 2012 at 14:53:36 +0000, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange(a)redhat.com>
>
> Introduce a 'virArch' enum for CPU architectures. Include
> data type providing wordsize and endianness, and APIs to
> query this info and convert to/from enum and string form.
...
> diff --git a/src/util/virarch.c b/src/util/virarch.c
> new file mode 100644
> index 0000000..8b7bec8
> --- /dev/null
> +++ b/src/util/virarch.c
> @@ -0,0 +1,177 @@
...
> +/**
> + * virArchFromString:
> + * @archstr: the CPU architecture string
> + *
> + * Return the architecture matching @archstr,
> + * defaulting to VIR_ARCH_I686 if unidentified
This should be VIR_ARCH_NONE as Eric already noted.
> + */
> +virArch virArchFromString(const char *archstr)
> +{
> + size_t i;
> + for (i = 1 ; i < VIR_ARCH_LAST ; i++) {
> + if (STREQ(virArchData[i].name, archstr))
> + return i;
> + }
> +
> + VIR_DEBUG("Unknown arch %s", archstr);
> + return VIR_ARCH_NONE;
> +}
> +
> +
> +/**
> + * virArchFromHost:
> + *
> + * Return the host architecture. Prefer this to the
> + * uname 'machine' field, since this will canonicalize
> + * architecture names like 'amd64' into 'x86_64'.
> + */
> +virArch virArchFromHost(void)
> +{
> + struct utsname ut;
> + virArch arch;
> +
> + uname(&ut);
> +
> + /* Some special cases we need to handle first
> + * for non-canonical names */
> + if (ut.machine[0] == 'i' &&
> + ut.machine[2] == '8' &&
> + ut.machine[3] == '6' &&
> + ut.machine[4] == '\0') {
> + arch = VIR_ARCH_I686;
This could access undefined memory in the unlikely case of ut.machine
being just "i". Insert the ut.machine[1] != '\0' test to match the
original code in qemu_command.c.
> + } else if (STREQ(ut.machine, "ia64")) {
> + arch = VIR_ARCH_ITANIUM;
> + } else if (STREQ(ut.machine, "amd64")) {
> + arch = VIR_ARCH_X86_64;
> + } else {
> + /* Otherwise assume the canonical name */
> + if ((arch = virArchFromString(ut.machine)) == VIR_ARCH_NONE) {
> + VIR_WARN("Unknown host arch %s, report to
libvir-list(a)redhat.com",
> + ut.machine);
> + }
> + }
> +
> + VIR_DEBUG("Mapped %s to %d (%s)",
> + ut.machine, arch, virArchToString(arch));
> +
> + return arch;
> +}
> diff --git a/src/util/virarch.h b/src/util/virarch.h
> new file mode 100644
> index 0000000..d29d7ef
> --- /dev/null
> +++ b/src/util/virarch.h
> @@ -0,0 +1,81 @@
...
> +#ifndef __VIR_ARCH_H__
> +# define __VIR_ARCH_H__
> +
> +# include "internal.h"
> +# include "util.h"
Looks like nothing from util.h is used in this header file.
Oh true. Originally I used the VIR_ENUM stuff, but I removed that
in the end
Daniel
--
|:
http://berrange.com -o-
http://www.flickr.com/photos/dberrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|:
http://entangle-photo.org -o-
http://live.gnome.org/gtk-vnc :|