virtportallocator: new function "virPortAllocatorSetUsed"

virPortAllocatorSetUsed permits to set a port as already used and
prevent the port allocator to use it without any attempt to bind it.

Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Giuseppe Scrivano 2014-06-24 13:34:17 +02:00 committed by Michal Privoznik
parent 59cac9a918
commit 1d8d2fbcd0
3 changed files with 47 additions and 1 deletions

View File

@ -1770,6 +1770,7 @@ virPidFileWritePath;
virPortAllocatorAcquire;
virPortAllocatorNew;
virPortAllocatorRelease;
virPortAllocatorSetUsed;
# util/virprocess.h

View File

@ -1,7 +1,7 @@
/*
* virportallocator.c: Allocate & track TCP port allocations
*
* Copyright (C) 2013 Red Hat, Inc.
* Copyright (C) 2013-2014 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@ -250,3 +250,44 @@ int virPortAllocatorRelease(virPortAllocatorPtr pa,
virObjectUnlock(pa);
return ret;
}
int virPortAllocatorSetUsed(virPortAllocatorPtr pa,
unsigned short port,
bool value)
{
int ret = -1;
virObjectLock(pa);
if (port < pa->start ||
port > pa->end) {
ret = 0;
goto cleanup;
}
if (value) {
bool used = false;
if (virBitmapGetBit(pa->bitmap, port - pa->start, &used) < 0)
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to query port %d"), port);
if (used || virBitmapSetBit(pa->bitmap, port - pa->start) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to reserve port %d"), port);
goto cleanup;
}
} else {
if (virBitmapClearBit(pa->bitmap,
port - pa->start) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to release port %d"),
port);
goto cleanup;
}
}
ret = 0;
cleanup:
virObjectUnlock(pa);
return ret;
}

View File

@ -38,4 +38,8 @@ int virPortAllocatorAcquire(virPortAllocatorPtr pa,
int virPortAllocatorRelease(virPortAllocatorPtr pa,
unsigned short port);
int virPortAllocatorSetUsed(virPortAllocatorPtr pa,
unsigned short port,
bool value);
#endif /* __VIR_PORT_ALLOCATOR_H__ */