From 471d7380bd54c83cf6d090a144c288197b02db40 Mon Sep 17 00:00:00 2001 From: Zheng Da Date: Mon, 1 Feb 2010 15:13:08 +0100 Subject: check in libmachdev. --- libmachdev/trivfs_server.c | 154 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 libmachdev/trivfs_server.c (limited to 'libmachdev/trivfs_server.c') diff --git a/libmachdev/trivfs_server.c b/libmachdev/trivfs_server.c new file mode 100644 index 00000000..74b8e6b7 --- /dev/null +++ b/libmachdev/trivfs_server.c @@ -0,0 +1,154 @@ +#include +#include +#include +#include +#include +#include +#include + +extern struct port_bucket *port_bucket; + +/* Trivfs hooks. */ +int trivfs_fstype = FSTYPE_MISC; +int trivfs_fsid = 0; +int trivfs_support_read = 0; +int trivfs_support_write = 0; +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; + +/* Implementation of notify interface */ +kern_return_t +do_mach_notify_port_deleted (mach_port_t notify, + mach_port_t name) +{ + return EOPNOTSUPP; +} + +kern_return_t +do_mach_notify_msg_accepted (mach_port_t notify, + mach_port_t name) +{ + return EOPNOTSUPP; +} + +kern_return_t +do_mach_notify_port_destroyed (mach_port_t notify, + mach_port_t port) +{ + return EOPNOTSUPP; +} + +kern_return_t +do_mach_notify_no_senders (mach_port_t notify, + mach_port_mscount_t mscount) +{ + return ports_do_mach_notify_no_senders (notify, mscount); +} + +kern_return_t +do_mach_notify_send_once (mach_port_t notify) +{ + return EOPNOTSUPP; +} + +kern_return_t +do_mach_notify_dead_name (mach_port_t notify, + mach_port_t name) +{ + return EOPNOTSUPP; +} + +boolean_t +is_master_device (mach_port_t port) +{ + struct port_info *pi = ports_lookup_port (port_bucket, port, + trivfs_protid_portclasses[0]); + if (pi == NULL) + return FALSE; + + ports_port_deref (pi); + return TRUE; +} + +int trivfs_init() +{ + trivfs_cntl_portclasses[0] = ports_create_class (trivfs_clean_cntl, 0); + trivfs_protid_portclasses[0] = ports_create_class (trivfs_clean_protid, 0); + return 0; +} + +error_t +trivfs_goaway (struct trivfs_control *fsys, int flags) +{ + int count; + + fprintf (stderr, "check point 1\n"); + /* Stop new requests. */ + ports_inhibit_class_rpcs (trivfs_cntl_portclasses[0]); + ports_inhibit_class_rpcs (trivfs_protid_portclasses[0]); + + count = ports_count_class (trivfs_protid_portclasses[0]); + + fprintf (stderr, "check point 2\n"); + if (count && !(flags & FSYS_GOAWAY_FORCE)) + { + fprintf (stderr, "check point 4\n"); + /* We won't go away, so start things going again... */ + ports_enable_class (trivfs_protid_portclasses[0]); + ports_resume_class_rpcs (trivfs_cntl_portclasses[0]); + ports_resume_class_rpcs (trivfs_protid_portclasses[0]); + fprintf (stderr, "check point 5\n"); + return EBUSY; + } + + fprintf (stderr, "check point 3\n"); + pci_system_cleanup (); + fprintf (stderr, "trivfs goes away\n"); + exit (0); +} + +static int +demuxer (mach_msg_header_t *inp, mach_msg_header_t *outp) +{ + extern int device_server (mach_msg_header_t *, mach_msg_header_t *); + extern int notify_server (mach_msg_header_t *, mach_msg_header_t *); + return device_server (inp, outp) || notify_server (inp, outp) + || trivfs_demuxer (inp, outp); +} + +void +trivfs_modify_stat (struct trivfs_protid *cred, io_statbuf_t *stat) +{ +} + +void trivfs_server() +{ + mach_port_t bootstrap; + struct trivfs_control *fsys; + int err; + + task_get_bootstrap_port (mach_task_self (), &bootstrap); + if (bootstrap == MACH_PORT_NULL) + error (1, 0, "must be started as a translator"); + + fprintf (stderr, "after get bootstrap port\n"); + /* Reply to our parent. */ + err = trivfs_startup (bootstrap, 0, + trivfs_cntl_portclasses[0], port_bucket, + trivfs_protid_portclasses[0], port_bucket, &fsys); + mach_port_deallocate (mach_task_self (), bootstrap); + if (err) + error (1, err, "Contacting parent"); + fprintf (stderr, "start trivfs\n"); + + /* Launch. */ + do + { + ports_manage_port_operations_one_thread (port_bucket, demuxer, 0); + } while (trivfs_goaway (fsys, 0)); +} -- cgit v1.2.3 From 8733bb5763aacf170070005b00fc513a49887263 Mon Sep 17 00:00:00 2001 From: Zheng Da Date: Fri, 5 Feb 2010 15:13:02 +0100 Subject: trivfs server creates its own port bucket. --- libmachdev/trivfs_server.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'libmachdev/trivfs_server.c') diff --git a/libmachdev/trivfs_server.c b/libmachdev/trivfs_server.c index 74b8e6b7..4b34941e 100644 --- a/libmachdev/trivfs_server.c +++ b/libmachdev/trivfs_server.c @@ -6,7 +6,7 @@ #include #include -extern struct port_bucket *port_bucket; +static struct port_bucket *port_bucket; /* Trivfs hooks. */ int trivfs_fstype = FSTYPE_MISC; @@ -77,6 +77,7 @@ is_master_device (mach_port_t port) int trivfs_init() { + port_bucket = ports_create_bucket (); trivfs_cntl_portclasses[0] = ports_create_class (trivfs_clean_cntl, 0); trivfs_protid_portclasses[0] = ports_create_class (trivfs_clean_protid, 0); return 0; @@ -115,10 +116,14 @@ trivfs_goaway (struct trivfs_control *fsys, int flags) static int demuxer (mach_msg_header_t *inp, mach_msg_header_t *outp) { + int ret; extern int device_server (mach_msg_header_t *, mach_msg_header_t *); extern int notify_server (mach_msg_header_t *, mach_msg_header_t *); - return device_server (inp, outp) || notify_server (inp, outp) + fprintf (stderr, "before trivfs demuxer\n"); + ret = device_server (inp, outp) || notify_server (inp, outp) || trivfs_demuxer (inp, outp); + fprintf (stderr, "after trivfs demuxer\n"); + return ret; } void -- cgit v1.2.3 From 09eb08c9121d0d0386a1c65d5dace35c01b9911e Mon Sep 17 00:00:00 2001 From: Zheng Da Date: Fri, 5 Feb 2010 15:16:42 +0100 Subject: remove printing in the trivfs server. --- libmachdev/trivfs_server.c | 10 ---------- 1 file changed, 10 deletions(-) (limited to 'libmachdev/trivfs_server.c') diff --git a/libmachdev/trivfs_server.c b/libmachdev/trivfs_server.c index 4b34941e..96f016db 100644 --- a/libmachdev/trivfs_server.c +++ b/libmachdev/trivfs_server.c @@ -88,28 +88,22 @@ trivfs_goaway (struct trivfs_control *fsys, int flags) { int count; - fprintf (stderr, "check point 1\n"); /* Stop new requests. */ ports_inhibit_class_rpcs (trivfs_cntl_portclasses[0]); ports_inhibit_class_rpcs (trivfs_protid_portclasses[0]); count = ports_count_class (trivfs_protid_portclasses[0]); - fprintf (stderr, "check point 2\n"); if (count && !(flags & FSYS_GOAWAY_FORCE)) { - fprintf (stderr, "check point 4\n"); /* We won't go away, so start things going again... */ ports_enable_class (trivfs_protid_portclasses[0]); ports_resume_class_rpcs (trivfs_cntl_portclasses[0]); ports_resume_class_rpcs (trivfs_protid_portclasses[0]); - fprintf (stderr, "check point 5\n"); return EBUSY; } - fprintf (stderr, "check point 3\n"); pci_system_cleanup (); - fprintf (stderr, "trivfs goes away\n"); exit (0); } @@ -119,10 +113,8 @@ demuxer (mach_msg_header_t *inp, mach_msg_header_t *outp) int ret; extern int device_server (mach_msg_header_t *, mach_msg_header_t *); extern int notify_server (mach_msg_header_t *, mach_msg_header_t *); - fprintf (stderr, "before trivfs demuxer\n"); ret = device_server (inp, outp) || notify_server (inp, outp) || trivfs_demuxer (inp, outp); - fprintf (stderr, "after trivfs demuxer\n"); return ret; } @@ -141,7 +133,6 @@ void trivfs_server() if (bootstrap == MACH_PORT_NULL) error (1, 0, "must be started as a translator"); - fprintf (stderr, "after get bootstrap port\n"); /* Reply to our parent. */ err = trivfs_startup (bootstrap, 0, trivfs_cntl_portclasses[0], port_bucket, @@ -149,7 +140,6 @@ void trivfs_server() mach_port_deallocate (mach_task_self (), bootstrap); if (err) error (1, err, "Contacting parent"); - fprintf (stderr, "start trivfs\n"); /* Launch. */ do -- cgit v1.2.3 From 5e2cafe59319fdfa3e17b6bfcb8f655411d70618 Mon Sep 17 00:00:00 2001 From: Zheng Da Date: Wed, 16 Jun 2010 18:49:35 +0200 Subject: add fsys opt support in dde drivers. --- libmachdev/trivfs_server.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'libmachdev/trivfs_server.c') diff --git a/libmachdev/trivfs_server.c b/libmachdev/trivfs_server.c index 96f016db..4565c3d7 100644 --- a/libmachdev/trivfs_server.c +++ b/libmachdev/trivfs_server.c @@ -75,6 +75,21 @@ is_master_device (mach_port_t port) return TRUE; } +error_t +trivfs_append_args (struct trivfs_control *fsys, char **argz, size_t *argz_len) +{ + error_t err = 0; + +#define ADD_OPT(fmt, args...) \ + do { char buf[100]; \ + if (! err) { \ + snprintf (buf, sizeof buf, fmt , ##args); \ + err = argz_add (argz, argz_len, buf); } } while (0) + +#undef ADD_OPT + return err; +} + int trivfs_init() { port_bucket = ports_create_bucket (); -- cgit v1.2.3