Folks,
Please review the patch, which adds two new types of events -
NOTE_STARTEXEC and NOTE_STOPEXEC, that could be used to get
notification when the image starts or stops executing. For example, it
could be used to monitor that a daemon is up and running and notify
administrator when for some reason in exits. I am running this code
for more than a year now without any problems.
Any comments and suggestions are welcome.
Thanks!
-Maxim
Index: src/lib/libc/sys/kqueue.2
===================================================================
RCS file: /home/ncvs/src/lib/libc/sys/kqueue.2,v
retrieving revision 1.28
diff -d -u -r1.28 kqueue.2
--- src/lib/libc/sys/kqueue.2 2 Jul 2002 21:04:00 -0000 1.28
+++ src/lib/libc/sys/kqueue.2 24 Oct 2002 06:57:41 -0000
@@ -292,7 +292,7 @@
.Va fflags ,
and returns when one or more of the requested events occurs on the descriptor.
The events to monitor are:
-.Bl -tag -width XXNOTE_RENAME
+.Bl -tag -width XXNOTE_STARTEXEC
.It NOTE_DELETE
.Fn unlink
was called on the file referenced by the descriptor.
@@ -310,6 +310,19 @@
Access to the file was revoked via
.Xr revoke 2
or the underlying fileystem was unmounted.
+.It NOTE_STARTEXEC
+The file referenced by the descriptor has been executed via
+.Xr execve 2 ,
+.Xr fork 2
+or similar call. The PID of the process is returned in
+.Va data .
+.It NOTE_STOPEXEC
+Execution of the file referenced by the descriptor ended. Triggered when
+the process associated with the file exited or was replaced with anoter
+image using
+.Xr execve 2
+or simial syscall. The PID of the process is returned in
+.Va data .
.El
.Pp
On return,
Index: src/sys/sys/event.h
===================================================================
RCS file: /home/ncvs/src/sys/sys/event.h,v
retrieving revision 1.21
diff -d -u -r1.21 event.h
--- src/sys/sys/event.h 29 Jun 2002 19:14:52 -0000 1.21
+++ src/sys/sys/event.h 24 Oct 2002 06:57:41 -0000
@@ -83,13 +83,15 @@
/*
* data/hint flags for EVFILT_VNODE, shared with userspace
*/
-#define NOTE_DELETE 0x0001 /* vnode was removed */
-#define NOTE_WRITE 0x0002 /* data contents changed */
-#define NOTE_EXTEND 0x0004 /* size increased */
-#define NOTE_ATTRIB 0x0008 /* attributes changed */
-#define NOTE_LINK 0x0010 /* link count changed */
-#define NOTE_RENAME 0x0020 /* vnode was renamed */
-#define NOTE_REVOKE 0x0040 /* vnode access was revoked */
+#define NOTE_DELETE 0x00100000 /* vnode was removed */
+#define NOTE_WRITE 0x00200000 /* data contents changed */
+#define NOTE_EXTEND 0x00400000 /* size increased */
+#define NOTE_ATTRIB 0x00800000 /* attributes changed */
+#define NOTE_LINK 0x01000000 /* link count changed */
+#define NOTE_RENAME 0x02000000 /* vnode was renamed */
+#define NOTE_REVOKE 0x04000000 /* vnode access was revoked */
+#define NOTE_STARTEXEC 0x08000000 /* vnode was executed */
+#define NOTE_STOPEXEC 0x10000000 /* vnode execution stopped */
/*
* data/hint flags for EVFILT_PROC, shared with userspace
@@ -98,6 +100,7 @@
#define NOTE_FORK 0x40000000 /* process forked */
#define NOTE_EXEC 0x20000000 /* process exec'd */
#define NOTE_PCTRLMASK 0xf0000000 /* mask for hint bits */
+/* Applies both to EVFILT_VNODE and EVFILT_PROC */
#define NOTE_PDATAMASK 0x000fffff /* mask for pid */
/* additional flags for EVFILT_PROC */
Index: src/sys/kern/kern_exec.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_exec.c,v
retrieving revision 1.193
diff -d -u -r1.193 kern_exec.c
--- src/sys/kern/kern_exec.c 11 Oct 2002 21:04:01 -0000 1.193
+++ src/sys/kern/kern_exec.c 24 Oct 2002 06:57:41 -0000
@@ -518,6 +518,8 @@
* to locking the proc lock.
*/
textvp = p->p_textvp;
+ if (textvp)
+ VN_KNOTE(textvp, NOTE_STOPEXEC | p->p_pid);
p->p_textvp = ndp->ni_vp;
/*
@@ -525,6 +527,7 @@
* as we're now a bona fide freshly-execed process.
*/
KNOTE(&p->p_klist, NOTE_EXEC);
+ VN_KNOTE(p->p_textvp, NOTE_STARTEXEC | p->p_pid);
p->p_flag &= ~P_INEXEC;
/*
Index: src/sys/kern/kern_exit.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_exit.c,v
retrieving revision 1.184
diff -d -u -r1.184 kern_exit.c
--- src/sys/kern/kern_exit.c 15 Oct 2002 00:14:32 -0000 1.184
+++ src/sys/kern/kern_exit.c 24 Oct 2002 06:58:03 -0000
@@ -440,6 +440,8 @@
* Notify interested parties of our demise.
*/
KNOTE(&p->p_klist, NOTE_EXIT);
+ if (p->p_textvp != NULL)
+ VN_KNOTE(p->p_textvp, NOTE_STOPEXEC | p->p_pid);
/*
* Notify parent that we're gone. If parent has the PS_NOCLDWAIT
Index: src/sys/kern/kern_fork.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_fork.c,v
retrieving revision 1.172
diff -d -u -r1.172 kern_fork.c
--- src/sys/kern/kern_fork.c 18 Oct 2002 17:45:41 -0000 1.172
+++ src/sys/kern/kern_fork.c 24 Oct 2002 06:58:03 -0000
@@ -724,6 +724,8 @@
* tell any interested parties about the new process
*/
KNOTE(&p1->p_klist, NOTE_FORK | p2->p_pid);
+ if (p2->p_textvp != NULL)
+ VN_KNOTE(p2->p_textvp, NOTE_STARTEXEC | p2->p_pid);
PROC_UNLOCK(p1);
/*