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 messageReceived on Sat 12 Aug 2000 - 04:27:59 CEST