@@ -395,7 +395,7 @@ ncreate_9p(vnode_t dvp, vnode_t *vpp, struct componentname *cnp, struct vnode_at
395
395
cache_purge_negatives (dvp );
396
396
np = NTO9P (* vpp );
397
397
np -> iounit = iounit ;
398
- op = & np -> openfid [mode ];
398
+ op = & np -> openfid [vap -> va_type == VDIR ? OREAD : ORDWR ];
399
399
op -> fid = openfid ;
400
400
OSIncrementAtomic (& op -> ref );
401
401
nunlock_9p (np );
@@ -423,6 +423,19 @@ vnop_mknod_9p(struct vnop_mknod_args *ap)
423
423
return ncreate_9p (ap -> a_dvp , ap -> a_vpp , ap -> a_cnp , ap -> a_vap , ap -> a_context , NULL );
424
424
}
425
425
426
+ static openfid_9p *
427
+ ofidget (node_9p * np , int fflag )
428
+ {
429
+ switch (fflag & (FREAD |FWRITE )) {
430
+ case FREAD |FWRITE :
431
+ return & np -> openfid [ORDWR ];
432
+ case FWRITE :
433
+ return & np -> openfid [OWRITE ];
434
+ default :
435
+ return & np -> openfid [OREAD ];
436
+ }
437
+ }
438
+
426
439
static int
427
440
vnop_open_9p (struct vnop_open_args * ap )
428
441
{
@@ -434,7 +447,10 @@ vnop_open_9p(struct vnop_open_args *ap)
434
447
int e , flags , mode ;
435
448
436
449
TRACE ();
437
- flags = OFLAGS (ap -> a_mode );
450
+ flags = 0 ;
451
+ if (ap -> a_mode )
452
+ flags = OFLAGS (ap -> a_mode );
453
+
438
454
mode = flags & O_ACCMODE ;
439
455
CLR (flags , O_ACCMODE );
440
456
CLR (flags , O_DIRECTORY |O_NONBLOCK |O_EXCL |O_NOFOLLOW );
@@ -465,7 +481,7 @@ vnop_open_9p(struct vnop_open_args *ap)
465
481
466
482
np = NTO9P (ap -> a_vp );
467
483
nlock_9p (np , NODE_LCK_EXCLUSIVE );
468
- op = & np -> openfid [ mode & ORDWR ] ;
484
+ op = ofidget ( np , ap -> a_mode ) ;
469
485
if (op -> fid == NOFID ) {
470
486
if ((e = walk_9p (np -> nmp , np -> fid , NULL , 0 , & fid , & qid )))
471
487
goto error ;
@@ -493,13 +509,14 @@ vnop_close_9p(struct vnop_close_args *ap)
493
509
int e ;
494
510
495
511
TRACE ();
512
+ e = 0 ;
496
513
np = NTO9P (ap -> a_vp );
497
514
nlock_9p (np , NODE_LCK_EXCLUSIVE );
498
- e = EINVAL ;
499
- op = & np -> openfid [ OFLAGS ( ap -> a_fflag ) & ORDWR ];
500
- if ( op -> fid == NOFID )
515
+ op = ofidget ( np , ap -> a_fflag ) ;
516
+ if ( op -> fid == NOFID ) {
517
+ e = EBADF ;
501
518
goto error ;
502
-
519
+ }
503
520
if (OSDecrementAtomic (& op -> ref ) == 1 ) {
504
521
if (ISSET (np -> flags , NODE_MMAPPED ))
505
522
ubc_msync (np -> vp , 0 , ubc_getsize (np -> vp ), NULL , UBC_PUSHDIRTY |UBC_SYNC );
@@ -623,6 +640,25 @@ vnop_setattr_9p(struct vnop_setattr_args *ap)
623
640
d .mode = vap -> va_mode & 0777 ;
624
641
if (vnode_isdir (vp ))
625
642
SET (d .mode , DMDIR );
643
+ if (ISSET (np -> nmp -> flags , F_DOTU )) {
644
+ switch (vnode_vtype (vp )) {
645
+ case VBLK :
646
+ case VCHR :
647
+ SET (d .mode , DMDEVICE );
648
+ break ;
649
+ case VLNK :
650
+ SET (d .mode , DMSYMLINK );
651
+ break ;
652
+ case VSOCK :
653
+ SET (d .mode , DMSOCKET );
654
+ break ;
655
+ case VFIFO :
656
+ SET (d .mode , DMNAMEDPIPE );
657
+ break ;
658
+ default :
659
+ break ;
660
+ }
661
+ }
626
662
}
627
663
VATTR_SET_SUPPORTED (vap , va_mode );
628
664
0 commit comments