提交 1d8d2fbc 编写于 作者: G Giuseppe Scrivano 提交者: Michal Privoznik

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: NGiuseppe Scrivano <gscrivan@redhat.com>
Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
上级 59cac9a9
...@@ -1770,6 +1770,7 @@ virPidFileWritePath; ...@@ -1770,6 +1770,7 @@ virPidFileWritePath;
virPortAllocatorAcquire; virPortAllocatorAcquire;
virPortAllocatorNew; virPortAllocatorNew;
virPortAllocatorRelease; virPortAllocatorRelease;
virPortAllocatorSetUsed;
# util/virprocess.h # util/virprocess.h
......
/* /*
* virportallocator.c: Allocate & track TCP port allocations * 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 * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
...@@ -250,3 +250,44 @@ int virPortAllocatorRelease(virPortAllocatorPtr pa, ...@@ -250,3 +250,44 @@ int virPortAllocatorRelease(virPortAllocatorPtr pa,
virObjectUnlock(pa); virObjectUnlock(pa);
return ret; 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;
}
...@@ -38,4 +38,8 @@ int virPortAllocatorAcquire(virPortAllocatorPtr pa, ...@@ -38,4 +38,8 @@ int virPortAllocatorAcquire(virPortAllocatorPtr pa,
int virPortAllocatorRelease(virPortAllocatorPtr pa, int virPortAllocatorRelease(virPortAllocatorPtr pa,
unsigned short port); unsigned short port);
int virPortAllocatorSetUsed(virPortAllocatorPtr pa,
unsigned short port,
bool value);
#endif /* __VIR_PORT_ALLOCATOR_H__ */ #endif /* __VIR_PORT_ALLOCATOR_H__ */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册