view toys/posix/kill.c @ 1189:95ae2805622f draft

Add Szabolcs Nagy's deflate/inflate code from git://git.suckless.org/flate Confirmed with him on IRC it's ok to use under toybox license, glued the files together and hammered square peg into round hole, no other changes yet.
author Rob Landley <rob@landley.net>
date Fri, 31 Jan 2014 06:01:30 -0600
parents 6cc69be43c42
children cae43f3cfff4
line wrap: on
line source

/* kill.c - a program to send signals to processes
 *
 * Copyright 2012 Daniel Walter <d.walter@0x90.at>
 *
 * See http://opengroup.org/onlinepubs/9699919799/utilities/kill.html

USE_KILL(NEWTOY(kill, "?s: l", TOYFLAG_BIN))

config KILL
  bool "kill"
  default y
  help
    usage: kill [-l [SIGNAL] | -s SIGNAL | -SIGNAL] pid...

    Send a signal to a process
*/

#define FOR_kill
#include "toys.h"

GLOBALS(
  char *signame;
)

void kill_main(void)
{
  int signum;
  char *tmp, **args = toys.optargs;
  pid_t pid;

  // list signal(s)
  if (toys.optflags & FLAG_l) {
    if (*args) {
      int signum = sig_to_num(*args);
      char *s = NULL;

      if (signum>=0) s = num_to_sig(signum&127);
      puts(s ? s : "UNKNOWN");
    } else sig_to_num(NULL);
    return;
  }

  // signal must come before pids, so "kill -9 -1" isn't confusing.

  if (!TT.signame && *args && **args=='-') TT.signame=*(args++)+1;
  if (TT.signame) {
    char *arg;
    int i = strtol(TT.signame, &arg, 10);
    if (!*arg) arg = num_to_sig(i);
    else arg = TT.signame;

    if (!arg || -1 == (signum = sig_to_num(arg)))
      error_exit("Unknown signal '%s'", arg);
  } else signum = SIGTERM;

  if (!*args) {
    toys.exithelp++;
    error_exit("missing argument");
  }

  while (*args) {
    char *arg = *(args++);

    pid = strtol(arg, &tmp, 10);
    if (*tmp || kill(pid, signum) < 0) error_msg("unknown pid '%s'", arg);
  }
}