342 |
flags = O_RDWR; |
flags = O_RDWR; |
343 |
file = file_name_lookup_under (dirfile, name, flags | O_NOLINK, 0); |
file = file_name_lookup_under (dirfile, name, flags | O_NOLINK, 0); |
344 |
} |
} |
345 |
if (file == MACH_PORT_NULL && errno == EACCES) |
if (file == MACH_PORT_NULL && (errno == EACCES |
346 |
|
|| errno == EROFS || errno == EISDIR)) |
347 |
{ |
{ |
348 |
flags = O_READ|O_EXEC; |
flags = O_READ|O_EXEC; |
349 |
file = file_name_lookup_under (dirfile, name, flags | O_NOLINK, 0); |
file = file_name_lookup_under (dirfile, name, flags | O_NOLINK, 0); |
457 |
real_from_fake_mode (mode), &newfile); |
real_from_fake_mode (mode), &newfile); |
458 |
if (err == 0) |
if (err == 0) |
459 |
err = new_node (newfile, MACH_PORT_NULL, O_RDWR|O_EXEC, np); |
err = new_node (newfile, MACH_PORT_NULL, O_RDWR|O_EXEC, np); |
460 |
|
mutex_unlock (&dir->lock); |
461 |
return err; |
return err; |
462 |
} |
} |
463 |
|
|
468 |
file_t newfile = file_name_lookup_under (dir->nn->file, name, |
file_t newfile = file_name_lookup_under (dir->nn->file, name, |
469 |
O_CREAT|O_RDWR|O_EXEC, |
O_CREAT|O_RDWR|O_EXEC, |
470 |
real_from_fake_mode (mode)); |
real_from_fake_mode (mode)); |
471 |
|
mutex_unlock (&dir->lock); |
472 |
if (newfile == MACH_PORT_NULL) |
if (newfile == MACH_PORT_NULL) |
473 |
return errno; |
return errno; |
474 |
return new_node (newfile, MACH_PORT_NULL, O_RDWR|O_EXEC, np); |
return new_node (newfile, MACH_PORT_NULL, O_RDWR|O_EXEC, np); |
564 |
offsets, num_offsets, |
offsets, num_offsets, |
565 |
data, data_len); |
data, data_len); |
566 |
} |
} |
567 |
|
|
568 |
|
error_t |
569 |
|
netfs_S_io_map (struct protid *user, |
570 |
|
mach_port_t *rdobj, mach_msg_type_name_t *rdobjtype, |
571 |
|
mach_port_t *wrobj, mach_msg_type_name_t *wrobjtype) |
572 |
|
{ |
573 |
|
error_t err; |
574 |
|
|
575 |
|
if (!user) |
576 |
|
return EOPNOTSUPP; |
577 |
|
*rdobjtype = *wrobjtype = MACH_MSG_TYPE_MOVE_SEND; |
578 |
|
|
579 |
|
mutex_lock (&user->po->np->lock); |
580 |
|
err = io_map (user->po->np->nn->file, rdobj, wrobj); |
581 |
|
mutex_unlock (&user->po->np->lock); |
582 |
|
return err; |
583 |
|
} |
584 |
|
|
585 |
|
|
586 |
int |
int |
587 |
main (int argc, char **argv) |
main (int argc, char **argv) |