On Tue, 28 Nov 2000 18:07:42 +0100,
Georges Mariano <[EMAIL PROTECTED]> wrote :
>
> (ne peut on pas avoir plus que le pid ??)
Dans le source du module, voir la fonction trace_open :
static int trace_open (struct inode *inode, struct file *file)
{
struct task_struct *tsk = current;
printk (KERN_INFO "trace: process %d %s try open block major %d\n",
tsk->pid, tsk->comm, major);
return -ENODEV;
}
On voit que ce code extrait l'information au moyen de current (au
fait, pourquoi ne pas �crire directement current->pid ? Ici, tsk ne
change pas de valeur) qui est une variable fondamentale du noyau,
pointant vers une structure d�crivant la t�che en cours d'ex�cution �
l'instant o� trace_open est parcourue.
Il faut s'imaginer trace_open comme une sous-routine du processus
courant, appel�e lorsque ce dernier essaie de faire un open sur un
p�riph�rique de makeur 13. La seule diff�rence avec une routine
ordinaire est que le processus est alors en � mode noyau � et a alors
tous les privil�ges.
Il suffit donc de jeter un coup d'oeil � la d�finition d'une
task_struct pour voir comment extraire l'information recherch�e. Et
tout est possible puisque par d�finition, toute l'information sur
cette t�che se trouve dans cette structure.
Voir donc /usr/src/linux/include/linux/sched.h, ligne 230 dans un
2.2.18pre17. En ce qui concerne Les infos les plus int�ressantes, les
plus facilement disponibles sont probablement celles qu'Edouard a
utilis�es :
- current->comm, le nom de la commande (char[16)
- current->pid, le pid (pid_t, cad int)
Pour les arguments de la commande (i.e. la ligne de commande),
s'inspirer de la routine get_arg dans fs/proc/array.c : il faut en
fait lire directement dans la m�moire du processus.
Pour les variables d'environnement, voir la routine get_env dans le
m�me fichier.
Marc
P.S. Sinon, si tu veux �tre s�r d'attraper le coupable, tu disposes de
toute l'information n�cessaire pour lui faire faire un core dump : �a
ne passera pas inaper�u (tir� de la routine de traitement de SIGABRT) !
lock_kernel();
if (current->binfmt
&& current->binfmt->core_dump
&& current->binfmt->core_dump(signr, regs))
exit_code |= 0x80;
unlock_kernel();