mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-20 06:50:22 +03:00
build: use correct type for pid and similar types
No thanks to 64-bit windows, with 64-bit pid_t, we have to avoid constructs like 'int pid'. Our API in libvirt-qemu cannot be changed without breaking ABI; but then again, libvirt-qemu can only be used on systems that support UNIX sockets, which rules out Windows (even if qemu could be compiled there) - so for all points on the call chain that interact with this API decision, we require a different variable name to make it clear that we audited the use for safety. Adding a syntax-check rule only solves half the battle; anywhere that uses printf on a pid_t still needs to be converted, but that will be a separate patch. * cfg.mk (sc_correct_id_types): New syntax check. * src/libvirt-qemu.c (virDomainQemuAttach): Document why we didn't use pid_t for pid, and validate for overflow. * include/libvirt/libvirt-qemu.h (virDomainQemuAttach): Tweak name for syntax check. * src/vmware/vmware_conf.c (vmwareExtractPid): Likewise. * src/driver.h (virDrvDomainQemuAttach): Likewise. * tools/virsh.c (cmdQemuAttach): Likewise. * src/remote/qemu_protocol.x (qemu_domain_attach_args): Likewise. * src/qemu_protocol-structs (qemu_domain_attach_args): Likewise. * src/util/cgroup.c (virCgroupPidCode, virCgroupKillInternal): Likewise. * src/qemu/qemu_command.c(qemuParseProcFileStrings): Likewise. (qemuParseCommandLinePid): Use pid_t for pid. * daemon/libvirtd.c (daemonForkIntoBackground): Likewise. * src/conf/domain_conf.h (_virDomainObj): Likewise. * src/probes.d (rpc_socket_new): Likewise. * src/qemu/qemu_command.h (qemuParseCommandLinePid): Likewise. * src/qemu/qemu_driver.c (qemudGetProcessInfo, qemuDomainAttach): Likewise. * src/qemu/qemu_process.c (qemuProcessAttach): Likewise. * src/qemu/qemu_process.h (qemuProcessAttach): Likewise. * src/uml/uml_driver.c (umlGetProcessInfo): Likewise. * src/util/virnetdev.h (virNetDevSetNamespace): Likewise. * src/util/virnetdev.c (virNetDevSetNamespace): Likewise. * tests/testutils.c (virtTestCaptureProgramOutput): Likewise. * src/conf/storage_conf.h (_virStoragePerms): Use mode_t, uid_t, and gid_t rather than int. * src/security/security_dac.c (virSecurityDACSetOwnership): Likewise. * src/conf/storage_conf.c (virStorageDefParsePerms): Avoid compiler warning.
This commit is contained in:
parent
5c3a15647d
commit
3e2c3d8f6d
6
cfg.mk
6
cfg.mk
@ -416,6 +416,12 @@ sc_prohibit_ctype_h:
|
|||||||
halt="don't use ctype.h; instead, use c-ctype.h" \
|
halt="don't use ctype.h; instead, use c-ctype.h" \
|
||||||
$(_sc_search_regexp)
|
$(_sc_search_regexp)
|
||||||
|
|
||||||
|
# Insist on correct types for [pug]id.
|
||||||
|
sc_correct_id_types:
|
||||||
|
@prohibit='\<(int|long) *[pug]id\>' \
|
||||||
|
halt="use pid_t for pid, uid_t for uid, gid_t for gid" \
|
||||||
|
$(_sc_search_regexp)
|
||||||
|
|
||||||
# Ensure that no C source file, docs, or rng schema uses TABs for
|
# Ensure that no C source file, docs, or rng schema uses TABs for
|
||||||
# indentation. Also match *.h.in files, to get libvirt.h.in. Exclude
|
# indentation. Also match *.h.in files, to get libvirt.h.in. Exclude
|
||||||
# files in gnulib, since they're imported.
|
# files in gnulib, since they're imported.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* libvirtd.c: daemon start of day, guest process & i/o management
|
* libvirtd.c: daemon start of day, guest process & i/o management
|
||||||
*
|
*
|
||||||
* Copyright (C) 2006-2011 Red Hat, Inc.
|
* Copyright (C) 2006-2012 Red Hat, Inc.
|
||||||
* Copyright (C) 2006 Daniel P. Berrange
|
* Copyright (C) 2006 Daniel P. Berrange
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
@ -187,7 +187,7 @@ static int daemonForkIntoBackground(const char *argv0)
|
|||||||
if (pipe(statuspipe) < 0)
|
if (pipe(statuspipe) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
int pid = fork();
|
pid_t pid = fork();
|
||||||
switch (pid) {
|
switch (pid) {
|
||||||
case 0:
|
case 0:
|
||||||
{
|
{
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
* Description: Provides the interfaces of the libvirt library to handle
|
* Description: Provides the interfaces of the libvirt library to handle
|
||||||
* qemu specific methods
|
* qemu specific methods
|
||||||
*
|
*
|
||||||
* Copy: Copyright (C) 2010 Red Hat, Inc.
|
* Copy: Copyright (C) 2010, 2012 Red Hat, Inc.
|
||||||
*
|
*
|
||||||
* See COPYING.LIB for the License of this software
|
* See COPYING.LIB for the License of this software
|
||||||
*
|
*
|
||||||
@ -29,7 +29,7 @@ int virDomainQemuMonitorCommand(virDomainPtr domain, const char *cmd,
|
|||||||
char **result, unsigned int flags);
|
char **result, unsigned int flags);
|
||||||
|
|
||||||
virDomainPtr virDomainQemuAttach(virConnectPtr domain,
|
virDomainPtr virDomainQemuAttach(virConnectPtr domain,
|
||||||
unsigned int pid,
|
unsigned int pid_value,
|
||||||
unsigned int flags);
|
unsigned int flags);
|
||||||
|
|
||||||
# ifdef __cplusplus
|
# ifdef __cplusplus
|
||||||
|
@ -1679,7 +1679,7 @@ struct _virDomainObj {
|
|||||||
virMutex lock;
|
virMutex lock;
|
||||||
int refs;
|
int refs;
|
||||||
|
|
||||||
int pid;
|
pid_t pid;
|
||||||
virDomainStateReason state;
|
virDomainStateReason state;
|
||||||
|
|
||||||
unsigned int autostart : 1;
|
unsigned int autostart : 1;
|
||||||
|
@ -572,7 +572,7 @@ virStorageDefParsePerms(xmlXPathContextPtr ctxt,
|
|||||||
} else {
|
} else {
|
||||||
char *end = NULL;
|
char *end = NULL;
|
||||||
perms->mode = strtol(mode, &end, 8);
|
perms->mode = strtol(mode, &end, 8);
|
||||||
if (*end || perms->mode < 0 || perms->mode > 0777) {
|
if (*end || (perms->mode & ~0777)) {
|
||||||
VIR_FREE(mode);
|
VIR_FREE(mode);
|
||||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||||
"%s", _("malformed octal mode"));
|
"%s", _("malformed octal mode"));
|
||||||
|
@ -38,9 +38,9 @@
|
|||||||
typedef struct _virStoragePerms virStoragePerms;
|
typedef struct _virStoragePerms virStoragePerms;
|
||||||
typedef virStoragePerms *virStoragePermsPtr;
|
typedef virStoragePerms *virStoragePermsPtr;
|
||||||
struct _virStoragePerms {
|
struct _virStoragePerms {
|
||||||
int mode;
|
mode_t mode;
|
||||||
int uid;
|
uid_t uid;
|
||||||
int gid;
|
gid_t gid;
|
||||||
char *label;
|
char *label;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -661,9 +661,10 @@ typedef int
|
|||||||
(*virDrvDomainQemuMonitorCommand)(virDomainPtr domain, const char *cmd,
|
(*virDrvDomainQemuMonitorCommand)(virDomainPtr domain, const char *cmd,
|
||||||
char **result, unsigned int flags);
|
char **result, unsigned int flags);
|
||||||
|
|
||||||
|
/* Choice of unsigned int rather than pid_t is intentional. */
|
||||||
typedef virDomainPtr
|
typedef virDomainPtr
|
||||||
(*virDrvDomainQemuAttach)(virConnectPtr conn,
|
(*virDrvDomainQemuAttach)(virConnectPtr conn,
|
||||||
unsigned int pid,
|
unsigned int pid_value,
|
||||||
unsigned int flags);
|
unsigned int flags);
|
||||||
|
|
||||||
typedef int
|
typedef int
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* libvirt-qemu.c: Interfaces for the libvirt library to handle qemu-specific
|
* libvirt-qemu.c: Interfaces for the libvirt library to handle qemu-specific
|
||||||
* APIs.
|
* APIs.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2010-2011 Red Hat, Inc.
|
* Copyright (C) 2010-2012 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
|
||||||
@ -116,7 +116,7 @@ error:
|
|||||||
/**
|
/**
|
||||||
* virDomainQemuAttach:
|
* virDomainQemuAttach:
|
||||||
* @conn: pointer to a hypervisor connection
|
* @conn: pointer to a hypervisor connection
|
||||||
* @pid: the UNIX process ID of the external QEMU process
|
* @pid_value: the UNIX process ID of the external QEMU process
|
||||||
* @flags: optional flags, currently unused
|
* @flags: optional flags, currently unused
|
||||||
*
|
*
|
||||||
* This API is QEMU specific, so it will only work with hypervisor
|
* This API is QEMU specific, so it will only work with hypervisor
|
||||||
@ -133,6 +133,10 @@ error:
|
|||||||
* - The '-name' and '-uuid' arguments should have been set (not
|
* - The '-name' and '-uuid' arguments should have been set (not
|
||||||
* mandatory, but strongly recommended)
|
* mandatory, but strongly recommended)
|
||||||
*
|
*
|
||||||
|
* To date, the only platforms we know of where pid_t is larger than
|
||||||
|
* unsigned int (64-bit Windows) also lack UNIX sockets, so the choice
|
||||||
|
* of @pid_value as an unsigned int should not present any difficulties.
|
||||||
|
*
|
||||||
* If successful, then the guest will appear in the list of running
|
* If successful, then the guest will appear in the list of running
|
||||||
* domains for this connection, and other APIs should operate
|
* domains for this connection, and other APIs should operate
|
||||||
* normally (provided the above requirements were honored).
|
* normally (provided the above requirements were honored).
|
||||||
@ -141,10 +145,11 @@ error:
|
|||||||
*/
|
*/
|
||||||
virDomainPtr
|
virDomainPtr
|
||||||
virDomainQemuAttach(virConnectPtr conn,
|
virDomainQemuAttach(virConnectPtr conn,
|
||||||
unsigned int pid,
|
unsigned int pid_value,
|
||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
VIR_DEBUG("conn=%p, pid=%u, flags=%x", conn, pid, flags);
|
pid_t pid = pid_value;
|
||||||
|
VIR_DEBUG("conn=%p, pid=%u, flags=%x", conn, pid_value, flags);
|
||||||
|
|
||||||
virResetLastError();
|
virResetLastError();
|
||||||
|
|
||||||
@ -154,7 +159,7 @@ virDomainQemuAttach(virConnectPtr conn,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pid <= 1) {
|
if (pid != pid_value || pid <= 1) {
|
||||||
virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
|
virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@ -166,7 +171,7 @@ virDomainQemuAttach(virConnectPtr conn,
|
|||||||
|
|
||||||
if (conn->driver->qemuDomainAttach) {
|
if (conn->driver->qemuDomainAttach) {
|
||||||
virDomainPtr ret;
|
virDomainPtr ret;
|
||||||
ret = conn->driver->qemuDomainAttach(conn, pid, flags);
|
ret = conn->driver->qemuDomainAttach(conn, pid_value, flags);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
goto error;
|
goto error;
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -18,7 +18,7 @@ provider libvirt {
|
|||||||
|
|
||||||
# file: src/rpc/virnetsocket.c
|
# file: src/rpc/virnetsocket.c
|
||||||
# prefix: rpc
|
# prefix: rpc
|
||||||
probe rpc_socket_new(void *sock, int refs, int fd, int errfd, int pid, const char *localAddr, const char *remoteAddr);
|
probe rpc_socket_new(void *sock, int refs, int fd, int errfd, pid_t pid, const char *localAddr, const char *remoteAddr);
|
||||||
probe rpc_socket_send_fd(void *sock, int fd);
|
probe rpc_socket_send_fd(void *sock, int fd);
|
||||||
probe rpc_socket_recv_fd(void *sock, int fd);
|
probe rpc_socket_recv_fd(void *sock, int fd);
|
||||||
probe rpc_socket_ref(void *sock, int refs);
|
probe rpc_socket_ref(void *sock, int refs);
|
||||||
|
@ -7954,7 +7954,7 @@ cleanup:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int qemuParseProcFileStrings(unsigned int pid,
|
static int qemuParseProcFileStrings(int pid_value,
|
||||||
const char *name,
|
const char *name,
|
||||||
const char ***list)
|
const char ***list)
|
||||||
{
|
{
|
||||||
@ -7967,7 +7967,7 @@ static int qemuParseProcFileStrings(unsigned int pid,
|
|||||||
const char **str = NULL;
|
const char **str = NULL;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (virAsprintf(&path, "/proc/%u/%s", pid, name) < 0) {
|
if (virAsprintf(&path, "/proc/%d/%s", pid_value, name) < 0) {
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
@ -8014,7 +8014,7 @@ cleanup:
|
|||||||
}
|
}
|
||||||
|
|
||||||
virDomainDefPtr qemuParseCommandLinePid(virCapsPtr caps,
|
virDomainDefPtr qemuParseCommandLinePid(virCapsPtr caps,
|
||||||
unsigned int pid,
|
pid_t pid,
|
||||||
char **pidfile,
|
char **pidfile,
|
||||||
virDomainChrSourceDefPtr *monConfig,
|
virDomainChrSourceDefPtr *monConfig,
|
||||||
bool *monJSON)
|
bool *monJSON)
|
||||||
@ -8026,7 +8026,10 @@ virDomainDefPtr qemuParseCommandLinePid(virCapsPtr caps,
|
|||||||
char *emulator;
|
char *emulator;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (qemuParseProcFileStrings(pid, "cmdline", &progargv) < 0 ||
|
/* The parser requires /proc/pid, which only exists on platforms
|
||||||
|
* like Linux where pid_t fits in int. */
|
||||||
|
if ((int) pid != pid ||
|
||||||
|
qemuParseProcFileStrings(pid, "cmdline", &progargv) < 0 ||
|
||||||
qemuParseProcFileStrings(pid, "environ", &progenv) < 0)
|
qemuParseProcFileStrings(pid, "environ", &progenv) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -8034,7 +8037,7 @@ virDomainDefPtr qemuParseCommandLinePid(virCapsPtr caps,
|
|||||||
pidfile, monConfig, monJSON)))
|
pidfile, monConfig, monJSON)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (virAsprintf(&exepath, "/proc/%u/exe", pid) < 0) {
|
if (virAsprintf(&exepath, "/proc/%d/exe", (int) pid) < 0) {
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
@ -8042,7 +8045,7 @@ virDomainDefPtr qemuParseCommandLinePid(virCapsPtr caps,
|
|||||||
if (virFileResolveLink(exepath, &emulator) < 0) {
|
if (virFileResolveLink(exepath, &emulator) < 0) {
|
||||||
virReportSystemError(errno,
|
virReportSystemError(errno,
|
||||||
_("Unable to resolve %s for pid %u"),
|
_("Unable to resolve %s for pid %u"),
|
||||||
exepath, pid);
|
exepath, (int) pid);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
VIR_FREE(def->emulator);
|
VIR_FREE(def->emulator);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* qemu_command.h: QEMU command generation
|
* qemu_command.h: QEMU command generation
|
||||||
*
|
*
|
||||||
* Copyright (C) 2006-2011 Red Hat, Inc.
|
* Copyright (C) 2006-2012 Red Hat, Inc.
|
||||||
* Copyright (C) 2006 Daniel P. Berrange
|
* Copyright (C) 2006 Daniel P. Berrange
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
@ -170,7 +170,7 @@ virDomainDefPtr qemuParseCommandLineString(virCapsPtr caps,
|
|||||||
virDomainChrSourceDefPtr *monConfig,
|
virDomainChrSourceDefPtr *monConfig,
|
||||||
bool *monJSON);
|
bool *monJSON);
|
||||||
virDomainDefPtr qemuParseCommandLinePid(virCapsPtr caps,
|
virDomainDefPtr qemuParseCommandLinePid(virCapsPtr caps,
|
||||||
unsigned int pid,
|
pid_t pid,
|
||||||
char **pidfile,
|
char **pidfile,
|
||||||
virDomainChrSourceDefPtr *monConfig,
|
virDomainChrSourceDefPtr *monConfig,
|
||||||
bool *monJSON);
|
bool *monJSON);
|
||||||
|
@ -1056,7 +1056,7 @@ cleanup:
|
|||||||
|
|
||||||
static int
|
static int
|
||||||
qemudGetProcessInfo(unsigned long long *cpuTime, int *lastCpu, long *vm_rss,
|
qemudGetProcessInfo(unsigned long long *cpuTime, int *lastCpu, long *vm_rss,
|
||||||
int pid, int tid)
|
pid_t pid, int tid)
|
||||||
{
|
{
|
||||||
char *proc;
|
char *proc;
|
||||||
FILE *pidinfo;
|
FILE *pidinfo;
|
||||||
@ -1065,10 +1065,12 @@ qemudGetProcessInfo(unsigned long long *cpuTime, int *lastCpu, long *vm_rss,
|
|||||||
int cpu;
|
int cpu;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
/* In general, we cannot assume pid_t fits in int; but /proc parsing
|
||||||
|
* is specific to Linux where int works fine. */
|
||||||
if (tid)
|
if (tid)
|
||||||
ret = virAsprintf(&proc, "/proc/%d/task/%d/stat", pid, tid);
|
ret = virAsprintf(&proc, "/proc/%d/task/%d/stat", (int) pid, tid);
|
||||||
else
|
else
|
||||||
ret = virAsprintf(&proc, "/proc/%d/stat", pid);
|
ret = virAsprintf(&proc, "/proc/%d/stat", (int) pid);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@ -1120,7 +1122,7 @@ qemudGetProcessInfo(unsigned long long *cpuTime, int *lastCpu, long *vm_rss,
|
|||||||
|
|
||||||
|
|
||||||
VIR_DEBUG("Got status for %d/%d user=%llu sys=%llu cpu=%d rss=%ld",
|
VIR_DEBUG("Got status for %d/%d user=%llu sys=%llu cpu=%d rss=%ld",
|
||||||
pid, tid, usertime, systime, cpu, rss);
|
(int) pid, tid, usertime, systime, cpu, rss);
|
||||||
|
|
||||||
VIR_FORCE_FCLOSE(pidinfo);
|
VIR_FORCE_FCLOSE(pidinfo);
|
||||||
|
|
||||||
@ -11147,7 +11149,7 @@ cleanup:
|
|||||||
|
|
||||||
|
|
||||||
static virDomainPtr qemuDomainAttach(virConnectPtr conn,
|
static virDomainPtr qemuDomainAttach(virConnectPtr conn,
|
||||||
unsigned int pid,
|
unsigned int pid_value,
|
||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
struct qemud_driver *driver = conn->privateData;
|
struct qemud_driver *driver = conn->privateData;
|
||||||
@ -11156,6 +11158,7 @@ static virDomainPtr qemuDomainAttach(virConnectPtr conn,
|
|||||||
virDomainPtr dom = NULL;
|
virDomainPtr dom = NULL;
|
||||||
virDomainChrSourceDefPtr monConfig = NULL;
|
virDomainChrSourceDefPtr monConfig = NULL;
|
||||||
bool monJSON = false;
|
bool monJSON = false;
|
||||||
|
pid_t pid = pid_value;
|
||||||
char *pidfile = NULL;
|
char *pidfile = NULL;
|
||||||
|
|
||||||
virCheckFlags(0, NULL);
|
virCheckFlags(0, NULL);
|
||||||
@ -11168,19 +11171,20 @@ static virDomainPtr qemuDomainAttach(virConnectPtr conn,
|
|||||||
|
|
||||||
if (!monConfig) {
|
if (!monConfig) {
|
||||||
qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
_("No monitor connection for pid %u"),
|
_("No monitor connection for pid %u"), pid_value);
|
||||||
pid);
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
if (monConfig->type != VIR_DOMAIN_CHR_TYPE_UNIX) {
|
if (monConfig->type != VIR_DOMAIN_CHR_TYPE_UNIX) {
|
||||||
qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
_("Cannot connect to monitor connection of type '%s' for pid %u"),
|
_("Cannot connect to monitor connection of type '%s' "
|
||||||
virDomainChrTypeToString(monConfig->type), pid);
|
"for pid %u"),
|
||||||
|
virDomainChrTypeToString(monConfig->type),
|
||||||
|
pid_value);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(def->name) &&
|
if (!(def->name) &&
|
||||||
virAsprintf(&def->name, "attach-pid-%u", pid) < 0) {
|
virAsprintf(&def->name, "attach-pid-%u", pid_value) < 0) {
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
@ -3844,7 +3844,7 @@ retry:
|
|||||||
int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED,
|
int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||||
struct qemud_driver *driver,
|
struct qemud_driver *driver,
|
||||||
virDomainObjPtr vm,
|
virDomainObjPtr vm,
|
||||||
int pid,
|
pid_t pid,
|
||||||
const char *pidfile,
|
const char *pidfile,
|
||||||
virDomainChrSourceDefPtr monConfig,
|
virDomainChrSourceDefPtr monConfig,
|
||||||
bool monJSON)
|
bool monJSON)
|
||||||
|
@ -63,7 +63,7 @@ void qemuProcessStop(struct qemud_driver *driver,
|
|||||||
int qemuProcessAttach(virConnectPtr conn,
|
int qemuProcessAttach(virConnectPtr conn,
|
||||||
struct qemud_driver *driver,
|
struct qemud_driver *driver,
|
||||||
virDomainObjPtr vm,
|
virDomainObjPtr vm,
|
||||||
int pid,
|
pid_t pid,
|
||||||
const char *pidfile,
|
const char *pidfile,
|
||||||
virDomainChrSourceDefPtr monConfig,
|
virDomainChrSourceDefPtr monConfig,
|
||||||
bool monJSON);
|
bool monJSON);
|
||||||
|
@ -13,7 +13,7 @@ struct qemu_monitor_command_ret {
|
|||||||
remote_nonnull_string result;
|
remote_nonnull_string result;
|
||||||
};
|
};
|
||||||
struct qemu_domain_attach_args {
|
struct qemu_domain_attach_args {
|
||||||
u_int pid;
|
u_int pid_value;
|
||||||
u_int flags;
|
u_int flags;
|
||||||
};
|
};
|
||||||
struct qemu_domain_attach_ret {
|
struct qemu_domain_attach_ret {
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
* remote_internal driver and libvirtd. This protocol is
|
* remote_internal driver and libvirtd. This protocol is
|
||||||
* internal and may change at any time.
|
* internal and may change at any time.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2010-2011 Red Hat, Inc.
|
* Copyright (C) 2010-2012 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
|
||||||
@ -39,7 +39,7 @@ struct qemu_monitor_command_ret {
|
|||||||
|
|
||||||
|
|
||||||
struct qemu_domain_attach_args {
|
struct qemu_domain_attach_args {
|
||||||
unsigned int pid;
|
unsigned int pid_value;
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2010-2011 Red Hat, Inc.
|
* Copyright (C) 2010-2012 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
|
||||||
@ -94,9 +94,10 @@ static const char * virSecurityDACGetDOI(virSecurityManagerPtr mgr ATTRIBUTE_UNU
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
virSecurityDACSetOwnership(const char *path, int uid, int gid)
|
virSecurityDACSetOwnership(const char *path, uid_t uid, gid_t gid)
|
||||||
{
|
{
|
||||||
VIR_INFO("Setting DAC user and group on '%s' to '%d:%d'", path, uid, gid);
|
VIR_INFO("Setting DAC user and group on '%s' to '%ld:%ld'",
|
||||||
|
path, (long) uid, (long) gid);
|
||||||
|
|
||||||
if (chown(path, uid, gid) < 0) {
|
if (chown(path, uid, gid) < 0) {
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
@ -111,18 +112,22 @@ virSecurityDACSetOwnership(const char *path, int uid, int gid)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (chown_errno == EOPNOTSUPP || chown_errno == EINVAL) {
|
if (chown_errno == EOPNOTSUPP || chown_errno == EINVAL) {
|
||||||
VIR_INFO("Setting user and group to '%d:%d' on '%s' not supported by filesystem",
|
VIR_INFO("Setting user and group to '%ld:%ld' on '%s' not "
|
||||||
uid, gid, path);
|
"supported by filesystem",
|
||||||
|
(long) uid, (long) gid, path);
|
||||||
} else if (chown_errno == EPERM) {
|
} else if (chown_errno == EPERM) {
|
||||||
VIR_INFO("Setting user and group to '%d:%d' on '%s' not permitted",
|
VIR_INFO("Setting user and group to '%ld:%ld' on '%s' not "
|
||||||
uid, gid, path);
|
"permitted",
|
||||||
|
(long) uid, (long) gid, path);
|
||||||
} else if (chown_errno == EROFS) {
|
} else if (chown_errno == EROFS) {
|
||||||
VIR_INFO("Setting user and group to '%d:%d' on '%s' not possible on readonly filesystem",
|
VIR_INFO("Setting user and group to '%ld:%ld' on '%s' not "
|
||||||
uid, gid, path);
|
"possible on readonly filesystem",
|
||||||
|
(long) uid, (long) gid, path);
|
||||||
} else {
|
} else {
|
||||||
virReportSystemError(chown_errno,
|
virReportSystemError(chown_errno,
|
||||||
_("unable to set user and group to '%d:%d' on '%s'"),
|
_("unable to set user and group to '%ld:%ld' "
|
||||||
uid, gid, path);
|
"on '%s'"),
|
||||||
|
(long) uid, (long) gid, path);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* uml_driver.c: core driver methods for managing UML guests
|
* uml_driver.c: core driver methods for managing UML guests
|
||||||
*
|
*
|
||||||
* Copyright (C) 2006-2011 Red Hat, Inc.
|
* Copyright (C) 2006-2012 Red Hat, Inc.
|
||||||
* Copyright (C) 2006-2008 Daniel P. Berrange
|
* Copyright (C) 2006-2008 Daniel P. Berrange
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
@ -1240,13 +1240,13 @@ static char *umlGetCapabilities(virConnectPtr conn) {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int umlGetProcessInfo(unsigned long long *cpuTime, int pid)
|
static int umlGetProcessInfo(unsigned long long *cpuTime, pid_t pid)
|
||||||
{
|
{
|
||||||
char *proc;
|
char *proc;
|
||||||
FILE *pidinfo;
|
FILE *pidinfo;
|
||||||
unsigned long long usertime, systime;
|
unsigned long long usertime, systime;
|
||||||
|
|
||||||
if (virAsprintf(&proc, "/proc/%d/stat", pid) < 0) {
|
if (virAsprintf(&proc, "/proc/%lld/stat", (long long) pid) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1598,19 +1598,20 @@ static int virCgroupKillInternal(virCgroupPtr group, int signum, virHashTablePtr
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
} else {
|
} else {
|
||||||
while (!feof(fp)) {
|
while (!feof(fp)) {
|
||||||
unsigned long pid;
|
unsigned long pid_value;
|
||||||
if (fscanf(fp, "%lu", &pid) != 1) {
|
if (fscanf(fp, "%lu", &pid_value) != 1) {
|
||||||
if (feof(fp))
|
if (feof(fp))
|
||||||
break;
|
break;
|
||||||
rc = -errno;
|
rc = -errno;
|
||||||
VIR_DEBUG("Failed to read %s: %m\n", keypath);
|
VIR_DEBUG("Failed to read %s: %m\n", keypath);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
if (virHashLookup(pids, (void*)pid))
|
if (virHashLookup(pids, (void*)pid_value))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
VIR_DEBUG("pid=%lu", pid);
|
VIR_DEBUG("pid=%lu", pid_value);
|
||||||
if (kill((pid_t)pid, signum) < 0) {
|
/* Cgroups is a Linux concept, so this cast is safe. */
|
||||||
|
if (kill((pid_t)pid_value, signum) < 0) {
|
||||||
if (errno != ESRCH) {
|
if (errno != ESRCH) {
|
||||||
rc = -errno;
|
rc = -errno;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -1621,7 +1622,7 @@ static int virCgroupKillInternal(virCgroupPtr group, int signum, virHashTablePtr
|
|||||||
done = false;
|
done = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ignore_value(virHashAddEntry(pids, (void*)pid, (void*)1));
|
ignore_value(virHashAddEntry(pids, (void*)pid_value, (void*)1));
|
||||||
}
|
}
|
||||||
VIR_FORCE_FCLOSE(fp);
|
VIR_FORCE_FCLOSE(fp);
|
||||||
}
|
}
|
||||||
@ -1639,8 +1640,8 @@ cleanup:
|
|||||||
|
|
||||||
static uint32_t virCgroupPidCode(const void *name, uint32_t seed)
|
static uint32_t virCgroupPidCode(const void *name, uint32_t seed)
|
||||||
{
|
{
|
||||||
unsigned long pid = (unsigned long)(intptr_t)name;
|
unsigned long pid_value = (unsigned long)(intptr_t)name;
|
||||||
return virHashCodeGen(&pid, sizeof(pid), seed);
|
return virHashCodeGen(&pid_value, sizeof(pid_value), seed);
|
||||||
}
|
}
|
||||||
static bool virCgroupPidEqual(const void *namea, const void *nameb)
|
static bool virCgroupPidEqual(const void *namea, const void *nameb)
|
||||||
{
|
{
|
||||||
|
@ -443,7 +443,7 @@ int virNetDevSetMTUFromDevice(const char *ifname,
|
|||||||
*
|
*
|
||||||
* Returns 0 on success or -1 in case of error
|
* Returns 0 on success or -1 in case of error
|
||||||
*/
|
*/
|
||||||
int virNetDevSetNamespace(const char *ifname, int pidInNs)
|
int virNetDevSetNamespace(const char *ifname, pid_t pidInNs)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
char *pid = NULL;
|
char *pid = NULL;
|
||||||
@ -451,7 +451,7 @@ int virNetDevSetNamespace(const char *ifname, int pidInNs)
|
|||||||
"ip", "link", "set", ifname, "netns", NULL, NULL
|
"ip", "link", "set", ifname, "netns", NULL, NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
if (virAsprintf(&pid, "%d", pidInNs) == -1) {
|
if (virAsprintf(&pid, "%lld", (long long) pidInNs) == -1) {
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -73,7 +73,7 @@ int virNetDevSetMTUFromDevice(const char *ifname,
|
|||||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
|
||||||
int virNetDevGetMTU(const char *ifname)
|
int virNetDevGetMTU(const char *ifname)
|
||||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
|
||||||
int virNetDevSetNamespace(const char *ifname, int pidInNs)
|
int virNetDevSetNamespace(const char *ifname, pid_t pidInNs)
|
||||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
|
||||||
int virNetDevSetName(const char *ifname, const char *newifname)
|
int virNetDevSetName(const char *ifname, const char *newifname)
|
||||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2011 Red Hat, Inc.
|
* Copyright (C) 2011-2012 Red Hat, Inc.
|
||||||
* Copyright 2010, diateam (www.diateam.net)
|
* Copyright 2010, diateam (www.diateam.net)
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
@ -457,7 +457,7 @@ vmwareExtractPid(const char * vmxPath)
|
|||||||
FILE *logFile = NULL;
|
FILE *logFile = NULL;
|
||||||
char line[1024];
|
char line[1024];
|
||||||
char *tmp = NULL;
|
char *tmp = NULL;
|
||||||
int pid = -1;
|
int pid_value = -1;
|
||||||
|
|
||||||
if ((vmxDir = mdir_name(vmxPath)) == NULL)
|
if ((vmxDir = mdir_name(vmxPath)) == NULL)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -485,7 +485,9 @@ vmwareExtractPid(const char * vmxPath)
|
|||||||
|
|
||||||
tmp += strlen(" pid=");
|
tmp += strlen(" pid=");
|
||||||
|
|
||||||
if (virStrToLong_i(tmp, &tmp, 10, &pid) < 0 || *tmp != ' ') {
|
/* Although 64-bit windows allows 64-bit pid_t, a domain id has to be
|
||||||
|
* 32 bits. For now, we just reject pid values that overflow int. */
|
||||||
|
if (virStrToLong_i(tmp, &tmp, 10, &pid_value) < 0 || *tmp != ' ') {
|
||||||
vmwareError(VIR_ERR_INTERNAL_ERROR, "%s",
|
vmwareError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
_("cannot parse pid in vmware log file"));
|
_("cannot parse pid in vmware log file"));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -495,7 +497,7 @@ cleanup:
|
|||||||
VIR_FREE(vmxDir);
|
VIR_FREE(vmxDir);
|
||||||
VIR_FREE(logFilePath);
|
VIR_FREE(logFilePath);
|
||||||
VIR_FORCE_FCLOSE(logFile);
|
VIR_FORCE_FCLOSE(logFile);
|
||||||
return pid;
|
return pid_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
char *
|
||||||
|
@ -294,7 +294,7 @@ virtTestCaptureProgramOutput(const char *const argv[], char **buf, int maxlen)
|
|||||||
if (pipe(pipefd) < 0)
|
if (pipe(pipefd) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
int pid = fork();
|
pid_t pid = fork();
|
||||||
switch (pid) {
|
switch (pid) {
|
||||||
case 0:
|
case 0:
|
||||||
VIR_FORCE_CLOSE(pipefd[0]);
|
VIR_FORCE_CLOSE(pipefd[0]);
|
||||||
|
@ -16865,26 +16865,26 @@ cmdQemuAttach(vshControl *ctl, const vshCmd *cmd)
|
|||||||
virDomainPtr dom = NULL;
|
virDomainPtr dom = NULL;
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
unsigned int flags = 0;
|
unsigned int flags = 0;
|
||||||
unsigned int pid;
|
unsigned int pid_value; /* API uses unsigned int, not pid_t */
|
||||||
|
|
||||||
if (!vshConnectionUsability(ctl, ctl->conn))
|
if (!vshConnectionUsability(ctl, ctl->conn))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (vshCommandOptUInt(cmd, "pid", &pid) <= 0) {
|
if (vshCommandOptUInt(cmd, "pid", &pid_value) <= 0) {
|
||||||
vshError(ctl, "%s", _("missing pid value"));
|
vshError(ctl, "%s", _("missing pid value"));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(dom = virDomainQemuAttach(ctl->conn, pid, flags)))
|
if (!(dom = virDomainQemuAttach(ctl->conn, pid_value, flags)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (dom != NULL) {
|
if (dom != NULL) {
|
||||||
vshPrint(ctl, _("Domain %s attached to pid %u\n"),
|
vshPrint(ctl, _("Domain %s attached to pid %u\n"),
|
||||||
virDomainGetName(dom), pid);
|
virDomainGetName(dom), pid_value);
|
||||||
virDomainFree(dom);
|
virDomainFree(dom);
|
||||||
ret = true;
|
ret = true;
|
||||||
} else {
|
} else {
|
||||||
vshError(ctl, _("Failed to attach to pid %u"), pid);
|
vshError(ctl, _("Failed to attach to pid %u"), pid_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user