#define _GNU_SOURCE

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <err.h>
#include <errno.h>
#include <string.h>
#include "../lpi.h"             // struct sig

void usage(void);

int
main(int argc, char *argv[])
{
    int entered_signo, signo, pid, i;
    int pass_sig_suffix;
    extern int NSIGS;           // defined in ../defs.c
    extern struct sig sigs[];   // defined in ../defs.c

    if (argc < 3) {
        usage();
        /* UNREACHABLE */
    }

    pass_sig_suffix = 0;
    entered_signo = -1;
    signo = -1;

    if (toInt(argv[1], &entered_signo) != 0)
        if (strncmp(argv[1], "SIG", 3))
            pass_sig_suffix = 3;

    for (i = 0; i < NSIGS; i++)
        if (strcmp(argv[1], sigs[i].name + pass_sig_suffix) == 0 ||
                entered_signo == sigs[i].no) {
            signo = sigs[i].no;
            break;
        }

    // signal number 0 = null signal
    if (signo < 0)
        errx(EXIT_FAILURE, "invalid signal: %s", argv[1]);

    for (i = 2; i < argc; i++) {
        if ((errno = toInt(argv[i], &pid)) != 0) {
            warn("toInt('%s')", argv[i]);
            continue;
        }
        if (kill(pid, signo) == -1) {
           warn("kill");
        }
    }
    exit(EXIT_SUCCESS);
}

void
usage(void)
{
    fprintf(stderr, "usage: %s signo|SIG<name>|name pid [...]\n",
            program_invocation_short_name);
    exit(EXIT_FAILURE);
}
