Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

#include "lib.h"
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>

static int
note(int pid, char *msg, char *fmt)
{
        int f;
        char pname[50];

        sprintf(pname, fmt, pid);
        f = open(pname, O_WRONLY);
        if(f < 0){
                errno = ESRCH;
                return -1;
        }
        if(msg != 0 && write(f, msg, strlen(msg)) < 0){
                close(f);
                errno = EPERM;
                return -1;
        }
        close(f);
        return 0;
}

int
kill(pid_t pid, int sig)
{
        char *msg;
        int sid, r, mpid;

        if(sig == 0)
                msg = 0;
        else {
                msg = _sigstring(sig);
                if(msg == 0) {
                        errno = EINVAL;
                        return -1;
                } 
        }

        if(pid < 0) {
                sid = getpgrp();
                mpid = getpid();
                if(setpgid(mpid, -pid) == 0) {
                        r = note(mpid, msg, "/proc/%d/notepg");
                        setpgid(mpid, sid);
                } else {
                        r = -1;
                }
        } else if(pid == 0)
                r = note(getpid(), msg, "/proc/%d/notepg");
        else
                r = note(pid, msg, "/proc/%d/note");
        return r;
}