Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include "lib.h"
2
#include <fcntl.h>
3
#include <unistd.h>
4
#include <signal.h>
5
#include <string.h>
6
#include <stdio.h>
7
#include <errno.h>
8
 
9
static int
10
note(int pid, char *msg, char *fmt)
11
{
12
	int f;
13
	char pname[50];
14
 
15
	sprintf(pname, fmt, pid);
16
	f = open(pname, O_WRONLY);
17
	if(f < 0){
18
		errno = ESRCH;
19
		return -1;
20
	}
21
	if(msg != 0 && write(f, msg, strlen(msg)) < 0){
22
		close(f);
23
		errno = EPERM;
24
		return -1;
25
	}
26
	close(f);
27
	return 0;
28
}
29
 
30
int
31
kill(pid_t pid, int sig)
32
{
33
	char *msg;
34
	int sid, r, mpid;
35
 
36
	if(sig == 0)
37
		msg = 0;
38
	else {
39
		msg = _sigstring(sig);
40
		if(msg == 0) {
41
			errno = EINVAL;
42
			return -1;
43
		} 
44
	}
45
 
46
	if(pid < 0) {
47
		sid = getpgrp();
48
		mpid = getpid();
49
		if(setpgid(mpid, -pid) == 0) {
50
			r = note(mpid, msg, "/proc/%d/notepg");
51
			setpgid(mpid, sid);
52
		} else {
53
			r = -1;
54
		}
55
	} else if(pid == 0)
56
		r = note(getpid(), msg, "/proc/%d/notepg");
57
	else
58
		r = note(pid, msg, "/proc/%d/note");
59
	return r;
60
}