From owner-freebsd-hackers@FreeBSD.ORG Sun May 6 08:27:48 2007 Return-Path: X-Original-To: freebsd-hackers@freebsd.org Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id D093016A401 for ; Sun, 6 May 2007 08:27:48 +0000 (UTC) (envelope-from dds@aueb.gr) Received: from mx-out-01.forthnet.gr (mx-out.forthnet.gr [193.92.150.103]) by mx1.freebsd.org (Postfix) with ESMTP id 4F69213C455 for ; Sun, 6 May 2007 08:27:47 +0000 (UTC) (envelope-from dds@aueb.gr) Received: from mx-av-02.forthnet.gr (mx-av.forthnet.gr [193.92.150.27]) by mx-out-01.forthnet.gr (8.13.8/8.13.8) with ESMTP id l468Rk6V018564; Sun, 6 May 2007 11:27:46 +0300 Received: from MX-IN-02.forthnet.gr (mx-in-02.forthnet.gr [193.92.150.185]) by mx-av-02.forthnet.gr (8.14.1/8.14.1) with ESMTP id l468RkUn021490; Sun, 6 May 2007 11:27:46 +0300 Received: from [192.168.136.18] (ppp124-213.adsl.forthnet.gr [193.92.231.213]) by MX-IN-02.forthnet.gr (8.14.1/8.14.1) with ESMTP id l468Rioj024545; Sun, 6 May 2007 11:27:45 +0300 Authentication-Results: MX-IN-02.forthnet.gr from=dds@aueb.gr; sender-id=neutral; spf=neutral In-Reply-To: References: <463CCE1E.1080906@geri.cc.fer.hr> Mime-Version: 1.0 (Apple Message framework v752.2) Content-Type: text/plain; charset=US-ASCII; delsp=yes; format=flowed Message-Id: <457ABFA4-D793-4FD6-85E4-5CE380FE2CB9@aueb.gr> Content-Transfer-Encoding: 7bit From: Diomidis Spinellis Date: Sun, 6 May 2007 11:27:40 +0300 To: Sonja Milicic X-Mailer: Apple Mail (2.752.2) Cc: freebsd-hackers@freebsd.org Subject: Re: Writing to a file X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 06 May 2007 08:27:48 -0000 On May 5, 2007, at 10:29 PM, Diomidis Spinellis wrote: > On May 5, 2007, at 9:34 PM, Sonja Milicic wrote: >> I'm working on an IO logging utility for FreeBSD as my GSoC >> project, and >> I have some questions about writing a kernel functions that would >> open >> an existing or create a new file (with the file name as a parameter, >> returns a vnode * for the file) and write data to that file (with >> pointer to data as parameter). I've found some functions in existing >> code that do similar things and might help me understand how to >> solve my >> problem, but as there isn't much documentation out there I still >> don't >> understand a lot of things. So, could anyone please give me a >> detailed >> explanation of how to open a file in kernel and write to it - best >> data >> types to use, functions, what to look out for, maybe a link to >> tutorial >> or manual that deals with this (if such a thing exists), etc.? > > A good strategy for dealing with such questions is to look for code > that does a task similar to the one you want to implement. Two > kernel subsystems that come to my mind is the kernel logging > facility, which writes data to a user space process via a socket, > and the process accounting facility, which writes data to an > already opened file. There are reasons (performance, flexibility) > why these two facilities have been designed in this way, and it > would be a good idea to see whether some of their design decisions > are also applicable to your problem. Some clarifications on the above. You can find the kernel-side of the accounting code at /usr/src/sys/kern/kern_acct.c acct opens an existing file for appending; acct_process (look for vn_rdwr) will write to that file. Similarly, you can find the kernel-side of the system log code at / usr/src/sys/kern/subr_prf.c. The userland client, which actually writes the message buffers to files, is at /usr/src/usr.sbin/syslogd. In general, coding in the kernel environment is tricky. You have to be careful with locking, many standard C facilities are missing, and bugs can bring down the entire system. Therefore, it is often better to split complex tasks into two: a simple part in the kernel will communicate with a userland process, where you can put all the complexity. Another example of this pattern is the routing code. Diomidis Spinellis - http://www.spinellis.gr