diff options
author | Michael I. Bushnell <mib@gnu.org> | 1995-08-31 20:01:44 +0000 |
---|---|---|
committer | Michael I. Bushnell <mib@gnu.org> | 1995-08-31 20:01:44 +0000 |
commit | 941c81aa67cdaf9c63f4835e61d33c182db5237b (patch) | |
tree | 05f62a9fc70a5eb5cf58d54bd98ffe11ee7cb8f7 /term/main.c | |
parent | 8832237df37b394f990e0746f2702f6400d1359e (diff) |
Initial revision
Diffstat (limited to 'term/main.c')
-rw-r--r-- | term/main.c | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/term/main.c b/term/main.c new file mode 100644 index 00000000..b1e384c3 --- /dev/null +++ b/term/main.c @@ -0,0 +1,147 @@ +/* + Copyright (C) 1995 Free Software Foundation, Inc. + Written by Michael I. Bushnell, p/BSG. + + This file is part of the GNU Hurd. + + The GNU Hurd is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2, or (at + your option) any later version. + + The GNU Hurd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ + +#include "term.h" +#include <hurd.h> +#include <fcntl.h> +#include <hurd/trivfs.h> +#include <stdio.h> +#include <hurd/fsys.h> +#include <string.h> + +int trivfs_fstype = FSTYPE_TERM; +int trivfs_fsid = 0; /* pid?? */ +int trivfs_support_read = 1; +int trivfs_support_write = 1; +int trivfs_support_exec = 0; + +int trivfs_allow_open = O_READ|O_WRITE; + +struct port_class *trivfs_protid_portclasses[1]; +struct port_class *trivfs_cntl_portclasses[1]; +int trivfs_protid_nportclasses = 1; +int trivfs_cntl_nportclasses = 1; + +int +demuxer (mach_msg_header_t *inp, mach_msg_header_t *outp) +{ + extern int term_server (mach_msg_header_t *, mach_msg_header_t *); + extern int tioctl_server (mach_msg_header_t *, mach_msg_header_t *); + extern int device_reply_server (mach_msg_header_t *, mach_msg_header_t *); + + return (trivfs_demuxer (inp, outp) + || term_server (inp, outp) + || tioctl_server (inp, outp) + || device_reply_server (inp, outp)); +} + +int +main (int argc, char **argv) +{ + file_t file; + mach_port_t ctlport, bootstrap; + + term_bucket = ports_create_bucket (); + + tty_cntl_class = ports_create_class (trivfs_clean_cntl, 0); + tty_class = ports_create_class (trivfs_clean_protid, 0); + cttyid_class = ports_create_class (0, 0); + + trivfs_protid_portclasses[0] = tty_class; + trivfs_cntl_portclasses[0] = tty_cntl_class; + + task_get_bootstrap_port (mach_task_self (), &bootstrap); + + if (bootstrap == MACH_PORT_NULL) + { + if (argc != 3) + { + fprintf (stderr, "Usage: term mach-dev-name ttyname\n"); + exit (1); + } + pterm_name = argv[1]; + nodename = argv[2]; + + /* Install control port in filesystem */ + file = file_name_lookup (nodename, O_CREAT|O_NOTRANS, 0666); + if (file == MACH_PORT_NULL) + { + perror (nodename); + exit (1); + } + + ctlport = trivfs_handle_port (file, tty_cntl_class, term_bucket, + tty_class, term_bucket); + termctl = ports_lookup_port (term_bucket, ctlport, tty_cntl_class); + assert (termctl); + + errno = file_set_translator (file, 0, FS_TRANS_EXCL | FS_TRANS_SET, + 0, 0, 0, ctlport, MACH_MSG_TYPE_MAKE_SEND); + if (errno) + { + perror ("setting translator"); + exit (1); + } + } + else + { + if (argc < 2 || argc > 3) + { + fprintf (stderr, "Usage (as translator): term mach-dev-name [ttyname]\n"); + exit (1); + } + pterm_name = argv[1]; + nodename = (argv[2] ?: ""); + + ctlport = trivfs_handle_port (MACH_PORT_NULL, tty_cntl_class, + term_bucket, tty_class, term_bucket); + errno = fsys_startup (bootstrap, ctlport, MACH_MSG_TYPE_MAKE_SEND, + &file); + if (errno) + { + perror ("Starting translator"); + exit (1); + } + termctl = ports_lookup_port (term_bucket, ctlport, 0); + assert (termctl); + termctl->underlying = file; + } + + bzero (&termstate, sizeof (termstate)); + termflags = NO_CARRIER; + output_psize = 0; + mutex_init (&global_lock); + + inputq = create_queue (256, 100, 300); + rawq = create_queue (256, 100, 300); + outputq = create_queue (256, 100, 300); + + condition_init (&carrier_alert); + condition_init (&select_alert); + condition_implies (inputq->wait, &select_alert); + condition_implies (outputq->wait, &select_alert); + + /* Launch */ + ports_manage_port_operations_multithread (term_bucket, demuxer, 0, 0, + 0, MACH_PORT_NULL); + + return 0; +} + |