79 |
struct protid_hook |
struct protid_hook |
80 |
{ |
{ |
81 |
int refcnt; |
int refcnt; |
82 |
pid_t pid, pgrp; |
pid_t pid, pgrp, sid; |
83 |
}; |
}; |
84 |
|
|
85 |
void |
void |
415 |
/* Implement term_become_ctty as described in <hurd/term.defs>. */ |
/* Implement term_become_ctty as described in <hurd/term.defs>. */ |
416 |
kern_return_t |
kern_return_t |
417 |
S_term_open_ctty (mach_port_t arg, |
S_term_open_ctty (mach_port_t arg, |
418 |
pid_t pid, |
pid_t pid, |
419 |
pid_t pgrp, |
pid_t pgrp, |
420 |
mach_port_t *newpt, |
mach_port_t *newpt, |
421 |
mach_msg_type_name_t *newpttype) |
mach_msg_type_name_t *newpttype) |
422 |
{ |
{ |
423 |
error_t err; |
error_t err; |
424 |
struct trivfs_protid *newcred; |
struct trivfs_protid *newcred; |
427 |
if (!cred) |
if (!cred) |
428 |
return EOPNOTSUPP; |
return EOPNOTSUPP; |
429 |
|
|
430 |
|
if (pid <= 0 || pgrp <= 0) |
431 |
|
{ |
432 |
|
ports_port_deref (cred); |
433 |
|
return EINVAL; |
434 |
|
} |
435 |
|
|
436 |
mutex_lock (&global_lock); |
mutex_lock (&global_lock); |
437 |
|
|
438 |
if (!cred->po->openmodes & (O_READ|O_WRITE)) |
if (!cred->po->openmodes & (O_READ|O_WRITE)) |
451 |
|
|
452 |
hook->pid = pid; |
hook->pid = pid; |
453 |
hook->pgrp = pgrp; |
hook->pgrp = pgrp; |
454 |
|
hook->sid = getsid (pid); |
455 |
hook->refcnt = 1; |
hook->refcnt = 1; |
456 |
|
|
457 |
if (newcred->hook) |
if (newcred->hook) |
567 |
mach_port_t reply, |
mach_port_t reply, |
568 |
mach_msg_type_name_t replytype, |
mach_msg_type_name_t replytype, |
569 |
char *data, |
char *data, |
570 |
u_int datalen, |
size_t datalen, |
571 |
off_t offset, |
loff_t offset, |
572 |
int *amt) |
size_t *amt) |
573 |
{ |
{ |
574 |
int i; |
int i; |
575 |
int cancel; |
int cancel; |
644 |
mach_port_t reply, |
mach_port_t reply, |
645 |
mach_msg_type_name_t replytype, |
mach_msg_type_name_t replytype, |
646 |
char **data, |
char **data, |
647 |
u_int *datalen, |
size_t *datalen, |
648 |
off_t offset, |
loff_t offset, |
649 |
int amount) |
size_t amount) |
650 |
{ |
{ |
651 |
int cancel; |
int cancel; |
652 |
int i, max; |
int i, max; |
824 |
trivfs_S_io_readable (struct trivfs_protid *cred, |
trivfs_S_io_readable (struct trivfs_protid *cred, |
825 |
mach_port_t reply, |
mach_port_t reply, |
826 |
mach_msg_type_name_t replytype, |
mach_msg_type_name_t replytype, |
827 |
int *amt) |
size_t *amt) |
828 |
{ |
{ |
829 |
if (!cred) |
if (!cred) |
830 |
return EOPNOTSUPP; |
return EOPNOTSUPP; |
1641 |
mutex_lock (&global_lock); |
mutex_lock (&global_lock); |
1642 |
if (!(cred->po->openmodes & (O_READ|O_WRITE))) |
if (!(cred->po->openmodes & (O_READ|O_WRITE))) |
1643 |
err = EBADF; |
err = EBADF; |
1644 |
|
else if (!cred->hook |
1645 |
|
|| getsid (-pgrp) != ((struct protid_hook *)cred->hook)->sid) |
1646 |
|
err = EPERM; |
1647 |
else |
else |
1648 |
{ |
{ |
1649 |
termflags &= ~NO_OWNER; |
termflags &= ~NO_OWNER; |
2042 |
} |
} |
2043 |
|
|
2044 |
kern_return_t |
kern_return_t |
2045 |
trivfs_S_io_map (struct trivfs_protid *cred, |
trivfs_S_io_map (struct trivfs_protid *cred, |
2046 |
mach_port_t *rdobj, |
mach_port_t reply, |
2047 |
mach_msg_type_name_t *rdtype, |
mach_msg_type_name_t replyPoly, |
2048 |
mach_port_t *wrobj, |
mach_port_t *rdobj, |
2049 |
mach_msg_type_name_t *wrtype) |
mach_msg_type_name_t *rdtype, |
2050 |
|
mach_port_t *wrobj, |
2051 |
|
mach_msg_type_name_t *wrtype) |
2052 |
{ |
{ |
2053 |
return EOPNOTSUPP; |
return EOPNOTSUPP; |
2054 |
} |
} |