[libvirt] FYI: committed make syntax-check fix
by Chris Lalancette
I just committed this change:
Wed Oct 16 14:03:00 CEST 2008 Chris Lalancette <clalance(a)redhat.com>
* "make syntax-check" was complaining that network_driver.c was
missing from POTFILES.in. Add it, and then fix up one warning about
included c-ctypes.h that wasn't being used.
Since make syntax-check was complaining about the lack of network_driver.c.
Yes, I know today is Thursday, Oct. 16, I just noticed my silliness. Anyway,
just wanted to give a heads up.
--
Chris Lalancette
16 years, 2 months
[libvirt] [PATCH 0/3] Domain events - overview
by Ben Guthro
The following patch series implements the Events API discussed here previously in this thread:
http://www.redhat.com/archives/libvir-list/2008-September/msg00321.html
This is a rather large patch, and touches quite a few files, but in the end, accomplishes the goal of event delivery of notificaton of domain events.
It does so in a manner that is able to co-exist with older clients, or older libvirtd implementations.
In the former case, events will never be delivered to a client that does not request them.
In the latter case, we will fail registration, and so events will not be available.
I have broken this up into 3 patches in the following manner:
1/3 - events.patch
This is the bulk of the work. It emits, and delivers events to clients that are supported, and have registered to recieve the events.
2/3 - events-xen.patch
These changes are currently untested (as I did my development with KVM), but are the changes that will be necessary to monitor xenstore for changes in domain states
3/3 - events-test.patch
This is a test harness implemented to receive (and print) when domain events occur. I was unsure where this should live in the tree - so it currently is an independant patch (.c and Makefile in its own dir)
Please note that I have not yet made any effort to generate any Python, or Java bindings, but wanted to get this out on the list first.
NOTES:
Thread safeness:
We know that there are 2 data structures that need protection against concurrent access
_virDriver.conns and
_virConnect.domainEventCallbacks
However, we have not addressed these issues at this juncture.
We are considering recursive mutexes (specifically making conn->lock one) to avoid deadlocks in a vir* call from within a callback. We plan on addressing this with the next version of this code, after addressing any other issues the list may come up with, as well.
16 years, 2 months
[libvirt] [PATCH] Add a Windows icon resource to virsh.exe
by Richard W.M. Jones
This patch adds a Windows resource icon to virsh.exe (on Windows only,
obviously).
I've generated 16x16, 32x32, 48x48 and 64x64 MS .ico files, starting
from Diana Fong / Tim Allen's libvirtLogo.png in the docs directory,
scaling it down to the required size, and adding an alpha mask.
The *.ico files have to go into the src directory, because of
limitations of the Microsoft resource editor file format itself. I
propose to add the 64x64 PNG file into the docs directory, or perhaps
not bother adding it at all -- it's not actually used and can be quite
trivially recreated.
My graphical attempts are fairly lame. This is partly because these
icons really need to be tweaked by hand for legibility at small sizes,
and partly because Windows itself does some quantization on the .ico
files after loading them. This quantization I don't understand and
isn't documented anywhere. Nevertheless the icon looks not totally
unreasonable, as you can see from the final screenshot attached.
Rich.
--
Richard Jones, Emerging Technologies, Red Hat http://et.redhat.com/~rjones
Read my OCaml programming blog: http://camltastic.blogspot.com/
Fedora now supports 68 OCaml packages (the OPEN alternative to F#)
http://cocan.org/getting_started_with_ocaml_on_red_hat_and_fedora
16 years, 2 months
[libvirt] [PATCH] openvz: swap <source bridge=...> with <target dev=...>
by Anton Protopopov
2008/9/29 Evgeniy V. Sokolov <evg(a)parallels.com>
>
>
>> This behaviour contradicts with description found in docs (in which
>> <source> tag specify interface in host, not in container). I think,
>> the previous bridge must be specified as
>> <interface type='bridge'>
>> <mac address='00:16:3e:34:21:9e'/>
>> - <source bridge='eth10'/>
>> + <target dev='eth10'/>
>> </interface>
>>
>> You are right. It is bug.
>>
>> Well, here is the patch, that fixes that behaviour.
>>
>
> Your patch is half of fix. It require to fix openvzReadNetworkConf() in
> openvz_conf.c.
>
Here is a new one. Check it, please.
16 years, 2 months
[libvirt] PATCH: Fix virRealloc for zero-sized alloc
by Daniel P. Berrange
The change to use arrays instead of linked-lists exposed a tiny bug in
the virReallocN function. The realloc() contract says that if size is
zero, then its semantics are the same as free(). virReallocN wasn't
matching this, instead returning failure, and not setting the original
pointer to NULL as expected. I've just committed this patch to fix this
bug which was causing test suite crashes
$ cvs -q diff -up memory.c
Index: memory.c
===================================================================
RCS file: /data/cvs/libvirt/src/memory.c,v
retrieving revision 1.8
diff -u -p -r1.8 memory.c
--- memory.c 19 Jun 2008 11:58:49 -0000 1.8
+++ memory.c 10 Oct 2008 18:16:43 -0000
@@ -158,7 +158,7 @@ int __virReallocN(void *ptrptr, size_t s
return -1;
}
tmp = realloc(*(void**)ptrptr, size * count);
- if (!tmp)
+ if (!tmp && (size * count))
return -1;
*(void**)ptrptr = tmp;
return 0;
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 :|
16 years, 2 months
[libvirt] [PATCH] avoid many format string warnings
by Jim Meyering
Rather than manually editing 140+ diagnostics in 20 files (tedious
and error-prone), I wrote a script to do the job (fun and reusable).
There was only one change that required manual intervention,
and that was because gcc doesn't yet know about the glibc/printf-
specific %m format specifier.
One disadvantage of doing it this way is that lines can only get longer
since I added no code to wrap them, but that is outweighed by being
able to automate the process. And who knows... maybe someone will be
motivated to teach this little script how to break+reindent long lines.
#!/usr/bin/perl
use strict;
use warnings;
(my $ME = $0) =~ s|.*/||;
# collect name/lineno pairs from output of gcc -W...
my $w = 'warning: format not a string literal and no format arguments';
my $lineno = {};
while (<>)
{
/^(\S+?\.c):(\d+): $w/
or next;
$lineno->{$1} ||= {};
$lineno->{$1}->{$2} = undef
}
foreach my $file (sort keys %$lineno)
{
# Read in all lines of $file.
open FH, '<', $file
or die "$ME: can't open `$file' for reading: $!\n";
my @line = <FH>;
close FH;
my $h = $lineno->{$file};
my @line_nums = sort { $a <=> $b } keys %$h;
# Perform required substitutions.
foreach my $k (@line_nums)
{
# Handle 3 cases:
# 1: ... f(arg, arg2, ..., _("...")
# 2: ... _("...")
# 3: ... f(arg, arg2,\n
# _("...")
# print "$file: $k: $line[$k-1]";
$line[$k-1] =~ /(.*, )(_\(.*)/
and ($line[$k-1] = qq!$1"%s", $2\n!), next;
$line[$k-1] =~ /^( *)(_\(.*)/
and ($line[$k-1] = qq!$1"%s", $2\n!), next;
defined $line[$k] && $line[$k] =~ /^( *)(_\(.*)/
and ($line[$k] = qq!$1"%s", $2\n!), next;
warn "$file:$k: no match\n";
}
# Write them to temp file.
my $tmp = "$file-t";
open FH, '>', $tmp
or die "$ME: can't open `$tmp' for writing: $!\n";
print FH @line;
close FH
or die "$ME: failed to write `$tmp': $!\n";
# Move temp file back onto original.
rename $tmp, $file
or die "$ME: failed to rename: `$tmp' -> `$file': $!\n";
}
# Local variables:
# indent-tabs-mode: nil
# End:
>From 18a0f97ae36c4ba31f1f0262558c09683b788c4d Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering(a)redhat.com>
Date: Mon, 13 Oct 2008 14:12:01 +0200
Subject: [PATCH] avoid many format string warnings
Building with --disable-nls exposed many new warnings like these:
virsh.c:4952: warning: format not a string literal and no format ...
util.c:163: warning: format not a string literal and no format arguments
All but one of the following changes add a "%s" argument before
the offending _(...) argument.
This was the only manual change:
* src/lxc_driver.c (lxcVersion): Use %s and strerror(errno)
rather than %m, to avoid a warning from gcc -Wformat-security.
Add "%s" before each warned about format-string-with-no-%-directive:
* src/domain_conf.c (virDomainHostdevSubsysUsbDefParseXML)
(virDomainDefParseString, virDomainDefParseFile):
* src/hash.c (virGetConnect, __virGetDomain, virReleaseDomain)
(__virGetNetwork, virReleaseNetwork, __virGetStoragePool)
(virReleaseStoragePool, __virGetStorageVol, virReleaseStorageVol):
* src/lxc_container.c (lxcContainerChild):
* src/lxc_driver.c (lxcDomainDefine, lxcDomainUndefine)
(lxcDomainGetInfo, lxcGetOSType, lxcDomainDumpXML)
(lxcSetupInterfaces, lxcDomainStart, lxcDomainCreateAndStart)
(lxcVersion, lxcGetSchedulerParameters):
* src/network_conf.c (virNetworkDefParseString)
(virNetworkDefParseFile):
* src/openvz_conf.c (openvzReadNetworkConf, openvzLoadDomains):
* src/openvz_driver.c (openvzDomainDefineCmd)
(openvzDomainGetInfo, openvzDomainDumpXML, openvzDomainShutdown)
(openvzDomainReboot, ADD_ARG_LIT, openvzDomainDefineXML)
(openvzDomainCreateXML, openvzDomainCreate, openvzDomainUndefine)
(openvzDomainSetAutostart, openvzDomainGetAutostart)
(openvzDomainSetVcpus):
* src/qemu_driver.c (qemudDomainBlockPeek, qemudDomainMemoryPeek):
* src/remote_internal.c (remoteDomainBlockPeek)
(remoteDomainMemoryPeek, remoteAuthPolkit):
* src/sexpr.c (sexpr_new, _string2sexpr):
* src/storage_backend_disk.c (virStorageBackendDiskMakeDataVol)
(virStorageBackendDiskCreateVol):
* src/storage_backend_fs.c
(virStorageBackendFileSystemNetFindPoolSources):
* src/storage_backend_logical.c (virStorageBackendLogicalFindLVs)
(virStorageBackendLogicalFindPoolSources):
* src/test.c (testOpenDefault, testOpenFromFile, testOpen)
(testGetDomainInfo, testDomainRestore)
(testNodeGetCellsFreeMemory):
* src/util.c (virExec):
* src/virsh.c (cmdAttachDevice, cmdDetachDevice)
(cmdAttachInterface, cmdDetachInterface, cmdAttachDisk)
(cmdDetachDisk, cmdEdit):
* src/xend_internal.c (do_connect, wr_sync, xend_op_ext)
(urlencode, xenDaemonDomainCreateXML)
(xenDaemonDomainLookupByName_ids, xenDaemonDomainLookupByID)
(xenDaemonParseSxprOS, xend_parse_sexp_desc_char)
(xenDaemonParseSxprChar, xenDaemonParseSxprDisks)
(xenDaemonParseSxpr, sexpr_to_xend_topology, sexpr_to_domain)
(xenDaemonDomainFetch, xenDaemonDomainGetAutostart)
(xenDaemonDomainSetAutostart, xenDaemonDomainMigratePerform)
(xenDaemonDomainDefineXML, xenDaemonGetSchedulerType)
(xenDaemonGetSchedulerParameters)
(xenDaemonSetSchedulerParameters, xenDaemonDomainBlockPeek)
(xenDaemonFormatSxprChr, virDomainXMLDevID):
* src/xm_internal.c (xenXMConfigCacheRefresh, xenXMDomainPinVcpu)
(xenXMDomainCreate, xenXMDomainDefineXML)
(xenXMDomainAttachDevice, xenXMDomainDetachDevice):
* src/xml.c (virXPathString, virXPathNumber, virXPathLong)
(virXPathULong, virXPathBoolean, virXPathNode, virXPathNodeSet):
* src/xs_internal.c (xenStoreOpen):
---
src/domain_conf.c | 8 +-
src/hash.c | 36 +++++-----
src/lxc_container.c | 2 +-
src/lxc_driver.c | 24 ++++----
src/network_conf.c | 4 +-
src/openvz_conf.c | 12 ++--
src/openvz_driver.c | 50 +++++++-------
src/qemu_driver.c | 8 +-
src/remote_internal.c | 6 +-
src/sexpr.c | 6 +-
src/storage_backend_disk.c | 20 +++---
src/storage_backend_fs.c | 2 +-
src/storage_backend_logical.c | 4 +-
src/test.c | 50 +++++++-------
src/util.c | 8 +-
src/virsh.c | 14 ++--
src/xend_internal.c | 142 ++++++++++++++++++++--------------------
src/xm_internal.c | 38 ++++++------
src/xml.c | 16 ++--
src/xs_internal.c | 2 +-
20 files changed, 226 insertions(+), 226 deletions(-)
diff --git a/src/domain_conf.c b/src/domain_conf.c
index f57fb2d..82140f8 100644
--- a/src/domain_conf.c
+++ b/src/domain_conf.c
@@ -1523,13 +1523,13 @@ virDomainHostdevSubsysUsbDefParseXML(virConnectPtr conn,
if (def->source.subsys.usb.vendor == 0 &&
def->source.subsys.usb.product != 0) {
virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
- _("missing vendor"));
+ "%s", _("missing vendor"));
goto out;
}
if (def->source.subsys.usb.vendor != 0 &&
def->source.subsys.usb.product == 0) {
virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
- _("missing product"));
+ "%s", _("missing product"));
goto out;
}
@@ -2243,7 +2243,7 @@ virDomainDefPtr virDomainDefParseString(virConnectPtr conn,
if (!xml) {
if (conn && conn->err.code == VIR_ERR_NONE)
virDomainReportError(conn, VIR_ERR_XML_ERROR,
- _("failed to parse xml document"));
+ "%s", _("failed to parse xml document"));
goto cleanup;
}
@@ -2284,7 +2284,7 @@ virDomainDefPtr virDomainDefParseFile(virConnectPtr conn,
if (!xml) {
if (conn && conn->err.code == VIR_ERR_NONE)
virDomainReportError(conn, VIR_ERR_XML_ERROR,
- _("failed to parse xml document"));
+ "%s", _("failed to parse xml document"));
goto cleanup;
}
diff --git a/src/hash.c b/src/hash.c
index 3efda2c..0a5bdcd 100644
--- a/src/hash.c
+++ b/src/hash.c
@@ -667,7 +667,7 @@ virGetConnect(void) {
virConnectPtr ret;
if (VIR_ALLOC(ret) < 0) {
- virHashError(NULL, VIR_ERR_NO_MEMORY, _("allocating connection"));
+ virHashError(NULL, VIR_ERR_NO_MEMORY, "%s", _("allocating connection"));
goto failed;
}
ret->magic = VIR_CONNECT_MAGIC;
@@ -801,12 +801,12 @@ __virGetDomain(virConnectPtr conn, const char *name, const unsigned char *uuid)
/* TODO check the UUID */
if (ret == NULL) {
if (VIR_ALLOC(ret) < 0) {
- virHashError(conn, VIR_ERR_NO_MEMORY, _("allocating domain"));
+ virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating domain"));
goto error;
}
ret->name = strdup(name);
if (ret->name == NULL) {
- virHashError(conn, VIR_ERR_NO_MEMORY, _("allocating domain"));
+ virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating domain"));
goto error;
}
ret->magic = VIR_DOMAIN_MAGIC;
@@ -817,7 +817,7 @@ __virGetDomain(virConnectPtr conn, const char *name, const unsigned char *uuid)
if (virHashAddEntry(conn->domains, name, ret) < 0) {
virHashError(conn, VIR_ERR_INTERNAL_ERROR,
- _("failed to add domain to connection hash table"));
+ "%s", _("failed to add domain to connection hash table"));
goto error;
}
conn->refs++;
@@ -858,7 +858,7 @@ virReleaseDomain(virDomainPtr domain) {
/* TODO search by UUID first as they are better differenciators */
if (virHashRemoveEntry(conn->domains, domain->name, NULL) < 0)
virHashError(conn, VIR_ERR_INTERNAL_ERROR,
- _("domain missing from connection hash table"));
+ "%s", _("domain missing from connection hash table"));
if (conn->err.dom == domain)
conn->err.dom = NULL;
@@ -941,12 +941,12 @@ __virGetNetwork(virConnectPtr conn, const char *name, const unsigned char *uuid)
/* TODO check the UUID */
if (ret == NULL) {
if (VIR_ALLOC(ret) < 0) {
- virHashError(conn, VIR_ERR_NO_MEMORY, _("allocating network"));
+ virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating network"));
goto error;
}
ret->name = strdup(name);
if (ret->name == NULL) {
- virHashError(conn, VIR_ERR_NO_MEMORY, _("allocating network"));
+ virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating network"));
goto error;
}
ret->magic = VIR_NETWORK_MAGIC;
@@ -956,7 +956,7 @@ __virGetNetwork(virConnectPtr conn, const char *name, const unsigned char *uuid)
if (virHashAddEntry(conn->networks, name, ret) < 0) {
virHashError(conn, VIR_ERR_INTERNAL_ERROR,
- _("failed to add network to connection hash table"));
+ "%s", _("failed to add network to connection hash table"));
goto error;
}
conn->refs++;
@@ -994,7 +994,7 @@ virReleaseNetwork(virNetworkPtr network) {
/* TODO search by UUID first as they are better differenciators */
if (virHashRemoveEntry(conn->networks, network->name, NULL) < 0)
virHashError(conn, VIR_ERR_INTERNAL_ERROR,
- _("network missing from connection hash table"));
+ "%s", _("network missing from connection hash table"));
if (conn->err.net == network)
conn->err.net = NULL;
@@ -1078,12 +1078,12 @@ __virGetStoragePool(virConnectPtr conn, const char *name, const unsigned char *u
/* TODO check the UUID */
if (ret == NULL) {
if (VIR_ALLOC(ret) < 0) {
- virHashError(conn, VIR_ERR_NO_MEMORY, _("allocating storage pool"));
+ virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating storage pool"));
goto error;
}
ret->name = strdup(name);
if (ret->name == NULL) {
- virHashError(conn, VIR_ERR_NO_MEMORY, _("allocating storage pool"));
+ virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating storage pool"));
goto error;
}
ret->magic = VIR_STORAGE_POOL_MAGIC;
@@ -1093,7 +1093,7 @@ __virGetStoragePool(virConnectPtr conn, const char *name, const unsigned char *u
if (virHashAddEntry(conn->storagePools, name, ret) < 0) {
virHashError(conn, VIR_ERR_INTERNAL_ERROR,
- _("failed to add storage pool to connection hash table"));
+ "%s", _("failed to add storage pool to connection hash table"));
goto error;
}
conn->refs++;
@@ -1132,7 +1132,7 @@ virReleaseStoragePool(virStoragePoolPtr pool) {
/* TODO search by UUID first as they are better differenciators */
if (virHashRemoveEntry(conn->storagePools, pool->name, NULL) < 0)
virHashError(conn, VIR_ERR_INTERNAL_ERROR,
- _("pool missing from connection hash table"));
+ "%s", _("pool missing from connection hash table"));
pool->magic = -1;
VIR_FREE(pool->name);
@@ -1209,17 +1209,17 @@ __virGetStorageVol(virConnectPtr conn, const char *pool, const char *name, const
ret = (virStorageVolPtr) virHashLookup(conn->storageVols, key);
if (ret == NULL) {
if (VIR_ALLOC(ret) < 0) {
- virHashError(conn, VIR_ERR_NO_MEMORY, _("allocating storage vol"));
+ virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating storage vol"));
goto error;
}
ret->pool = strdup(pool);
if (ret->pool == NULL) {
- virHashError(conn, VIR_ERR_NO_MEMORY, _("allocating storage vol"));
+ virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating storage vol"));
goto error;
}
ret->name = strdup(name);
if (ret->name == NULL) {
- virHashError(conn, VIR_ERR_NO_MEMORY, _("allocating storage vol"));
+ virHashError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocating storage vol"));
goto error;
}
strncpy(ret->key, key, sizeof(ret->key)-1);
@@ -1229,7 +1229,7 @@ __virGetStorageVol(virConnectPtr conn, const char *pool, const char *name, const
if (virHashAddEntry(conn->storageVols, key, ret) < 0) {
virHashError(conn, VIR_ERR_INTERNAL_ERROR,
- _("failed to add storage vol to connection hash table"));
+ "%s", _("failed to add storage vol to connection hash table"));
goto error;
}
conn->refs++;
@@ -1269,7 +1269,7 @@ virReleaseStorageVol(virStorageVolPtr vol) {
/* TODO search by UUID first as they are better differenciators */
if (virHashRemoveEntry(conn->storageVols, vol->key, NULL) < 0)
virHashError(conn, VIR_ERR_INTERNAL_ERROR,
- _("vol missing from connection hash table"));
+ "%s", _("vol missing from connection hash table"));
vol->magic = -1;
VIR_FREE(vol->name);
diff --git a/src/lxc_container.c b/src/lxc_container.c
index 379e0af..e94b2d5 100644
--- a/src/lxc_container.c
+++ b/src/lxc_container.c
@@ -547,7 +547,7 @@ static int lxcContainerChild( void *data )
if (NULL == vmDef) {
lxcError(NULL, NULL, VIR_ERR_INTERNAL_ERROR,
- _("lxcChild() passed invalid vm definition"));
+ "%s", _("lxcChild() passed invalid vm definition"));
return -1;
}
diff --git a/src/lxc_driver.c b/src/lxc_driver.c
index e5e1d6a..c598d1d 100644
--- a/src/lxc_driver.c
+++ b/src/lxc_driver.c
@@ -230,7 +230,7 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml)
if ((def->nets != NULL) && !(driver->have_netns)) {
lxcError(conn, NULL, VIR_ERR_NO_SUPPORT,
- _("System lacks NETNS support"));
+ "%s", _("System lacks NETNS support"));
virDomainDefFree(def);
return NULL;
}
@@ -263,13 +263,13 @@ static int lxcDomainUndefine(virDomainPtr dom)
if (!vm) {
lxcError(dom->conn, dom, VIR_ERR_INVALID_DOMAIN,
- _("no domain with matching uuid"));
+ "%s", _("no domain with matching uuid"));
return -1;
}
if (virDomainIsActive(vm)) {
lxcError(dom->conn, dom, VIR_ERR_INTERNAL_ERROR,
- _("cannot delete active domain"));
+ "%s", _("cannot delete active domain"));
return -1;
}
@@ -298,7 +298,7 @@ static int lxcDomainGetInfo(virDomainPtr dom,
if (!vm) {
lxcError(dom->conn, dom, VIR_ERR_INVALID_DOMAIN,
- _("no domain with matching uuid"));
+ "%s", _("no domain with matching uuid"));
return -1;
}
@@ -324,7 +324,7 @@ static char *lxcGetOSType(virDomainPtr dom)
if (!vm) {
lxcError(dom->conn, dom, VIR_ERR_INVALID_DOMAIN,
- _("no domain with matching uuid"));
+ "%s", _("no domain with matching uuid"));
return NULL;
}
@@ -339,7 +339,7 @@ static char *lxcDomainDumpXML(virDomainPtr dom,
if (!vm) {
lxcError(dom->conn, dom, VIR_ERR_INVALID_DOMAIN,
- _("no domain with matching uuid"));
+ "%s", _("no domain with matching uuid"));
return NULL;
}
@@ -458,7 +458,7 @@ static int lxcSetupInterfaces(virConnectPtr conn,
DEBUG("bridge: %s", bridge);
if (NULL == bridge) {
lxcError(conn, NULL, VIR_ERR_INTERNAL_ERROR,
- _("failed to get bridge for interface"));
+ "%s", _("failed to get bridge for interface"));
goto error_exit;
}
@@ -482,7 +482,7 @@ static int lxcSetupInterfaces(virConnectPtr conn,
if (NULL == def->nets[i]->ifname) {
lxcError(NULL, NULL, VIR_ERR_INTERNAL_ERROR,
- _("failed to allocate veth names"));
+ "%s", _("failed to allocate veth names"));
goto error_exit;
}
@@ -861,7 +861,7 @@ static int lxcDomainStart(virDomainPtr dom)
if ((vm->def->nets != NULL) && !(driver->have_netns)) {
lxcError(conn, NULL, VIR_ERR_NO_SUPPORT,
- _("System lacks NETNS support"));
+ "%s", _("System lacks NETNS support"));
goto cleanup;
}
@@ -896,7 +896,7 @@ lxcDomainCreateAndStart(virConnectPtr conn,
if ((def->nets != NULL) && !(driver->have_netns)) {
virDomainDefFree(def);
lxcError(conn, NULL, VIR_ERR_NO_SUPPORT,
- _("System lacks NETNS support"));
+ "%s", _("System lacks NETNS support"));
goto return_point;
}
@@ -1113,7 +1113,7 @@ static int lxcVersion(virConnectPtr conn, unsigned long *version)
if (uname(&ver) != 0) {
lxcError(conn, NULL, VIR_ERR_INTERNAL_ERROR,
- _("uname(): %m"));
+ _("uname(): %s"), strerror(errno));
return -1;
}
@@ -1193,7 +1193,7 @@ static int lxcGetSchedulerParameters(virDomainPtr _domain,
if ((*nparams) != 1) {
lxcError(NULL, _domain, VIR_ERR_INVALID_ARG,
- _("Invalid parameter count"));
+ "%s", _("Invalid parameter count"));
return -1;
}
diff --git a/src/network_conf.c b/src/network_conf.c
index 8107b39..4c32fa1 100644
--- a/src/network_conf.c
+++ b/src/network_conf.c
@@ -452,7 +452,7 @@ virNetworkDefPtr virNetworkDefParseString(virConnectPtr conn,
if (!xml) {
if (conn && conn->err.code == VIR_ERR_NONE)
virNetworkReportError(conn, VIR_ERR_XML_ERROR,
- _("failed to parse xml document"));
+ "%s", _("failed to parse xml document"));
goto cleanup;
}
@@ -492,7 +492,7 @@ virNetworkDefPtr virNetworkDefParseFile(virConnectPtr conn,
if (!xml) {
if (conn && conn->err.code == VIR_ERR_NONE)
virNetworkReportError(conn, VIR_ERR_XML_ERROR,
- _("failed to parse xml document"));
+ "%s", _("failed to parse xml document"));
goto cleanup;
}
diff --git a/src/openvz_conf.c b/src/openvz_conf.c
index a2553d0..afd18a6 100644
--- a/src/openvz_conf.c
+++ b/src/openvz_conf.c
@@ -222,7 +222,7 @@ openvzReadNetworkConf(virConnectPtr conn,
len = next - p;
if (len > 16) {
openvzError(conn, VIR_ERR_INTERNAL_ERROR,
- _("Too long network device name"));
+ "%s", _("Too long network device name"));
goto error;
}
@@ -239,14 +239,14 @@ openvzReadNetworkConf(virConnectPtr conn,
len = next - p;
if (len != 17) { //should be 17
openvzError(conn, VIR_ERR_INTERNAL_ERROR,
- _("Wrong length MAC address"));
+ "%s", _("Wrong length MAC address"));
goto error;
}
strncpy(cpy_temp, p, len);
cpy_temp[len] = '\0';
if (openvzParseMac(cpy_temp, net->mac)<0) {
openvzError(conn, VIR_ERR_INTERNAL_ERROR,
- _("Wrong MAC address"));
+ "%s", _("Wrong MAC address"));
goto error;
}
} else if (STRPREFIX(p, "host_mac=")) {
@@ -299,7 +299,7 @@ int openvzLoadDomains(struct openvz_driver *driver) {
return -1;
if ((fp = popen(VZLIST " -a -ovpsid,status -H 2>/dev/null", "r")) == NULL) {
- openvzError(NULL, VIR_ERR_INTERNAL_ERROR, _("popen failed"));
+ openvzError(NULL, VIR_ERR_INTERNAL_ERROR, "%s", _("popen failed"));
return -1;
}
@@ -309,7 +309,7 @@ int openvzLoadDomains(struct openvz_driver *driver) {
break;
openvzError(NULL, VIR_ERR_INTERNAL_ERROR,
- _("Failed to parse vzlist output"));
+ "%s", _("Failed to parse vzlist output"));
goto cleanup;
}
@@ -335,7 +335,7 @@ int openvzLoadDomains(struct openvz_driver *driver) {
if (ret == -1) {
openvzError(NULL, VIR_ERR_INTERNAL_ERROR,
- _("UUID in config file malformed"));
+ "%s", _("UUID in config file malformed"));
goto cleanup;
}
diff --git a/src/openvz_driver.c b/src/openvz_driver.c
index e3e3cc7..b82d0df 100644
--- a/src/openvz_driver.c
+++ b/src/openvz_driver.c
@@ -92,7 +92,7 @@ static int openvzDomainDefineCmd(virConnectPtr conn,
if (vmdef == NULL){
openvzError(conn, VIR_ERR_INTERNAL_ERROR,
- _("Container is not defined"));
+ "%s", _("Container is not defined"));
return -1;
}
@@ -235,7 +235,7 @@ static int openvzDomainGetInfo(virDomainPtr dom,
if (!vm) {
openvzError(dom->conn, VIR_ERR_INVALID_DOMAIN,
- _("no domain with matching uuid"));
+ "%s", _("no domain with matching uuid"));
return -1;
}
@@ -264,7 +264,7 @@ static char *openvzDomainDumpXML(virDomainPtr dom, int flags) {
if (!vm) {
openvzError(dom->conn, VIR_ERR_INVALID_DOMAIN,
- _("no domain with matching uuid"));
+ "%s", _("no domain with matching uuid"));
return NULL;
}
@@ -280,13 +280,13 @@ static int openvzDomainShutdown(virDomainPtr dom) {
if (!vm) {
openvzError(dom->conn, VIR_ERR_INVALID_DOMAIN,
- _("no domain with matching uuid"));
+ "%s", _("no domain with matching uuid"));
return -1;
}
if (vm->state != VIR_DOMAIN_RUNNING) {
openvzError(dom->conn, VIR_ERR_INTERNAL_ERROR,
- _("domain is not in running state"));
+ "%s", _("domain is not in running state"));
return -1;
}
@@ -307,13 +307,13 @@ static int openvzDomainReboot(virDomainPtr dom,
if (!vm) {
openvzError(dom->conn, VIR_ERR_INVALID_DOMAIN,
- _("no domain with matching uuid"));
+ "%s", _("no domain with matching uuid"));
return -1;
}
if (vm->state != VIR_DOMAIN_RUNNING) {
openvzError(dom->conn, VIR_ERR_INTERNAL_ERROR,
- _("domain is not in running state"));
+ "%s", _("domain is not in running state"));
return -1;
}
@@ -344,7 +344,7 @@ openvzDomainSetNetwork(virConnectPtr conn, const char *vpsid,
return 0;
if (vpsid == NULL) {
openvzError(conn, VIR_ERR_INTERNAL_ERROR,
- _("Container ID is not specified"));
+ "%s", _("Container ID is not specified"));
return -1;
}
@@ -444,7 +444,7 @@ openvzDomainDefineXML(virConnectPtr conn, const char *xml)
if (openvzDomainDefineCmd(conn, prog, OPENVZ_MAX_ARG, vmdef) < 0) {
openvzError(conn, VIR_ERR_INTERNAL_ERROR,
- _("Error creating command for container"));
+ "%s", _("Error creating command for container"));
goto exit;
}
@@ -458,7 +458,7 @@ openvzDomainDefineXML(virConnectPtr conn, const char *xml)
if (openvzSetDefinedUUID(strtoI(vmdef->name), vmdef->uuid) < 0) {
openvzError(conn, VIR_ERR_INTERNAL_ERROR,
- _("Could not set UUID"));
+ "%s", _("Could not set UUID"));
goto exit;
}
@@ -469,7 +469,7 @@ openvzDomainDefineXML(virConnectPtr conn, const char *xml)
for (i = 0 ; i < vmdef->nnets ; i++) {
if (openvzDomainSetNetwork(conn, vmdef->name, vmdef->nets[i]) < 0) {
openvzError(conn, VIR_ERR_INTERNAL_ERROR,
- _("Could not configure network"));
+ "%s", _("Could not configure network"));
goto exit;
}
}
@@ -477,7 +477,7 @@ openvzDomainDefineXML(virConnectPtr conn, const char *xml)
if (vmdef->vcpus > 0) {
if (openvzDomainSetVcpus(dom, vmdef->vcpus) < 0) {
openvzError(conn, VIR_ERR_INTERNAL_ERROR,
- _("Could not set number of virtual cpu"));
+ "%s", _("Could not set number of virtual cpu"));
goto exit;
}
}
@@ -524,7 +524,7 @@ openvzDomainCreateXML(virConnectPtr conn, const char *xml,
if (openvzDomainDefineCmd(conn, progcreate, OPENVZ_MAX_ARG, vmdef) < 0) {
openvzError(conn, VIR_ERR_INTERNAL_ERROR,
- _("Error creating command for container"));
+ "%s", _("Error creating command for container"));
goto exit;
}
@@ -536,14 +536,14 @@ openvzDomainCreateXML(virConnectPtr conn, const char *xml,
if (openvzSetDefinedUUID(strtoI(vmdef->name), vmdef->uuid) < 0) {
openvzError(conn, VIR_ERR_INTERNAL_ERROR,
- _("Could not set UUID"));
+ "%s", _("Could not set UUID"));
goto exit;
}
for (i = 0 ; i < vmdef->nnets ; i++) {
if (openvzDomainSetNetwork(conn, vmdef->name, vmdef->nets[i]) < 0) {
openvzError(conn, VIR_ERR_INTERNAL_ERROR,
- _("Could not configure network"));
+ "%s", _("Could not configure network"));
goto exit;
}
}
@@ -567,7 +567,7 @@ openvzDomainCreateXML(virConnectPtr conn, const char *xml,
if (vmdef->vcpus > 0) {
if (openvzDomainSetVcpus(dom, vmdef->vcpus) < 0) {
openvzError(conn, VIR_ERR_INTERNAL_ERROR,
- _("Could not set number of virtual cpu"));
+ "%s", _("Could not set number of virtual cpu"));
goto exit;
}
}
@@ -586,13 +586,13 @@ openvzDomainCreate(virDomainPtr dom)
if (!vm) {
openvzError(dom->conn, VIR_ERR_INVALID_DOMAIN,
- _("no domain with matching id"));
+ "%s", _("no domain with matching id"));
return -1;
}
if (vm->state != VIR_DOMAIN_SHUTOFF) {
openvzError(dom->conn, VIR_ERR_OPERATION_DENIED,
- _("domain is not in shutoff state"));
+ "%s", _("domain is not in shutoff state"));
return -1;
}
@@ -618,12 +618,12 @@ openvzDomainUndefine(virDomainPtr dom)
const char *prog[] = { VZCTL, "--quiet", "destroy", vm ? vm->def->name : NULL, NULL };
if (!vm) {
- openvzError(conn, VIR_ERR_INVALID_DOMAIN, _("no domain with matching uuid"));
+ openvzError(conn, VIR_ERR_INVALID_DOMAIN, "%s", _("no domain with matching uuid"));
return -1;
}
if (virDomainIsActive(vm)) {
- openvzError(conn, VIR_ERR_INTERNAL_ERROR, _("cannot delete active domain"));
+ openvzError(conn, VIR_ERR_INTERNAL_ERROR, "%s", _("cannot delete active domain"));
return -1;
}
@@ -649,7 +649,7 @@ openvzDomainSetAutostart(virDomainPtr dom, int autostart)
"--save", NULL };
if (!vm) {
- openvzError(conn, VIR_ERR_INVALID_DOMAIN, _("no domain with matching uuid"));
+ openvzError(conn, VIR_ERR_INVALID_DOMAIN, "%s", _("no domain with matching uuid"));
return -1;
}
@@ -670,12 +670,12 @@ openvzDomainGetAutostart(virDomainPtr dom, int *autostart)
char value[1024];
if (!vm) {
- openvzError(conn, VIR_ERR_INVALID_DOMAIN, _("no domain with matching uuid"));
+ openvzError(conn, VIR_ERR_INVALID_DOMAIN, "%s", _("no domain with matching uuid"));
return -1;
}
if (openvzReadConfigParam(strtoI(vm->def->name), "ONBOOT", value, sizeof(value)) < 0) {
- openvzError(conn, VIR_ERR_INTERNAL_ERROR, _("Could not read container config"));
+ openvzError(conn, VIR_ERR_INTERNAL_ERROR, "%s", _("Could not read container config"));
return -1;
}
@@ -711,13 +711,13 @@ static int openvzDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus) {
if (!vm) {
openvzError(conn, VIR_ERR_INVALID_DOMAIN,
- _("no domain with matching uuid"));
+ "%s", _("no domain with matching uuid"));
return -1;
}
if (nvcpus <= 0) {
openvzError(conn, VIR_ERR_INTERNAL_ERROR,
- _("VCPUs should be >= 1"));
+ "%s", _("VCPUs should be >= 1"));
return -1;
}
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
index 689c992..624c8d8 100644
--- a/src/qemu_driver.c
+++ b/src/qemu_driver.c
@@ -2941,13 +2941,13 @@ qemudDomainBlockPeek (virDomainPtr dom,
if (!vm) {
qemudReportError (dom->conn, dom, NULL, VIR_ERR_INVALID_DOMAIN,
- _("no domain with matching uuid"));
+ "%s", _("no domain with matching uuid"));
return -1;
}
if (!path || path[0] == '\0') {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_INVALID_ARG,
- _("NULL or empty path"));
+ "%s", _("NULL or empty path"));
return -1;
}
@@ -2958,7 +2958,7 @@ qemudDomainBlockPeek (virDomainPtr dom,
goto found;
}
qemudReportError (dom->conn, dom, NULL, VIR_ERR_INVALID_ARG,
- _("invalid path"));
+ "%s", _("invalid path"));
return -1;
found:
@@ -3001,7 +3001,7 @@ qemudDomainMemoryPeek (virDomainPtr dom,
if (flags != VIR_MEMORY_VIRTUAL) {
qemudReportError (dom->conn, dom, NULL, VIR_ERR_INVALID_ARG,
- _("QEMU driver only supports virtual memory addrs"));
+ "%s", _("QEMU driver only supports virtual memory addrs"));
return -1;
}
diff --git a/src/remote_internal.c b/src/remote_internal.c
index 2f3a261..35b7b4b 100644
--- a/src/remote_internal.c
+++ b/src/remote_internal.c
@@ -2364,7 +2364,7 @@ remoteDomainBlockPeek (virDomainPtr domain,
if (ret.buffer.buffer_len != size) {
errorf (domain->conn, VIR_ERR_RPC,
- _("returned buffer is not same size as requested"));
+ "%s", _("returned buffer is not same size as requested"));
free (ret.buffer.buffer_val);
return -1;
}
@@ -2408,7 +2408,7 @@ remoteDomainMemoryPeek (virDomainPtr domain,
if (ret.buffer.buffer_len != size) {
errorf (domain->conn, VIR_ERR_RPC,
- _("returned buffer is not same size as requested"));
+ "%s", _("returned buffer is not same size as requested"));
free (ret.buffer.buffer_val);
return -1;
}
@@ -4267,7 +4267,7 @@ remoteAuthPolkit (virConnectPtr conn, struct private_data *priv, int in_open,
if ((*(auth->cb))(&cred, 1, auth->cbdata) < 0) {
__virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
VIR_ERR_AUTH_FAILED, VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
- _("Failed to collect auth credentials"));
+ "%s", _("Failed to collect auth credentials"));
return -1;
}
} else {
diff --git a/src/sexpr.c b/src/sexpr.c
index c168754..355c5a6 100644
--- a/src/sexpr.c
+++ b/src/sexpr.c
@@ -40,7 +40,7 @@ sexpr_new(void)
struct sexpr *ret;
if (VIR_ALLOC(ret) < 0) {
- virSexprError(VIR_ERR_NO_MEMORY, _("failed to allocate a node"));
+ virSexprError(VIR_ERR_NO_MEMORY, "%s", _("failed to allocate a node"));
return (NULL);
}
ret->kind = SEXPR_NIL;
@@ -344,7 +344,7 @@ _string2sexpr(const char *buffer, size_t * end)
ret->u.value = strndup(start, ptr - start);
if (ret->u.value == NULL) {
virSexprError(VIR_ERR_NO_MEMORY,
- _("failed to copy a string"));
+ "%s", _("failed to copy a string"));
goto error;
}
@@ -361,7 +361,7 @@ _string2sexpr(const char *buffer, size_t * end)
ret->u.value = strndup(start, ptr - start);
if (ret->u.value == NULL) {
virSexprError(VIR_ERR_NO_MEMORY,
- _("failed to copy a string"));
+ "%s", _("failed to copy a string"));
goto error;
}
}
diff --git a/src/storage_backend_disk.c b/src/storage_backend_disk.c
index bb134c7..729cbef 100644
--- a/src/storage_backend_disk.c
+++ b/src/storage_backend_disk.c
@@ -178,13 +178,13 @@ virStorageBackendDiskMakeDataVol(virConnectPtr conn,
if (vol == NULL) {
if (VIR_ALLOC(vol) < 0) {
- virStorageReportError(conn, VIR_ERR_NO_MEMORY, _("volume"));
+ virStorageReportError(conn, VIR_ERR_NO_MEMORY, "%s", _("volume"));
return -1;
}
if (VIR_REALLOC_N(pool->volumes.objs,
pool->volumes.count+1) < 0) {
- virStorageReportError(conn, VIR_ERR_NO_MEMORY, _("volume"));
+ virStorageReportError(conn, VIR_ERR_NO_MEMORY, "%s", _("volume"));
virStorageVolDefFree(vol);
return -1;
}
@@ -195,14 +195,14 @@ virStorageBackendDiskMakeDataVol(virConnectPtr conn,
*/
tmp = strrchr(groups[0], '/');
if ((vol->name = strdup(tmp ? tmp + 1 : groups[0])) == NULL) {
- virStorageReportError(conn, VIR_ERR_NO_MEMORY, _("volume"));
+ virStorageReportError(conn, VIR_ERR_NO_MEMORY, "%s", _("volume"));
return -1;
}
}
if (vol->target.path == NULL) {
if ((devpath = strdup(groups[0])) == NULL) {
- virStorageReportError(conn, VIR_ERR_NO_MEMORY, _("volume"));
+ virStorageReportError(conn, VIR_ERR_NO_MEMORY, "%s", _("volume"));
return -1;
}
@@ -224,7 +224,7 @@ virStorageBackendDiskMakeDataVol(virConnectPtr conn,
if (vol->key == NULL) {
/* XXX base off a unique key of the underlying disk */
if ((vol->key = strdup(vol->target.path)) == NULL) {
- virStorageReportError(conn, VIR_ERR_NO_MEMORY, _("volume"));
+ virStorageReportError(conn, VIR_ERR_NO_MEMORY, "%s", _("volume"));
return -1;
}
}
@@ -232,7 +232,7 @@ virStorageBackendDiskMakeDataVol(virConnectPtr conn,
if (vol->source.extents == NULL) {
if (VIR_ALLOC(vol->source.extents) < 0) {
virStorageReportError(conn, VIR_ERR_NO_MEMORY,
- _("volume extents"));
+ "%s", _("volume extents"));
return -1;
}
vol->source.nextent = 1;
@@ -240,20 +240,20 @@ virStorageBackendDiskMakeDataVol(virConnectPtr conn,
if (virStrToLong_ull(groups[3], NULL, 10,
&vol->source.extents[0].start) < 0) {
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
- _("cannot parse device start location"));
+ "%s", _("cannot parse device start location"));
return -1;
}
if (virStrToLong_ull(groups[4], NULL, 10,
&vol->source.extents[0].end) < 0) {
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
- _("cannot parse device end location"));
+ "%s", _("cannot parse device end location"));
return -1;
}
if ((vol->source.extents[0].path =
strdup(pool->def->source.devices[0].path)) == NULL) {
- virStorageReportError(conn, VIR_ERR_NO_MEMORY, _("extents"));
+ virStorageReportError(conn, VIR_ERR_NO_MEMORY, "%s", _("extents"));
return -1;
}
}
@@ -460,7 +460,7 @@ virStorageBackendDiskCreateVol(virConnectPtr conn,
}
if (smallestExtent == -1) {
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
- _("no large enough free extent"));
+ "%s", _("no large enough free extent"));
return -1;
}
startOffset = dev->freeExtents[smallestExtent].start;
diff --git a/src/storage_backend_fs.c b/src/storage_backend_fs.c
index d3f4196..329505f 100644
--- a/src/storage_backend_fs.c
+++ b/src/storage_backend_fs.c
@@ -556,7 +556,7 @@ virStorageBackendFileSystemNetFindPoolSources(virConnectPtr conn,
retval = virStringListJoin(state.list, SOURCES_START_TAG, SOURCES_END_TAG, "\n");
if (retval == NULL) {
- virStorageReportError(conn, VIR_ERR_NO_MEMORY, _("retval"));
+ virStorageReportError(conn, VIR_ERR_NO_MEMORY, "%s", _("retval"));
goto cleanup;
}
diff --git a/src/storage_backend_logical.c b/src/storage_backend_logical.c
index c549f26..e7ec6b4 100644
--- a/src/storage_backend_logical.c
+++ b/src/storage_backend_logical.c
@@ -233,7 +233,7 @@ virStorageBackendLogicalFindLVs(virConnectPtr conn,
vol,
&exitstatus) < 0) {
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
- _("lvs command failed"));
+ "%s", _("lvs command failed"));
return -1;
}
@@ -321,7 +321,7 @@ virStorageBackendLogicalFindPoolSources(virConnectPtr conn,
retval = virStringListJoin(descs, SOURCES_START_TAG, SOURCES_END_TAG, "\n");
if (retval == NULL) {
- virStorageReportError(conn, VIR_ERR_NO_MEMORY, _("retval"));
+ virStorageReportError(conn, VIR_ERR_NO_MEMORY, "%s", _("retval"));
goto cleanup;
}
diff --git a/src/test.c b/src/test.c
index 58d3559..aab74e4 100644
--- a/src/test.c
+++ b/src/test.c
@@ -213,7 +213,7 @@ static int testOpenDefault(virConnectPtr conn) {
conn->privateData = privconn;
if (gettimeofday(&tv, NULL) < 0) {
- testError(NULL, VIR_ERR_INTERNAL_ERROR, _("getting time of day"));
+ testError(NULL, VIR_ERR_INTERNAL_ERROR, "%s", _("getting time of day"));
goto error;
}
@@ -311,14 +311,14 @@ static int testOpenFromFile(virConnectPtr conn,
goto error;
if ((fd = open(file, O_RDONLY)) < 0) {
- testError(NULL, VIR_ERR_INTERNAL_ERROR, _("loading host definition file"));
+ testError(NULL, VIR_ERR_INTERNAL_ERROR, "%s", _("loading host definition file"));
goto error;
}
if (!(xml = xmlReadFd(fd, file, NULL,
XML_PARSE_NOENT | XML_PARSE_NONET |
XML_PARSE_NOERROR | XML_PARSE_NOWARNING))) {
- testError(NULL, VIR_ERR_INTERNAL_ERROR, _("host"));
+ testError(NULL, VIR_ERR_INTERNAL_ERROR, "%s", _("host"));
goto error;
}
close(fd);
@@ -326,13 +326,13 @@ static int testOpenFromFile(virConnectPtr conn,
root = xmlDocGetRootElement(xml);
if ((root == NULL) || (!xmlStrEqual(root->name, BAD_CAST "node"))) {
- testError(NULL, VIR_ERR_XML_ERROR, _("node"));
+ testError(NULL, VIR_ERR_XML_ERROR, "%s", _("node"));
goto error;
}
ctxt = xmlXPathNewContext(xml);
if (ctxt == NULL) {
- testError(NULL, VIR_ERR_INTERNAL_ERROR, _("creating xpath context"));
+ testError(NULL, VIR_ERR_INTERNAL_ERROR, "%s", _("creating xpath context"));
goto error;
}
@@ -347,7 +347,7 @@ static int testOpenFromFile(virConnectPtr conn,
if (ret == 0) {
nodeInfo->nodes = l;
} else if (ret == -2) {
- testError(NULL, VIR_ERR_XML_ERROR, _("node cpu numa nodes"));
+ testError(NULL, VIR_ERR_XML_ERROR, "%s", _("node cpu numa nodes"));
goto error;
}
@@ -355,7 +355,7 @@ static int testOpenFromFile(virConnectPtr conn,
if (ret == 0) {
nodeInfo->sockets = l;
} else if (ret == -2) {
- testError(NULL, VIR_ERR_XML_ERROR, _("node cpu sockets"));
+ testError(NULL, VIR_ERR_XML_ERROR, "%s", _("node cpu sockets"));
goto error;
}
@@ -363,7 +363,7 @@ static int testOpenFromFile(virConnectPtr conn,
if (ret == 0) {
nodeInfo->cores = l;
} else if (ret == -2) {
- testError(NULL, VIR_ERR_XML_ERROR, _("node cpu cores"));
+ testError(NULL, VIR_ERR_XML_ERROR, "%s", _("node cpu cores"));
goto error;
}
@@ -371,7 +371,7 @@ static int testOpenFromFile(virConnectPtr conn,
if (ret == 0) {
nodeInfo->threads = l;
} else if (ret == -2) {
- testError(NULL, VIR_ERR_XML_ERROR, _("node cpu threads"));
+ testError(NULL, VIR_ERR_XML_ERROR, "%s", _("node cpu threads"));
goto error;
}
@@ -382,14 +382,14 @@ static int testOpenFromFile(virConnectPtr conn,
nodeInfo->cpus = l;
}
} else if (ret == -2) {
- testError(NULL, VIR_ERR_XML_ERROR, _("node active cpu"));
+ testError(NULL, VIR_ERR_XML_ERROR, "%s", _("node active cpu"));
goto error;
}
ret = virXPathLong(conn, "string(/node/cpu/mhz[1])", ctxt, &l);
if (ret == 0) {
nodeInfo->mhz = l;
} else if (ret == -2) {
- testError(NULL, VIR_ERR_XML_ERROR, _("node cpu mhz"));
+ testError(NULL, VIR_ERR_XML_ERROR, "%s", _("node cpu mhz"));
goto error;
}
@@ -404,13 +404,13 @@ static int testOpenFromFile(virConnectPtr conn,
if (ret == 0) {
nodeInfo->memory = l;
} else if (ret == -2) {
- testError(NULL, VIR_ERR_XML_ERROR, _("node memory"));
+ testError(NULL, VIR_ERR_XML_ERROR, "%s", _("node memory"));
goto error;
}
ret = virXPathNodeSet(conn, "/node/domain", ctxt, &domains);
if (ret < 0) {
- testError(NULL, VIR_ERR_XML_ERROR, _("node domain list"));
+ testError(NULL, VIR_ERR_XML_ERROR, "%s", _("node domain list"));
goto error;
}
@@ -421,7 +421,7 @@ static int testOpenFromFile(virConnectPtr conn,
char *absFile = testBuildFilename(file, relFile);
VIR_FREE(relFile);
if (!absFile) {
- testError(NULL, VIR_ERR_INTERNAL_ERROR, _("resolving domain filename"));
+ testError(NULL, VIR_ERR_INTERNAL_ERROR, "%s", _("resolving domain filename"));
goto error;
}
def = virDomainDefParseFile(conn, privconn->caps, absFile);
@@ -447,7 +447,7 @@ static int testOpenFromFile(virConnectPtr conn,
ret = virXPathNodeSet(conn, "/node/network", ctxt, &networks);
if (ret < 0) {
- testError(NULL, VIR_ERR_XML_ERROR, _("node network list"));
+ testError(NULL, VIR_ERR_XML_ERROR, "%s", _("node network list"));
goto error;
}
for (i = 0 ; i < ret ; i++) {
@@ -457,7 +457,7 @@ static int testOpenFromFile(virConnectPtr conn,
char *absFile = testBuildFilename(file, relFile);
VIR_FREE(relFile);
if (!absFile) {
- testError(NULL, VIR_ERR_INTERNAL_ERROR, _("resolving network filename"));
+ testError(NULL, VIR_ERR_INTERNAL_ERROR, "%s", _("resolving network filename"));
goto error;
}
@@ -525,7 +525,7 @@ static int testOpen(virConnectPtr conn,
|| uri->path[0] == '\0'
|| (uri->path[0] == '/' && uri->path[1] == '\0')) {
testError (NULL, VIR_ERR_INVALID_ARG,
- _("testOpen: supply a path or use test:///default"));
+ "%s", _("testOpen: supply a path or use test:///default"));
return VIR_DRV_OPEN_ERROR;
}
@@ -837,7 +837,7 @@ static int testGetDomainInfo (virDomainPtr domain,
if (gettimeofday(&tv, NULL) < 0) {
testError(domain->conn, VIR_ERR_INTERNAL_ERROR,
- _("getting time of day"));
+ "%s", _("getting time of day"));
return (-1);
}
@@ -925,30 +925,30 @@ static int testDomainRestore(virConnectPtr conn,
if ((fd = open(path, O_RDONLY)) < 0) {
testError(conn, VIR_ERR_INTERNAL_ERROR,
- _("cannot read domain image"));
+ "%s", _("cannot read domain image"));
return (-1);
}
if (read(fd, magic, sizeof(magic)) != sizeof(magic)) {
testError(conn, VIR_ERR_INTERNAL_ERROR,
- _("incomplete save header"));
+ "%s", _("incomplete save header"));
close(fd);
return (-1);
}
if (memcmp(magic, TEST_SAVE_MAGIC, sizeof(magic))) {
testError(conn, VIR_ERR_INTERNAL_ERROR,
- _("mismatched header magic"));
+ "%s", _("mismatched header magic"));
close(fd);
return (-1);
}
if (read(fd, (char*)&len, sizeof(len)) != sizeof(len)) {
testError(conn, VIR_ERR_INTERNAL_ERROR,
- _("failed to read metadata length"));
+ "%s", _("failed to read metadata length"));
close(fd);
return (-1);
}
if (len < 1 || len > 8192) {
testError(conn, VIR_ERR_INTERNAL_ERROR,
- _("length of metadata out of range"));
+ "%s", _("length of metadata out of range"));
close(fd);
return (-1);
}
@@ -959,7 +959,7 @@ static int testDomainRestore(virConnectPtr conn,
}
if (read(fd, xml, len) != len) {
testError(conn, VIR_ERR_INTERNAL_ERROR,
- _("incomplete metdata"));
+ "%s", _("incomplete metdata"));
close(fd);
return (-1);
}
@@ -1147,7 +1147,7 @@ static int testNodeGetCellsFreeMemory(virConnectPtr conn,
if (startCell > privconn->numCells) {
testError(conn, VIR_ERR_INVALID_ARG,
- _("Range exceeds available cells"));
+ "%s", _("Range exceeds available cells"));
return -1;
}
diff --git a/src/util.c b/src/util.c
index 915e738..aa21653 100644
--- a/src/util.c
+++ b/src/util.c
@@ -155,13 +155,13 @@ virExec(virConnectPtr conn,
if ((flags & VIR_EXEC_NONBLOCK) &&
virSetNonBlock(pipeout[0]) == -1) {
ReportError(conn, VIR_ERR_INTERNAL_ERROR,
- _("Failed to set non-blocking file descriptor flag"));
+ "%s", _("Failed to set non-blocking file descriptor flag"));
goto cleanup;
}
if (virSetCloseExec(pipeout[0]) == -1) {
ReportError(conn, VIR_ERR_INTERNAL_ERROR,
- _("Failed to set close-on-exec file descriptor flag"));
+ "%s", _("Failed to set close-on-exec file descriptor flag"));
goto cleanup;
}
@@ -186,13 +186,13 @@ virExec(virConnectPtr conn,
if ((flags & VIR_EXEC_NONBLOCK) &&
virSetNonBlock(pipeerr[0]) == -1) {
ReportError(conn, VIR_ERR_INTERNAL_ERROR,
- _("Failed to set non-blocking file descriptor flag"));
+ "%s", _("Failed to set non-blocking file descriptor flag"));
goto cleanup;
}
if (virSetCloseExec(pipeerr[0]) == -1) {
ReportError(conn, VIR_ERR_INTERNAL_ERROR,
- _("Failed to set close-on-exec file descriptor flag"));
+ "%s", _("Failed to set close-on-exec file descriptor flag"));
goto cleanup;
}
diff --git a/src/virsh.c b/src/virsh.c
index 2dd7dd2..89aa4fa 100644
--- a/src/virsh.c
+++ b/src/virsh.c
@@ -4660,7 +4660,7 @@ cmdAttachDevice(vshControl *ctl, const vshCmd *cmd)
virDomainFree(dom);
return FALSE;
} else {
- vshPrint(ctl, _("Device attached successfully\n"));
+ vshPrint(ctl, "%s", _("Device attached successfully\n"));
}
virDomainFree(dom);
@@ -4719,7 +4719,7 @@ cmdDetachDevice(vshControl *ctl, const vshCmd *cmd)
virDomainFree(dom);
return FALSE;
} else {
- vshPrint(ctl, _("Device detached successfully\n"));
+ vshPrint(ctl, "%s", _("Device detached successfully\n"));
}
virDomainFree(dom);
@@ -4831,7 +4831,7 @@ cmdAttachInterface(vshControl *ctl, const vshCmd *cmd)
if (virDomainAttachDevice(dom, buf)) {
goto cleanup;
} else {
- vshPrint(ctl, _("Interface attached successfully\n"));
+ vshPrint(ctl, "%s", _("Interface attached successfully\n"));
}
ret = TRUE;
@@ -4949,7 +4949,7 @@ cmdDetachInterface(vshControl *ctl, const vshCmd *cmd)
if (ret != 0)
ret = FALSE;
else {
- vshPrint(ctl, _("Interface detached successfully\n"));
+ vshPrint(ctl, "%s", _("Interface detached successfully\n"));
ret = TRUE;
}
@@ -5118,7 +5118,7 @@ cmdAttachDisk(vshControl *ctl, const vshCmd *cmd)
if (virDomainAttachDevice(dom, buf))
goto cleanup;
else
- vshPrint(ctl, _("Disk attached successfully\n"));
+ vshPrint(ctl, "%s", _("Disk attached successfully\n"));
ret = TRUE;
@@ -5227,7 +5227,7 @@ cmdDetachDisk(vshControl *ctl, const vshCmd *cmd)
if (ret != 0)
ret = FALSE;
else {
- vshPrint(ctl, _("Disk detached successfully\n"));
+ vshPrint(ctl, "%s", _("Disk detached successfully\n"));
ret = TRUE;
}
@@ -5433,7 +5433,7 @@ cmdEdit (vshControl *ctl, const vshCmd *cmd)
if (STRNEQ (doc, doc_reread)) {
vshError (ctl, FALSE,
- _("ERROR: the XML configuration was changed by another user"));
+ "%s", _("ERROR: the XML configuration was changed by another user"));
goto cleanup;
}
diff --git a/src/xend_internal.c b/src/xend_internal.c
index 65564d8..eb67235 100644
--- a/src/xend_internal.c
+++ b/src/xend_internal.c
@@ -130,7 +130,7 @@ do_connect(virConnectPtr xend)
s = socket(priv->type, SOCK_STREAM, 0);
if (s == -1) {
virXendError(xend, VIR_ERR_INTERNAL_ERROR,
- _("failed to create a socket"));
+ "%s", _("failed to create a socket"));
return -1;
}
@@ -152,7 +152,7 @@ do_connect(virConnectPtr xend)
*/
if (getuid() == 0) {
virXendError(xend, VIR_ERR_INTERNAL_ERROR,
- _("failed to connect to xend"));
+ "%s", _("failed to connect to xend"));
}
}
@@ -199,10 +199,10 @@ wr_sync(virConnectPtr xend, int fd, void *buffer, size_t size, int do_read)
if (len == -1) {
if (do_read)
virXendError(xend, VIR_ERR_INTERNAL_ERROR,
- _("failed to read from Xen Daemon"));
+ "%s", _("failed to read from Xen Daemon"));
else
virXendError(xend, VIR_ERR_INTERNAL_ERROR,
- _("failed to read from Xen Daemon"));
+ "%s", _("failed to read from Xen Daemon"));
return (-1);
}
@@ -529,7 +529,7 @@ xend_op_ext(virConnectPtr xend, const char *path, char *error,
}
if (virBufferError(&buf)) {
- virXendError(NULL, VIR_ERR_NO_MEMORY, _("allocate buffer"));
+ virXendError(NULL, VIR_ERR_NO_MEMORY, "%s", _("allocate buffer"));
return -1;
}
@@ -709,7 +709,7 @@ urlencode(const char *string)
size_t i;
if (VIR_ALLOC_N(buffer, len * 3 + 1) < 0) {
- virXendError(NULL, VIR_ERR_NO_MEMORY, _("allocate new buffer"));
+ virXendError(NULL, VIR_ERR_NO_MEMORY, "%s", _("allocate new buffer"));
return (NULL);
}
ptr = buffer;
@@ -963,7 +963,7 @@ xenDaemonDomainCreateXML(virConnectPtr xend, const char *sexpr)
if (ptr == NULL) {
/* this should be caught at the interface but ... */
virXendError(xend, VIR_ERR_INTERNAL_ERROR,
- _("failed to urlencode the create S-Expr"));
+ "%s", _("failed to urlencode the create S-Expr"));
return (-1);
}
@@ -1004,18 +1004,18 @@ xenDaemonDomainLookupByName_ids(virConnectPtr xend, const char *domname,
value = sexpr_node(root, "domain/domid");
if (value == NULL) {
virXendError(xend, VIR_ERR_INTERNAL_ERROR,
- _("domain information incomplete, missing domid"));
+ "%s", _("domain information incomplete, missing domid"));
goto error;
}
ret = strtol(value, NULL, 0);
if ((ret == 0) && (value[0] != '0')) {
virXendError(xend, VIR_ERR_INTERNAL_ERROR,
- _("domain information incorrect domid not numeric"));
+ "%s", _("domain information incorrect domid not numeric"));
ret = -1;
} else if (uuid != NULL) {
if (sexpr_uuid(uuid, root, "domain/uuid") < 0) {
virXendError(xend, VIR_ERR_INTERNAL_ERROR,
- _("domain information incomplete, missing uuid"));
+ "%s", _("domain information incomplete, missing uuid"));
}
}
@@ -1054,7 +1054,7 @@ xenDaemonDomainLookupByID(virConnectPtr xend,
name = sexpr_node(root, "domain/name");
if (name == NULL) {
virXendError(xend, VIR_ERR_INTERNAL_ERROR,
- _("domain information incomplete, missing name"));
+ "%s", _("domain information incomplete, missing name"));
goto error;
}
if (domname)
@@ -1062,7 +1062,7 @@ xenDaemonDomainLookupByID(virConnectPtr xend,
if (sexpr_uuid(uuid, root, "domain/uuid") < 0) {
virXendError(xend, VIR_ERR_INTERNAL_ERROR,
- _("domain information incomplete, missing uuid"));
+ "%s", _("domain information incomplete, missing uuid"));
goto error;
}
@@ -1143,7 +1143,7 @@ xenDaemonParseSxprOS(virConnectPtr xend,
if (def->os.loader == NULL) {
virXendError(xend, VIR_ERR_INTERNAL_ERROR,
- _("domain information incomplete, missing HVM loader"));
+ "%s", _("domain information incomplete, missing HVM loader"));
return(-1);
}
} else {
@@ -1197,7 +1197,7 @@ xenDaemonParseSxprOS(virConnectPtr xend,
!def->os.kernel &&
!def->os.bootloader) {
virXendError(xend, VIR_ERR_INTERNAL_ERROR,
- _("domain information incomplete, missing kernel & bootloader"));
+ "%s", _("domain information incomplete, missing kernel & bootloader"));
return -1;
}
@@ -1261,7 +1261,7 @@ xend_parse_sexp_desc_char(virConnectPtr conn,
value += sizeof("unix:")-1;
} else {
virXendError(conn, VIR_ERR_INTERNAL_ERROR,
- _("Unknown char device type"));
+ "%s", _("Unknown char device type"));
return -1;
}
@@ -1295,7 +1295,7 @@ xend_parse_sexp_desc_char(virConnectPtr conn,
if (offset == NULL) {
virXendError(conn, VIR_ERR_INTERNAL_ERROR,
- _("malformed char device string"));
+ "%s", _("malformed char device string"));
goto error;
}
@@ -1335,7 +1335,7 @@ xend_parse_sexp_desc_char(virConnectPtr conn,
if (offset == NULL) {
virXendError(conn, VIR_ERR_INTERNAL_ERROR,
- _("malformed char device string"));
+ "%s", _("malformed char device string"));
goto error;
}
@@ -1351,7 +1351,7 @@ xend_parse_sexp_desc_char(virConnectPtr conn,
offset3 = strchr(offset2, ':');
if (offset3 == NULL) {
virXendError(conn, VIR_ERR_INTERNAL_ERROR,
- _("malformed char device string"));
+ "%s", _("malformed char device string"));
goto error;
}
@@ -1418,7 +1418,7 @@ xend_parse_sexp_desc_char(virConnectPtr conn,
if (ret == -1) {
no_memory:
virXendError(conn, VIR_ERR_NO_MEMORY,
- _("no memory for char device config"));
+ "%s", _("no memory for char device config"));
}
error:
@@ -1490,7 +1490,7 @@ xenDaemonParseSxprChar(virConnectPtr conn,
if (offset == NULL) {
virXendError(conn, VIR_ERR_INTERNAL_ERROR,
- _("malformed char device string"));
+ "%s", _("malformed char device string"));
goto error;
}
@@ -1518,7 +1518,7 @@ xenDaemonParseSxprChar(virConnectPtr conn,
if (offset == NULL) {
virXendError(conn, VIR_ERR_INTERNAL_ERROR,
- _("malformed char device string"));
+ "%s", _("malformed char device string"));
goto error;
}
@@ -1534,7 +1534,7 @@ xenDaemonParseSxprChar(virConnectPtr conn,
offset3 = strchr(offset2, ':');
if (offset3 == NULL) {
virXendError(conn, VIR_ERR_INTERNAL_ERROR,
- _("malformed char device string"));
+ "%s", _("malformed char device string"));
goto error;
}
@@ -1625,7 +1625,7 @@ xenDaemonParseSxprDisks(virConnectPtr conn,
if (dst == NULL) {
virXendError(conn, VIR_ERR_INTERNAL_ERROR,
- _("domain information incomplete, vbd has no dev"));
+ "%s", _("domain information incomplete, vbd has no dev"));
goto error;
}
@@ -1636,7 +1636,7 @@ xenDaemonParseSxprDisks(virConnectPtr conn,
!hvm ||
STRNEQ(offset, ":cdrom")) {
virXendError(conn, VIR_ERR_INTERNAL_ERROR,
- _("domain information incomplete, vbd has no src"));
+ "%s", _("domain information incomplete, vbd has no src"));
goto error;
}
}
@@ -1645,7 +1645,7 @@ xenDaemonParseSxprDisks(virConnectPtr conn,
offset = strchr(src, ':');
if (!offset) {
virXendError(conn, VIR_ERR_INTERNAL_ERROR,
- _("cannot parse vbd filename, missing driver name"));
+ "%s", _("cannot parse vbd filename, missing driver name"));
goto error;
}
@@ -1660,7 +1660,7 @@ xenDaemonParseSxprDisks(virConnectPtr conn,
offset = strchr(src, ':');
if (!offset) {
virXendError(conn, VIR_ERR_INTERNAL_ERROR,
- _("cannot parse vbd filename, missing driver type"));
+ "%s", _("cannot parse vbd filename, missing driver type"));
goto error;
}
@@ -2143,7 +2143,7 @@ xenDaemonParseSxpr(virConnectPtr conn,
tmp = sexpr_node(root, "domain/domid");
if (tmp == NULL && xendConfigVersion < 3) { /* Old XenD, domid was mandatory */
virXendError(conn, VIR_ERR_INTERNAL_ERROR,
- _("domain information incomplete, missing id"));
+ "%s", _("domain information incomplete, missing id"));
goto error;
}
def->virtType = VIR_DOMAIN_VIRT_XEN;
@@ -2156,14 +2156,14 @@ xenDaemonParseSxpr(virConnectPtr conn,
goto no_memory;
if (def->name == NULL) {
virXendError(conn, VIR_ERR_INTERNAL_ERROR,
- _("domain information incomplete, missing name"));
+ "%s", _("domain information incomplete, missing name"));
goto error;
}
tmp = sexpr_node(root, "domain/uuid");
if (tmp == NULL) {
virXendError(conn, VIR_ERR_INTERNAL_ERROR,
- _("domain information incomplete, missing name"));
+ "%s", _("domain information incomplete, missing name"));
goto error;
}
virUUIDParse(tmp, def->uuid);
@@ -2553,7 +2553,7 @@ sexpr_to_xend_topology(virConnectPtr conn,
nodeToCpu = sexpr_node(root, "node/node_to_cpu");
if (nodeToCpu == NULL) {
virXendError(conn, VIR_ERR_INTERNAL_ERROR,
- _("failed to parse topology information"));
+ "%s", _("failed to parse topology information"));
return -1;
}
@@ -2607,7 +2607,7 @@ sexpr_to_xend_topology(virConnectPtr conn,
return (0);
parse_error:
- virXendError(conn, VIR_ERR_XEN_CALL, _("topology syntax error"));
+ virXendError(conn, VIR_ERR_XEN_CALL, "%s", _("topology syntax error"));
error:
VIR_FREE(cpuNums);
VIR_FREE(cpuset);
@@ -2617,7 +2617,7 @@ sexpr_to_xend_topology(virConnectPtr conn,
memory_error:
VIR_FREE(cpuNums);
VIR_FREE(cpuset);
- virXendError(conn, VIR_ERR_NO_MEMORY, _("allocate buffer"));
+ virXendError(conn, VIR_ERR_NO_MEMORY, "%s", _("allocate buffer"));
return (-1);
}
@@ -2671,7 +2671,7 @@ sexpr_to_domain(virConnectPtr conn, const struct sexpr *root)
error:
virXendError(conn, VIR_ERR_INTERNAL_ERROR,
- _("failed to parse Xend domain information"));
+ "%s", _("failed to parse Xend domain information"));
if (ret != NULL)
virUnrefDomain(ret);
return(NULL);
@@ -3153,7 +3153,7 @@ xenDaemonDomainFetch(virConnectPtr conn,
root = sexpr_get(conn, "/xend/domain/%d?detail=1", domid);
if (root == NULL) {
virXendError (conn, VIR_ERR_XEN_CALL,
- _("xenDaemonDomainFetch failed to"
+ "%s", _("xenDaemonDomainFetch failed to"
" find this domain"));
return (NULL);
}
@@ -3980,7 +3980,7 @@ xenDaemonDomainGetAutostart(virDomainPtr domain,
root = sexpr_get(domain->conn, "/xend/domain/%s?detail=1", domain->name);
if (root == NULL) {
virXendError (domain->conn, VIR_ERR_XEN_CALL,
- _("xenDaemonGetAutostart failed to find this domain"));
+ "%s", _("xenDaemonGetAutostart failed to find this domain"));
return (-1);
}
@@ -4021,7 +4021,7 @@ xenDaemonDomainSetAutostart(virDomainPtr domain,
root = sexpr_get(domain->conn, "/xend/domain/%s?detail=1", domain->name);
if (root == NULL) {
virXendError (domain->conn, VIR_ERR_XEN_CALL,
- _("xenDaemonSetAutostart failed to find this domain"));
+ "%s", _("xenDaemonSetAutostart failed to find this domain"));
return (-1);
}
@@ -4029,7 +4029,7 @@ xenDaemonDomainSetAutostart(virDomainPtr domain,
if (autostr) {
if (!STREQ(autostr, "ignore") && !STREQ(autostr, "start")) {
virXendError(domain->conn, VIR_ERR_INTERNAL_ERROR,
- _("unexpected value from on_xend_start"));
+ "%s", _("unexpected value from on_xend_start"));
goto error;
}
@@ -4040,23 +4040,23 @@ xenDaemonDomainSetAutostart(virDomainPtr domain,
: strdup("ignore"));
if (!(autonode->u.s.car->u.value)) {
virXendError(domain->conn, VIR_ERR_INTERNAL_ERROR,
- _("no memory"));
+ "%s", _("no memory"));
goto error;
}
if (sexpr2string(root, buf, sizeof(buf)) == 0) {
virXendError(domain->conn, VIR_ERR_INTERNAL_ERROR,
- _("sexpr2string failed"));
+ "%s", _("sexpr2string failed"));
goto error;
}
if (xend_op(domain->conn, "", "op", "new", "config", buf, NULL) != 0) {
virXendError(domain->conn, VIR_ERR_XEN_CALL,
- _("Failed to redefine sexpr"));
+ "%s", _("Failed to redefine sexpr"));
goto error;
}
} else {
virXendError(domain->conn, VIR_ERR_INTERNAL_ERROR,
- _("on_xend_start not present in sexpr"));
+ "%s", _("on_xend_start not present in sexpr"));
goto error;
}
@@ -4124,7 +4124,7 @@ xenDaemonDomainMigratePerform (virDomainPtr domain,
/* Xen doesn't support renaming domains during migration. */
if (dname) {
virXendError (conn, VIR_ERR_NO_SUPPORT,
- _("xenDaemonDomainMigrate: Xen does not support"
+ "%s", _("xenDaemonDomainMigrate: Xen does not support"
" renaming domains during migration"));
return -1;
}
@@ -4134,7 +4134,7 @@ xenDaemonDomainMigratePerform (virDomainPtr domain,
*/
if (bandwidth) {
virXendError (conn, VIR_ERR_NO_SUPPORT,
- _("xenDaemonDomainMigrate: Xen does not support"
+ "%s", _("xenDaemonDomainMigrate: Xen does not support"
" bandwidth limits during migration"));
return -1;
}
@@ -4146,7 +4146,7 @@ xenDaemonDomainMigratePerform (virDomainPtr domain,
}
if (flags != 0) {
virXendError (conn, VIR_ERR_NO_SUPPORT,
- _("xenDaemonDomainMigrate: unsupported flag"));
+ "%s", _("xenDaemonDomainMigrate: unsupported flag"));
return -1;
}
@@ -4159,26 +4159,26 @@ xenDaemonDomainMigratePerform (virDomainPtr domain,
xmlURIPtr uriptr = xmlParseURI (uri);
if (!uriptr) {
virXendError (conn, VIR_ERR_INVALID_ARG,
- _("xenDaemonDomainMigrate: invalid URI"));
+ "%s", _("xenDaemonDomainMigrate: invalid URI"));
return -1;
}
if (uriptr->scheme && STRCASENEQ (uriptr->scheme, "xenmigr")) {
virXendError (conn, VIR_ERR_INVALID_ARG,
- _("xenDaemonDomainMigrate: only xenmigr://"
+ "%s", _("xenDaemonDomainMigrate: only xenmigr://"
" migrations are supported by Xen"));
xmlFreeURI (uriptr);
return -1;
}
if (!uriptr->server) {
virXendError (conn, VIR_ERR_INVALID_ARG,
- _("xenDaemonDomainMigrate: a hostname must be"
+ "%s", _("xenDaemonDomainMigrate: a hostname must be"
" specified in the URI"));
xmlFreeURI (uriptr);
return -1;
}
hostname = strdup (uriptr->server);
if (!hostname) {
- virXendError (conn, VIR_ERR_NO_MEMORY, _("strdup failed"));
+ virXendError (conn, VIR_ERR_NO_MEMORY, "%s", _("strdup failed"));
xmlFreeURI (uriptr);
return -1;
}
@@ -4191,7 +4191,7 @@ xenDaemonDomainMigratePerform (virDomainPtr domain,
if (sscanf (p+1, "%d", &port_nr) != 1) {
virXendError (conn, VIR_ERR_INVALID_ARG,
- _("xenDaemonDomainMigrate: invalid port number"));
+ "%s", _("xenDaemonDomainMigrate: invalid port number"));
return -1;
}
snprintf (port, sizeof port, "%d", port_nr);
@@ -4200,7 +4200,7 @@ xenDaemonDomainMigratePerform (virDomainPtr domain,
n = p - uri; /* n = Length of hostname in bytes. */
hostname = strdup (uri);
if (!hostname) {
- virXendError (conn, VIR_ERR_NO_MEMORY, _("strdup failed"));
+ virXendError (conn, VIR_ERR_NO_MEMORY, "%s", _("strdup failed"));
return -1;
}
hostname[n] = '\0';
@@ -4208,7 +4208,7 @@ xenDaemonDomainMigratePerform (virDomainPtr domain,
else { /* "hostname" (or IP address) */
hostname = strdup (uri);
if (!hostname) {
- virXendError (conn, VIR_ERR_NO_MEMORY, _("strdup failed"));
+ virXendError (conn, VIR_ERR_NO_MEMORY, "%s", _("strdup failed"));
return -1;
}
}
@@ -4244,13 +4244,13 @@ virDomainPtr xenDaemonDomainDefineXML(virConnectPtr conn, const char *xmlDesc) {
if (!(def = virDomainDefParseString(conn, priv->caps, xmlDesc))) {
virXendError(conn, VIR_ERR_XML_ERROR,
- _("failed to parse domain description"));
+ "%s", _("failed to parse domain description"));
return (NULL);
}
if (!(sexpr = xenDaemonFormatSxpr(conn, def, priv->xendConfigVersion))) {
virXendError(conn, VIR_ERR_XML_ERROR,
- _("failed to build sexpr"));
+ "%s", _("failed to build sexpr"));
goto error;
}
@@ -4416,7 +4416,7 @@ xenDaemonGetSchedulerType(virDomainPtr domain, int *nparams)
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (priv->xendConfigVersion < 4) {
virXendError (domain->conn, VIR_ERR_NO_SUPPORT,
- _("unsupported in xendConfigVersion < 4"));
+ "%s", _("unsupported in xendConfigVersion < 4"));
return NULL;
}
@@ -4428,25 +4428,25 @@ xenDaemonGetSchedulerType(virDomainPtr domain, int *nparams)
ret = sexpr_node(root, "node/xen_scheduler");
if (ret == NULL){
virXendError(domain->conn, VIR_ERR_INTERNAL_ERROR,
- _("node information incomplete, missing scheduler name"));
+ "%s", _("node information incomplete, missing scheduler name"));
goto error;
}
if (STREQ (ret, "credit")) {
schedulertype = strdup("credit");
if (schedulertype == NULL){
- virXendError(domain->conn, VIR_ERR_SYSTEM_ERROR, _("strdup failed"));
+ virXendError(domain->conn, VIR_ERR_SYSTEM_ERROR, "%s", _("strdup failed"));
goto error;
}
*nparams = XEN_SCHED_CRED_NPARAM;
} else if (STREQ (ret, "sedf")) {
schedulertype = strdup("sedf");
if (schedulertype == NULL){
- virXendError(domain->conn, VIR_ERR_SYSTEM_ERROR, _("strdup failed"));
+ virXendError(domain->conn, VIR_ERR_SYSTEM_ERROR, "%s", _("strdup failed"));
goto error;
}
*nparams = XEN_SCHED_SEDF_NPARAM;
} else {
- virXendError(domain->conn, VIR_ERR_INTERNAL_ERROR, _("Unknown scheduler"));
+ virXendError(domain->conn, VIR_ERR_INTERNAL_ERROR, "%s", _("Unknown scheduler"));
goto error;
}
@@ -4492,7 +4492,7 @@ xenDaemonGetSchedulerParameters(virDomainPtr domain,
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (priv->xendConfigVersion < 4) {
virXendError (domain->conn, VIR_ERR_NO_SUPPORT,
- _("unsupported in xendConfigVersion < 4"));
+ "%s", _("unsupported in xendConfigVersion < 4"));
return (-1);
}
@@ -4505,7 +4505,7 @@ xenDaemonGetSchedulerParameters(virDomainPtr domain,
sched_type = xenDaemonGetSchedulerType(domain, &sched_nparam);
if (sched_type == NULL) {
virXendError(domain->conn, VIR_ERR_INTERNAL_ERROR,
- _("Failed to get a scheduler name"));
+ "%s", _("Failed to get a scheduler name"));
goto error;
}
@@ -4518,12 +4518,12 @@ xenDaemonGetSchedulerParameters(virDomainPtr domain,
/* get cpu_weight/cpu_cap from xend/domain */
if (sexpr_node(root, "domain/cpu_weight") == NULL) {
virXendError(domain->conn, VIR_ERR_INTERNAL_ERROR,
- _("domain information incomplete, missing cpu_weight"));
+ "%s", _("domain information incomplete, missing cpu_weight"));
goto error;
}
if (sexpr_node(root, "domain/cpu_cap") == NULL) {
virXendError(domain->conn, VIR_ERR_INTERNAL_ERROR,
- _("domain information incomplete, missing cpu_cap"));
+ "%s", _("domain information incomplete, missing cpu_cap"));
goto error;
}
@@ -4540,7 +4540,7 @@ xenDaemonGetSchedulerParameters(virDomainPtr domain,
ret = 0;
break;
default:
- virXendError(domain->conn, VIR_ERR_INTERNAL_ERROR, _("Unknown scheduler"));
+ virXendError(domain->conn, VIR_ERR_INTERNAL_ERROR, "%s", _("Unknown scheduler"));
goto error;
}
@@ -4582,7 +4582,7 @@ xenDaemonSetSchedulerParameters(virDomainPtr domain,
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (priv->xendConfigVersion < 4) {
virXendError (domain->conn, VIR_ERR_NO_SUPPORT,
- _("unsupported in xendConfigVersion < 4"));
+ "%s", _("unsupported in xendConfigVersion < 4"));
return (-1);
}
@@ -4595,7 +4595,7 @@ xenDaemonSetSchedulerParameters(virDomainPtr domain,
sched_type = xenDaemonGetSchedulerType(domain, &sched_nparam);
if (sched_type == NULL) {
virXendError(domain->conn, VIR_ERR_INTERNAL_ERROR,
- _("Failed to get a scheduler name"));
+ "%s", _("Failed to get a scheduler name"));
goto error;
}
@@ -4631,7 +4631,7 @@ xenDaemonSetSchedulerParameters(virDomainPtr domain,
weight = sexpr_node(root, "domain/cpu_weight");
if (weight == NULL) {
virXendError(domain->conn, VIR_ERR_INTERNAL_ERROR,
- _("domain information incomplete, missing cpu_weight"));
+ "%s", _("domain information incomplete, missing cpu_weight"));
goto error;
}
snprintf(buf_weight, sizeof(buf_weight), "%s", weight);
@@ -4640,7 +4640,7 @@ xenDaemonSetSchedulerParameters(virDomainPtr domain,
cap = sexpr_node(root, "domain/cpu_cap");
if (cap == NULL) {
virXendError(domain->conn, VIR_ERR_INTERNAL_ERROR,
- _("domain information incomplete, missing cpu_cap"));
+ "%s", _("domain information incomplete, missing cpu_cap"));
goto error;
}
snprintf(buf_cap, sizeof(buf_cap), "%s", cap);
@@ -4652,7 +4652,7 @@ xenDaemonSetSchedulerParameters(virDomainPtr domain,
break;
}
default:
- virXendError(domain->conn, VIR_ERR_INTERNAL_ERROR, _("Unknown scheduler"));
+ virXendError(domain->conn, VIR_ERR_INTERNAL_ERROR, "%s", _("Unknown scheduler"));
goto error;
}
@@ -4698,7 +4698,7 @@ xenDaemonDomainBlockPeek (virDomainPtr domain, const char *path,
else {
/* This call always fails for dom0. */
virXendError (domain->conn, VIR_ERR_NO_SUPPORT,
- _("domainBlockPeek is not supported for dom0"));
+ "%s", _("domainBlockPeek is not supported for dom0"));
return -1;
}
@@ -4911,7 +4911,7 @@ xenDaemonFormatSxprChr(virConnectPtr conn,
if (!type) {
virXendError(conn, VIR_ERR_INTERNAL_ERROR,
- _("unexpected chr device type"));
+ "%s", _("unexpected chr device type"));
return -1;
}
@@ -5488,7 +5488,7 @@ virDomainXMLDevID(virDomainPtr domain,
ref[ref_len - 1] = '\0';
} else {
virXendError(NULL, VIR_ERR_NO_SUPPORT,
- _("hotplug of device type not supported"));
+ "%s", _("hotplug of device type not supported"));
return -1;
}
diff --git a/src/xm_internal.c b/src/xm_internal.c
index e117a36..6c84b91 100644
--- a/src/xm_internal.c
+++ b/src/xm_internal.c
@@ -487,7 +487,7 @@ static int xenXMConfigCacheRefresh (virConnectPtr conn) {
virDomainDefFree(entry->def);
VIR_FREE(entry);
xenXMError (conn, VIR_ERR_INTERNAL_ERROR,
- _("xenXMConfigCacheRefresh: virHashAddEntry"));
+ "%s", _("xenXMConfigCacheRefresh: virHashAddEntry"));
goto cleanup;
}
}
@@ -1419,22 +1419,22 @@ int xenXMDomainPinVcpu(virDomainPtr domain,
}
if (domain->conn->flags & VIR_CONNECT_RO) {
xenXMError (domain->conn, VIR_ERR_INVALID_ARG,
- _("read only connection"));
+ "%s", _("read only connection"));
return -1;
}
if (domain->id != -1) {
xenXMError (domain->conn, VIR_ERR_INVALID_ARG,
- _("not inactive domain"));
+ "%s", _("not inactive domain"));
return -1;
}
if (!(filename = virHashLookup(nameConfigMap, domain->name))) {
- xenXMError (domain->conn, VIR_ERR_INTERNAL_ERROR, _("virHashLookup"));
+ xenXMError (domain->conn, VIR_ERR_INTERNAL_ERROR, "%s", _("virHashLookup"));
return -1;
}
if (!(entry = virHashLookup(configCache, filename))) {
xenXMError (domain->conn, VIR_ERR_INTERNAL_ERROR,
- _("can't retrieve config file for domain"));
+ "%s", _("can't retrieve config file for domain"));
return -1;
}
@@ -1452,14 +1452,14 @@ int xenXMDomainPinVcpu(virDomainPtr domain,
}
if (virBufferError(&mapbuf)) {
- xenXMError(domain->conn, VIR_ERR_NO_MEMORY, _("allocate buffer"));
+ xenXMError(domain->conn, VIR_ERR_NO_MEMORY, "%s", _("allocate buffer"));
return -1;
}
mapstr = virBufferContentAndReset(&mapbuf);
if (VIR_ALLOC_N(cpuset, maxcpu) < 0) {
- xenXMError(domain->conn, VIR_ERR_NO_MEMORY, _("allocate buffer"));
+ xenXMError(domain->conn, VIR_ERR_NO_MEMORY, "%s", _("allocate buffer"));
goto cleanup;
}
if (virDomainCpuSetParse(domain->conn,
@@ -1594,7 +1594,7 @@ int xenXMDomainCreate(virDomainPtr domain) {
if (!(sexpr = xenDaemonFormatSxpr(domain->conn, entry->def, priv->xendConfigVersion))) {
xenXMError(domain->conn, VIR_ERR_XML_ERROR,
- _("failed to build sexpr"));
+ "%s", _("failed to build sexpr"));
return (-1);
}
@@ -2216,13 +2216,13 @@ virDomainPtr xenXMDomainDefineXML(virConnectPtr conn, const char *xml) {
if (!(oldfilename = (char *)virHashLookup(nameConfigMap, def->name))) {
xenXMError(conn, VIR_ERR_INTERNAL_ERROR,
- _("can't retrieve config filename for domain to overwrite"));
+ "%s", _("can't retrieve config filename for domain to overwrite"));
goto error;
}
if (!(entry = virHashLookup(configCache, oldfilename))) {
xenXMError(conn, VIR_ERR_INTERNAL_ERROR,
- _("can't retrieve config entry for domain to overwrite"));
+ "%s", _("can't retrieve config entry for domain to overwrite"));
goto error;
}
@@ -2233,14 +2233,14 @@ virDomainPtr xenXMDomainDefineXML(virConnectPtr conn, const char *xml) {
/* Remove the name -> filename mapping */
if (virHashRemoveEntry(nameConfigMap, def->name, NULL) < 0) {
xenXMError(conn, VIR_ERR_INTERNAL_ERROR,
- _("failed to remove old domain from config map"));
+ "%s", _("failed to remove old domain from config map"));
goto error;
}
/* Remove the config record itself */
if (virHashRemoveEntry(configCache, oldfilename, xenXMConfigFree) < 0) {
xenXMError(conn, VIR_ERR_INTERNAL_ERROR,
- _("failed to remove old domain from config map"));
+ "%s", _("failed to remove old domain from config map"));
goto error;
}
@@ -2249,7 +2249,7 @@ virDomainPtr xenXMDomainDefineXML(virConnectPtr conn, const char *xml) {
if ((strlen(configDir) + 1 + strlen(def->name) + 1) > PATH_MAX) {
xenXMError(conn, VIR_ERR_INTERNAL_ERROR,
- _("config file name is too long"));
+ "%s", _("config file name is too long"));
goto error;
}
@@ -2261,13 +2261,13 @@ virDomainPtr xenXMDomainDefineXML(virConnectPtr conn, const char *xml) {
goto error;
if (VIR_ALLOC(entry) < 0) {
- xenXMError(conn, VIR_ERR_NO_MEMORY, _("config"));
+ xenXMError(conn, VIR_ERR_NO_MEMORY, "%s", _("config"));
goto error;
}
if ((entry->refreshedAt = time(NULL)) == ((time_t)-1)) {
xenXMError(conn, VIR_ERR_INTERNAL_ERROR,
- _("unable to get current time"));
+ "%s", _("unable to get current time"));
goto error;
}
@@ -2276,14 +2276,14 @@ virDomainPtr xenXMDomainDefineXML(virConnectPtr conn, const char *xml) {
if (virHashAddEntry(configCache, filename, entry) < 0) {
xenXMError(conn, VIR_ERR_INTERNAL_ERROR,
- _("unable to store config file handle"));
+ "%s", _("unable to store config file handle"));
goto error;
}
if (virHashAddEntry(nameConfigMap, def->name, entry->filename) < 0) {
virHashRemoveEntry(configCache, filename, NULL);
xenXMError(conn, VIR_ERR_INTERNAL_ERROR,
- _("unable to store config file handle"));
+ "%s", _("unable to store config file handle"));
goto error;
}
@@ -2471,7 +2471,7 @@ xenXMDomainAttachDevice(virDomainPtr domain, const char *xml) {
default:
xenXMError(domain->conn, VIR_ERR_XML_ERROR,
- _("unknown device"));
+ "%s", _("unknown device"));
goto cleanup;
}
@@ -2586,7 +2586,7 @@ xenXMDomainDetachDevice(virDomainPtr domain, const char *xml) {
}
default:
xenXMError(domain->conn, VIR_ERR_XML_ERROR,
- _("unknown device"));
+ "%s", _("unknown device"));
goto cleanup;
}
diff --git a/src/xml.c b/src/xml.c
index 3536216..6f2fa8b 100644
--- a/src/xml.c
+++ b/src/xml.c
@@ -54,7 +54,7 @@ virXPathString(virConnectPtr conn,
if ((ctxt == NULL) || (xpath == NULL)) {
virXMLError(conn, VIR_ERR_INTERNAL_ERROR,
- _("Invalid parameter to virXPathString()"));
+ "%s", _("Invalid parameter to virXPathString()"));
return (NULL);
}
relnode = ctxt->node;
@@ -67,7 +67,7 @@ virXPathString(virConnectPtr conn,
ret = strdup((char *) obj->stringval);
xmlXPathFreeObject(obj);
if (ret == NULL) {
- virXMLError(conn, VIR_ERR_NO_MEMORY, _("strdup failed"));
+ virXMLError(conn, VIR_ERR_NO_MEMORY, "%s", _("strdup failed"));
}
ctxt->node = relnode;
return (ret);
@@ -95,7 +95,7 @@ virXPathNumber(virConnectPtr conn,
if ((ctxt == NULL) || (xpath == NULL) || (value == NULL)) {
virXMLError(conn, VIR_ERR_INTERNAL_ERROR,
- _("Invalid parameter to virXPathNumber()"));
+ "%s", _("Invalid parameter to virXPathNumber()"));
return (-1);
}
relnode = ctxt->node;
@@ -137,7 +137,7 @@ virXPathLong(virConnectPtr conn,
if ((ctxt == NULL) || (xpath == NULL) || (value == NULL)) {
virXMLError(conn, VIR_ERR_INTERNAL_ERROR,
- _("Invalid parameter to virXPathNumber()"));
+ "%s", _("Invalid parameter to virXPathNumber()"));
return (-1);
}
relnode = ctxt->node;
@@ -192,7 +192,7 @@ virXPathULong(virConnectPtr conn,
if ((ctxt == NULL) || (xpath == NULL) || (value == NULL)) {
virXMLError(conn, VIR_ERR_INTERNAL_ERROR,
- _("Invalid parameter to virXPathNumber()"));
+ "%s", _("Invalid parameter to virXPathNumber()"));
return (-1);
}
relnode = ctxt->node;
@@ -250,7 +250,7 @@ virXPathBoolean(virConnectPtr conn,
if ((ctxt == NULL) || (xpath == NULL)) {
virXMLError(conn, VIR_ERR_INTERNAL_ERROR,
- _("Invalid parameter to virXPathBoolean()"));
+ "%s", _("Invalid parameter to virXPathBoolean()"));
return (-1);
}
relnode = ctxt->node;
@@ -288,7 +288,7 @@ virXPathNode(virConnectPtr conn,
if ((ctxt == NULL) || (xpath == NULL)) {
virXMLError(conn, VIR_ERR_INTERNAL_ERROR,
- _("Invalid parameter to virXPathNode()"));
+ "%s", _("Invalid parameter to virXPathNode()"));
return (NULL);
}
relnode = ctxt->node;
@@ -330,7 +330,7 @@ virXPathNodeSet(virConnectPtr conn,
if ((ctxt == NULL) || (xpath == NULL)) {
virXMLError(conn, VIR_ERR_INTERNAL_ERROR,
- _("Invalid parameter to virXPathNodeSet()"));
+ "%s", _("Invalid parameter to virXPathNodeSet()"));
return (-1);
}
diff --git a/src/xs_internal.c b/src/xs_internal.c
index ca6277d..d9e8123 100644
--- a/src/xs_internal.c
+++ b/src/xs_internal.c
@@ -298,7 +298,7 @@ xenStoreOpen(virConnectPtr conn,
*/
if (getuid() == 0) {
virXenStoreError(NULL, VIR_ERR_NO_XEN,
- _("failed to connect to Xen Store"));
+ "%s", _("failed to connect to Xen Store"));
}
return (-1);
}
--
1.6.0.2.307.gc4275
16 years, 2 months
[libvirt] virDomanMigrate on kvm fails
by Kenneth Nagin
virDomainMigrate fails when the domain is a kvm guest.
The error message is "this function is not supported by the hypervisor:
virDomainMigrate."
I tried migrating with virsh but it says it can not connected to the
destination host.
I have successfully created copies of the same image on both so that is
not the problem.
I hava also booted the same hosts with xen and virDomainMigrate worked.
What do you think the problem is?
Kenneth Nagin
16 years, 2 months
[libvirt] input on F10 virtualization release notes
by Dale Bewley
I've been working on the virtualization release notes[1] for Fedora 10
these past several days, and I'm looking for input from those in the
know. The advances coming out of the Emerging Technologies projects and
Fedora in general are very impressive, and I'd like to do them justice.
I added a lot of content quickly yesterday, and the page structure
is by no means solid, but there is a pending freeze[2] on October
10th. I'd like to get it into the best and most accurate shape
possible before then. There will be a chance to make updates again
before the F10 release.
I've attempted to describe the improvements to virtualization-related
packages between the F9 release versions and the anticipated F10
versions. I've created a table[3] of those versions to help with the
comparison. I'd appreciate it if you'd let me know:
* if you believe a version bump is pending
* if I've left out any packages or features
* if I included something not noteworthy
* anything else you have to say
If you have any comments, contributions, or criticisms at all, please
add them to the wiki article/talk page/or email them to me.
Thanks! And keep up the great work!
[1] https://fedoraproject.org/wiki/Docs/Beats/Virtualization
[2] http://poelstra.fedorapeople.org/schedules/f-10/f-10-docs-tasks.html
[3] https://fedoraproject.org/wiki/DaleBewley#Virtualization_Release_Notes
--
Dale Bewley - Unix Administrator - Shields Library - UC Davis
GPG: 0xB098A0F3 0D5A 9AEB 43F4 F84C 7EFD 1753 064D 2583 B098 A0F3
16 years, 2 months