#include #include #include #include #include "morse.h" static char *progname; void usage(void) { fprintf(stderr, "usage: %s PID\n", progname); exit(1); } /* ** We need this empty handler because ignored signals don't interrupt pause(). */ void feedbackhandler(int sig) { if (signal(SIGINT, feedbackhandler) == SIG_ERR) { _exit(1); } } /* ** Convenience wrapper: Send signal, check errors and wait for confirmation. */ void xkill(pid_t pid, int sig) { if (kill(pid, sig) < 0) { perror("kill"); exit(2); } pause(); } void send(pid_t pid, char *str) { char *cp; /* pointer to human-readable characters */ char *mp; /* pointer to morse code signals of one character */ for (cp=str; *cp; cp++) { if (!(mp = encode(*cp))) { /* unknown character */ continue; } for (; *mp; mp++) { xkill(pid, (*mp == '.') ? SIGUSR1 : SIGUSR2); } /* end of character */ xkill(pid, SIGTERM); } xkill(pid, SIGTERM); } int main(int argc, char *argv[]) { int pid; char ch; char buf[BUFSIZ]; progname = *argv; if (argc != 2) { usage(); } if (signal(SIGINT, feedbackhandler) == SIG_ERR) { perror("signal(SIGINT)"); _exit(1); } while (fgets(buf, sizeof buf, stdin)) { send(atoi(argv[1]), buf); } return 0; }