Re: Kerneltreiber

From: Greg Lehey <grog(at)lemis.com>
Date: Sat, 12 Aug 2000 11:57:29 +0930

On Friday, 11 August 2000 at 12:18:00 +0200, Titus von Boxberg wrote:
> Danke für die Antwort!
> Greg Lehey wrote:
>>
>>> 2) wie heißt der ioctl, um den treiber in NONBLOCK zu schalten?
>>> ist der überhaupt treiberübergreifend definiert?
>>
>> Meinst Du das O_NONBLOCK, das man beim open(2) angeben kann? Es wird
>> als Flagbit mit open(2) oder fcntl(2) angegeben, nicht mit einem
>> ioctl(2).
>
> Wo landet fcntl(NBLOCK) im treiber? (das wollte ich ursprünglich
> fragen :)

Gut, eigentlich ist das ein

  fcnt (fd, F_SETFL, O_NONBLOCK | O_RWDR)

oder ähnliches. Die Flags selbst sind in der struct file. Von
sys/kern_descrip.c:

int
fcntl(p, uap)
        struct proc *p;
        register struct fcntl_args *uap;
{
        register struct filedesc *fdp = p->p_fd;
        register struct file *fp;
        register char *pop;
        struct vnode *vp;
        int i, tmp, error, flg = F_POSIX;
        struct flock fl;
        u_int newmin;

        if ((unsigned)uap->fd >= fdp->fd_nfiles ||
            (fp = fdp->fd_ofiles[uap->fd]) == NULL)
                return (EBADF);
        pop = &fdp->fd_ofileflags[uap->fd];
        switch (uap->cmd) {
        (...)

        case F_SETFL:
                fp->f_flag &= ~FCNTLFLAGS;
                fp->f_flag |= FFLAGS(uap->arg & ~O_ACCMODE) & FCNTLFLAGS;
                tmp = fp->f_flag & FNONBLOCK;
                error = fo_ioctl(fp, FIONBIO, (caddr_t)&tmp, p);

Vermutlich willst Du wissen, wie der Treiber heran kommt. Das weiß
ich nicht, allerdings weiß ich auch nicht, wozu man das im Treiber
wissen sollte.

>>> und was ist "int devtype"?
>>
>> Eine Integervariable :-) Hängt natürlich vom Kontext ab.
>
> welchem kontext? woher kommt sie und wohin geht sie :-)

Welche der 33 devtypes, die ich im Kern gefunden habe?

Wenn's um open() und close() geht, heißt das dritte Parameter manchmal
devtype, manchmal mode. mode ist eigentlich besser; mit einigen
Abwandlungen ist das das dritte Parameter des open(2)-Aufrufs. Von
open() in kern/vfs_syscalls.c:

open(p, uap)
        struct proc *p;
        register struct open_args /* {
                syscallarg(char *) path;
                syscallarg(int) flags;
                syscallarg(int) mode;
        } */ *uap;

...

        cmode = ((SCARG(uap, mode) &~ fdp->fd_cmask) & ALLPERMS) &~ S_ISTXT;
        error = vn_open(&nd, &flags, cmode);

Greg

--
When replying to this message, please copy the original recipients.
For more information, see http://www.lemis.com/questions.html
Finger grog(at)lemis.com for PGP public key
See complete headers for address and phone numbers
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Sat 12 Aug 2000 - 04:27:59 CEST

search this site