summaryrefslogtreecommitdiff
path: root/term/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'term/main.c')
-rw-r--r--term/main.c38
1 files changed, 18 insertions, 20 deletions
diff --git a/term/main.c b/term/main.c
index 02c031b7..1f4057a6 100644
--- a/term/main.c
+++ b/term/main.c
@@ -55,11 +55,10 @@ demuxer (mach_msg_header_t *inp, mach_msg_header_t *outp)
int
main (int argc, char **argv)
{
- file_t file;
struct port_class *ourclass, *ourcntlclass;
struct port_class *peerclass, *peercntlclass;
struct trivfs_control **ourcntl, **peercntl;
- mach_port_t ctlport, bootstrap;
+ mach_port_t bootstrap;
enum {T_DEVICE, T_PTYMASTER, T_PTYSLAVE} type;
term_bucket = ports_create_bucket ();
@@ -133,17 +132,14 @@ main (int argc, char **argv)
}
/* Set our node */
- ctlport = trivfs_handle_port (MACH_PORT_NULL, ourcntlclass, term_bucket,
- ourclass, term_bucket);
- errno = fsys_startup (bootstrap, 0, ctlport, MACH_MSG_TYPE_MAKE_SEND, &file);
+ errno = trivfs_startup (bootstrap, 0,
+ ourcntlclass, term_bucket, ourclass, term_bucket,
+ ourcntl);
if (errno)
{
perror ("Starting translator");
exit (1);
}
- *ourcntl = ports_lookup_port (term_bucket, ctlport, ourcntlclass);
- assert (*ourcntl);
- (*ourcntl)->underlying = file;
/* For ptys, the nodename depends on which half is used. For now just use
the hook to store the nodename. */
@@ -153,19 +149,20 @@ main (int argc, char **argv)
if (peerclass)
{
char *peer_name = argv[3];
+ file_t file = file_name_lookup (peer_name, O_CREAT|O_NOTRANS, 0666);
+
+ if (file != MACH_PORT_NULL)
+ errno = 0;
+
+ if (! errno)
+ errno = trivfs_create_control (file, peercntlclass, term_bucket,
+ peerclass, term_bucket, peercntl);
+ if (! errno)
+ errno = file_set_translator (file, 0, FS_TRANS_EXCL | FS_TRANS_SET,
+ 0, 0, 0,
+ ports_get_right (*peercntl),
+ MACH_MSG_TYPE_MAKE_SEND);
- file = file_name_lookup (peer_name, O_CREAT|O_NOTRANS, 0666);
- if (file == MACH_PORT_NULL)
- {
- perror (peer_name);
- exit (1);
- }
- ctlport = trivfs_handle_port (file, peercntlclass, term_bucket,
- peerclass, term_bucket);
- *peercntl = ports_lookup_port (term_bucket, ctlport, peercntlclass);
- assert (*peercntl);
- errno = file_set_translator (file, 0, FS_TRANS_EXCL | FS_TRANS_SET,
- 0, 0, 0, ctlport, MACH_MSG_TYPE_MAKE_SEND);
if (errno)
{
perror (peer_name);
@@ -173,6 +170,7 @@ main (int argc, char **argv)
}
(*peercntl)->hook = peer_name;
+ ports_port_deref (*peercntl);
}
bzero (&termstate, sizeof (termstate));