On Tuesday 16 March 2004 11:39 am, Roman Bogorodskiy wrote:
> Hi,
>
>       I hope it's a right place for kernel module programming related
> questions, in another case I'd be glad if you point me to the right
> maillist.
>
> So, my aim is to log every file opening in `/tmp' dir. I've wrote a simple
> "syscall" module which replaces open(2) syscall. My new open(2) looks
>
> like this:
> >---cut 8<---
>
> static int
> new_open(struct proc *p, register struct open_args *uap)
> {
>         char name[NAME_MAX];
>               size_t size;
>
>       if((const void*)copyinstr(uap->path, name,
>               NAME_MAX, &size) == (const void*)EFAULT)
>                                       return(EFAULT);
>
>       if (name[0] == '/' && name[1] == 't' && name[2] == 'm'
>               && name[3] == 'p' && name[4] == '/') {
>               printf("open(2): %s pid: %i\n", name, (int)p->p_pid);
>       }
>
>       return (open(p, uap));
> }
>
> >---cut 9<---<
>
> But instead of a real pid I see something strange in logs, something
> like this:
>
> Mar 16 19:15:44 nov kernel: open(2): /tmp/asfdasfsaf pid: -1002890624
>
> What am I doing wrong?

If this is on current, then the first arg to your syscall should be 'struct 
thread *td', and you should try to printf td->td_proc->p_pid to get the pid.

Also, you might consider using strncmp() to make the code a bit easier to 
read, i.e.:

        if (strncmp(name, "/tmp/", 5) == 0)
                printf("open(2): %s by pid %d (%s)\n", name, td->td_proc->p_pid,
                    td->td_proc->p_comm);

-- 
John Baldwin <[EMAIL PROTECTED]>  <><  http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve"  =  http://www.FreeBSD.org
_______________________________________________
[EMAIL PROTECTED] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to