[libvirt] [PATCH 3/4] Add a 'send-process-signal' command to virsh

Peter Krempa pkrempa at redhat.com
Wed Nov 28 13:10:27 UTC 2012


On 11/28/12 12:31, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
>
> * tools/virsh.c: Add send-process-signal
> * tools/virsh.pod: Document new command
> ---
>   tools/virsh-domain.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>   tools/virsh.pod      | 27 +++++++++++++++
>   2 files changed, 120 insertions(+)
>
> diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
> index cc47383..454cccf 100644
> --- a/tools/virsh-domain.c
> +++ b/tools/virsh-domain.c
> @@ -5901,6 +5901,98 @@ cleanup:
>   }
>
>   /*
> + * "send-process-signal" command
> + */
> +static const vshCmdInfo info_send_process_signal[] = {
> +    {"help", N_("Send signals to processes") },
> +    {"desc", N_("Send signals to processes in the guest") },
> +    {NULL, NULL}
> +};
> +
> +static const vshCmdOptDef opts_send_process_signal[] = {
> +    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or uuid")},
> +    {"pid", VSH_OT_DATA, VSH_OFLAG_REQ, N_("the process ID") },
> +    {"signame", VSH_OT_DATA, VSH_OFLAG_REQ, N_("the signal number or name") },
> +    {NULL, 0, 0, NULL}
> +};
> +
> +VIR_ENUM_DECL(virDomainProcessSignal)
> +VIR_ENUM_IMPL(virDomainProcessSignal,
> +              VIR_DOMAIN_PROCESS_SIGNAL_LAST,
> +              "nop", "hup", "int", "quit", "ill", /* 0-4 */
> +              "trap", "abrt", "bus", "fpe", "kill", /* 5-9 */
> +              "usr1", "segv", "usr2", "pipe", "alrm", /* 10-14 */
> +              "term", "stkflt", "chld", "cont", "stop", /* 15-19 */
> +              "tstp", "ttin", "ttou", "urg", "xcpu", /* 20-24 */
> +              "xfsz", "vtalrm", "prof", "winch", "poll", /* 25-29 */
> +              "pwr", "sys", "rtmin") /* 30-32 */
> +
> +static int getSignalNumber(const char *signame)

I'd prefix the function name with vsh as with other helpers.

> +{
> +    int signum;
> +
> +    if (virStrToLong_i(signame, NULL, 10, &signum) >= 0)
> +        return signum;
> +
> +    if (STRPREFIX(signame, "sig"))
> +        signame += 3;
> +
> +    if ((signum = virDomainProcessSignalTypeFromString(signame)) >= 0)
> +        return signum;
> +
> +    if (STRPREFIX(signame, "rtmin+")) {
> +        signame += 6;
> +        if (virStrToLong_i(signame, NULL, 10, &signum) >= 0)
> +            return signum + VIR_DOMAIN_PROCESS_SIGNAL_RTMIN;
> +    }
> +
> +    return -1;
> +}
> +
> +static bool
> +cmdSendProcessSignal(vshControl *ctl, const vshCmd *cmd)
> +{
> +    virDomainPtr dom;
> +    int ret = false;
> +    const char *pidstr;
> +    const char *signame;
> +    unsigned int pid_value;
> +    int signum;
> +
> +    if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
> +        return false;
> +
> +    if (vshCommandOptString(cmd, "pid", &pidstr) <= 0) {
> +        vshError(ctl, "%s", _("missing argument"));

You should print the name of the flag that has missing argument here as 
you happen to know it.

> +        return false;
> +    }
> +
> +    if (vshCommandOptString(cmd, "signame", &signame) <= 0) {
> +        vshError(ctl, "%s", _("missing argument"));

same here.

> +        return false;
> +    }
> +
> +    if (virStrToLong_ui(pidstr, NULL, 10, &pid_value) < 0) {
> +        vshError(ctl, _("malformed PID value: %s"), pidstr);
> +        goto cleanup;
> +    }
> +
> +    if ((signum = getSignalNumber(signame)) < 0) {
> +        vshError(ctl, _("malformed signal name: %s"), signame);
> +        goto cleanup;
> +    }
> +
> +    if (virDomainSendProcessSignal(dom, pid_value, signum, 0) < 0)
> +        goto cleanup;
> +
> +    ret = true;
> +
> +cleanup:
> +    virDomainFree(dom);
> +    return ret;
> +}
> +
> +/*
>    * "setmem" command
>    */
>   static const vshCmdInfo info_setmem[] = {
> @@ -8353,6 +8445,7 @@ const vshCmdDef domManagementCmds[] = {
>       {"edit", cmdEdit, opts_edit, info_edit, 0},
>       {"inject-nmi", cmdInjectNMI, opts_inject_nmi, info_inject_nmi, 0},
>       {"send-key", cmdSendKey, opts_send_key, info_send_key, 0},
> +    {"send-process-signal", cmdSendProcessSignal, opts_send_process_signal, info_send_process_signal, 0},
>       {"managedsave", cmdManagedSave, opts_managedsave, info_managedsave, 0},
>       {"managedsave-remove", cmdManagedSaveRemove, opts_managedsaveremove,
>        info_managedsaveremove, 0},
> diff --git a/tools/virsh.pod b/tools/virsh.pod
> index c4d505f..84c0f53 100644
> --- a/tools/virsh.pod
> +++ b/tools/virsh.pod
> @@ -1379,6 +1379,33 @@ B<Examples>
>     # send a tab, held for 1 second
>     virsh send-key --holdtime 1000 0xf
>
> +=item B<send-process-signal> I<domain-id> [I<--host-pid>] I<pid> I<signame>
> +
> +Send a signal I<signame> to the process identified by I<pid> running in
> +the virtual domain I<domain-id>. The I<pid> is a process ID in the virtual
> +domain namespace.
> +
> +The I<signame> argument may be either an integer signal constant number,
> +or one of the symbolic names:
> +
> +    "nop", "hup", "int", "quit", "ill",
> +    "trap", "abrt", "bus", "fpe", "kill",
> +    "usr1", "segv", "usr2", "pipe", "alrm",
> +    "term", "stkflt", "chld", "cont", "stop",
> +    "tstp", "ttin", "ttou", "urg", "xcpu",
> +    "xfsz", "vtalrm", "prof", "winch", "poll",
> +    "pwr", "sys", "rtmin"
> +
> +The symbol name may optionally be prefixed with 'sig'. The 'rtmin' signal
> +also allows an optional suffix "+<number>" to refer to other real time
> +signals.
> +
> +B<Examples>
> +  virsh send-process-signal myguest 1 15
> +  virsh send-process-signal myguest 1 term
> +  virsh send-process-signal myguest 1 sigterm
> +  virsh send-process-signal myguest 1 rtmin+12
> +
>   =item B<setmem> I<domain> B<size> [[I<--config>] [I<--live>] |
>   [I<--current>]]
>
>

Looks good. ACK with the nits fixed.

Peter




More information about the libvir-list mailing list