#include #include #include #include #include #include #include #include #include #include "util.h" #include "interfere.h" const char *progname="inject"; struct private { int fd; char *text; size_t len; }; int inject(struct process *proc, struct private *priv) { PROC_BEGIN(proc); while (priv->len) { proc_write(proc, priv->fd, priv->text, priv->len); if (proc->last_error) { if (proc->last_error==EINTR) continue; warn("write(pid %li, fd %i): %s\n", (long)proc->pid, priv->fd, strerror(proc->last_error)); goto out; } priv->text+=proc->retval; priv->len-=proc->retval; } out: PROC_END(proc); } int main(int argc, char *argv[]) { pid_t pid; int status; struct process proc; struct private priv; if (argc>0) setprogname(argv[0]); if (argc<4) die("Usage: %s pid fd text\n", progname); pid=str_to_pid(argv[1]); priv.fd=str_to_fd(argv[2]); priv.text=argv[3]; priv.len=strlen(argv[3]); if (pid==0) die("Invalid pid: 0\n"); proc_init(&proc); proc_attach(&proc, pid); while (1) { pid=waitpid(proc.pid, &status, 0); if (pid==-1) { if (errno==EINTR) continue; if (errno==ECHILD) break; die("waitpid: %s\n", strerror(errno)); } inject(&proc, &priv); } return 0; }