- vap->va_type = VREG;
- vap->va_mode = nfstov_mode(*p++);
- if (error = VOP_CREATE(ndp, vap))
+ vap->va_type = IFTOVT(fxdr_unsigned(u_long, *p));
+ if (vap->va_type == VNON)
+ vap->va_type = VREG;
+ vap->va_mode = nfstov_mode(*p);
+ rdev = fxdr_unsigned(long, *(p+3));
+ if (vap->va_type == VREG) {
+ if (error = VOP_CREATE(ndp, vap))
+ nfsm_reply(0);
+ } else if (vap->va_type == VCHR || vap->va_type == VBLK ||
+ vap->va_type == VFIFO) {
+ if (vap->va_type == VCHR && rdev == 0xffffffff)
+ vap->va_type = VFIFO;
+ if (vap->va_type == VFIFO) {
+#ifndef FIFO
+ VOP_ABORTOP(ndp);
+ vput(ndp->ni_dvp);
+ error = ENXIO;
+ nfsm_reply(0);
+#endif /* FIFO */
+ } else if (error = suser(cred, (short *)0)) {
+ VOP_ABORTOP(ndp);
+ vput(ndp->ni_dvp);
+ nfsm_reply(0);
+ } else
+ vap->va_rdev = (dev_t)rdev;
+ if (error = VOP_MKNOD(ndp, vap, cred))
+ nfsm_reply(0);
+ ndp->ni_nameiop = LOOKUP | LOCKLEAF | HASBUF;
+ if (error = nfs_namei(ndp, fhp, len, &md, &dpos))
+ nfsm_reply(0);
+ } else {
+ VOP_ABORTOP(ndp);
+ vput(ndp->ni_dvp);
+ error = ENXIO;