diff options
Diffstat (limited to 'devnode')
-rw-r--r-- | devnode/CVS/Entries | 6 | ||||
-rw-r--r-- | devnode/CVS/Repository | 1 | ||||
-rw-r--r-- | devnode/CVS/Root | 1 | ||||
-rw-r--r-- | devnode/CVS/Tag | 1 | ||||
-rw-r--r-- | devnode/ChangeLog | 34 | ||||
-rw-r--r-- | devnode/Makefile | 32 | ||||
-rw-r--r-- | devnode/README | 25 | ||||
-rw-r--r-- | devnode/device.defs | 1 | ||||
-rw-r--r-- | devnode/devnode.c | 362 | ||||
-rw-r--r-- | devnode/devnode.prof_d | 1 | ||||
-rw-r--r-- | devnode/notify.defs | 1 | ||||
-rw-r--r-- | devnode/ourdevice.defs | 383 | ||||
-rw-r--r-- | devnode/util.h | 42 |
13 files changed, 890 insertions, 0 deletions
diff --git a/devnode/CVS/Entries b/devnode/CVS/Entries new file mode 100644 index 00000000..a8d9b644 --- /dev/null +++ b/devnode/CVS/Entries @@ -0,0 +1,6 @@ +/Makefile/1.1.2.1/Sun Aug 17 19:15:08 2008//Tzhengda-soc2008-virt-branch +/util.h/1.1.2.2/Thu Aug 28 19:25:34 2008//Tzhengda-soc2008-virt-branch +/ChangeLog/1.1.2.5/Fri Sep 26 22:26:32 2008//Tzhengda-soc2008-virt-branch +/README/1.1.2.2/Fri Sep 26 22:16:13 2008//Tzhengda-soc2008-virt-branch +/devnode.c/1.1.2.5/Fri Sep 26 22:10:58 2008//Tzhengda-soc2008-virt-branch +D diff --git a/devnode/CVS/Repository b/devnode/CVS/Repository new file mode 100644 index 00000000..2adffeb8 --- /dev/null +++ b/devnode/CVS/Repository @@ -0,0 +1 @@ +hurd/devnode diff --git a/devnode/CVS/Root b/devnode/CVS/Root new file mode 100644 index 00000000..a10aa66d --- /dev/null +++ b/devnode/CVS/Root @@ -0,0 +1 @@ +:ext:zhengda@cvs.savannah.gnu.org:/sources/hurd diff --git a/devnode/CVS/Tag b/devnode/CVS/Tag new file mode 100644 index 00000000..7e454c6d --- /dev/null +++ b/devnode/CVS/Tag @@ -0,0 +1 @@ +Tzhengda-soc2008-virt-branch diff --git a/devnode/ChangeLog b/devnode/ChangeLog new file mode 100644 index 00000000..54ae55f4 --- /dev/null +++ b/devnode/ChangeLog @@ -0,0 +1,34 @@ +2008-09-26 Zheng Da <zhengda1936@gmail.com> + + * README: Update. + + * devnode.c (args_doc): New variable. + (options): Remove '-d' and change the description of '-n'. + (parse_opt): Get the device in ARGP_KEY_ARG instead of from '-d'. + (main): Set args_doc to the field of argp. + +2008-08-28 Zheng Da <zhengda1936@gmail.com> + + * devnode.c (ds_device_open): Return the error instead of stopping the + translator. + +2008-08-20 Zheng Da <zhengda1936@gmail.com> + + * devnode.c (ds_device_open): Test device_name before using it. + + * util.h (DEBUG): Remove the macro. + +2008-08-18 Zheng Da <zhengda1936@gmail.com> + + * README: New file. + + * devnode.c (options): Replace the option '-i' with '-d'. + (parse_opt): Handle the option '-d'. + +2008-08-17 Zheng Da <zhengda1936@gmail.com> + + * Makefile: New file. + + * util.h: New file. + + * devnode.c: New file. diff --git a/devnode/Makefile b/devnode/Makefile new file mode 100644 index 00000000..f4522564 --- /dev/null +++ b/devnode/Makefile @@ -0,0 +1,32 @@ +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 2008 Free Software Foundation, Inc. +# 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 the GNU Hurd; see the file COPYING. If not, write to +# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + +dir := devnode +makemode := server + +SRCS = devnode.c +LCLHDRS = util.h +DIST_FILES = ourdevice.defs notify.defs +HURDLIBS = ports trivfs fshelp shouldbeinlibc +target = devnode +MIGSTUBS = ourdeviceServer.o notifyServer.o +OBJS = $(SRCS:.c=.o) $(MIGSTUBS) + +include ../Makeconf + +ourdevice.defs: device.defs + $(CPP) $(CPPFLAGS) -x c $< | sed -e '/out[ ]*device[ ]*:[ ]*device_t/s/device_t/mach_port_send_t/' > $@ diff --git a/devnode/README b/devnode/README new file mode 100644 index 00000000..90ca27cc --- /dev/null +++ b/devnode/README @@ -0,0 +1,25 @@ +[Introduction] + +devnode is a translator that creates the device file for the kernel device. It provides another way for other programs to open the kernel device. +The device file should be created in /dev with the device name as its file name, so clients can find the device file easily. +Clients need to get the port to the devnode translator by calling file_name_lookup() and uses this port as a master device port to open the device by calling device_open(). The device name used in device_open() is specified by '-n' option of devnode. + + +[Usage] + +Usage: devnode [OPTION...] device +Hurd devnode translator. + + -n, --name=DEVICENAME Accept open from clients only with DEVICENAME + -M, --master_device=FILE Get a pseudo master device port + -?, --help Give this help list + --usage Give a short usage message + -V, --version Print program version + +The '-n' option specifies the device name used by clients in device_open(). It can be optional. If it's specified, clients must use the name to open the device. Otherwise, every device name used by clients in device_open() is acceptable. +The '-M' option specifies the file where devnode can get the master device port. This option can be useful to open the virtual interface created by eth-multiplexer, for example. + + +[Internal] + +devnode is very simple. It implements the server side functions in device.defs, so it can receive the request of opening a device from clients. Only ds_device_open is actually implemented, which opens the device and returns the port to the device. Normally, devnode shouldn't get other requests. diff --git a/devnode/device.defs b/devnode/device.defs new file mode 100644 index 00000000..70472689 --- /dev/null +++ b/devnode/device.defs @@ -0,0 +1 @@ +#include <device/device.defs> diff --git a/devnode/devnode.c b/devnode/devnode.c new file mode 100644 index 00000000..299de3c3 --- /dev/null +++ b/devnode/devnode.c @@ -0,0 +1,362 @@ +/* + Copyright (C) 2008 Free Software Foundation, Inc. + Written by Zheng Da. + + 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 the GNU Hurd; see the file COPYING. If not, write to + the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ + +/* + * This program is a translator that sits on the top of the network + * interface and helps socket servers open the interface. + */ + +#include <argp.h> +#include <errno.h> +#include <error.h> +#include <stddef.h> +#include <fcntl.h> + +#include <hurd.h> +#include <mach.h> +#include <device/device.h> +#include <hurd/trivfs.h> +#include <hurd/ports.h> + +#include "ourdevice_S.h" +#include "notify_S.h" +#include "util.h" + +/* The name of the network interface that the translator sits on. */ +static char *device_name; +/* The device name used by the socket servers. */ +static char *user_device_name; +static char *master_file; +/* The master device port for opening the interface. */ +static mach_port_t master_device; + +const char *argp_program_version = "devnode 0.1"; +const char *argp_program_bug_address = "<bug-hurd@gnu.org>"; +static const char args_doc[] = "device"; +static const char doc[] = "Hurd devnode translator."; +static const struct argp_option options[] = +{ + {"name", 'n', "DEVICENAME", 0, + "Define the device name used by clients in device_open()", 2}, + {"master-device", 'M', "FILE", 0, + "Get a pseudo master device port", 3}, + {0} +}; + +/* Port bucket we service requests on. */ +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; + +static int +devnode_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); +} + +/* 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; +} + +/* Implementation of device interface */ +kern_return_t +ds_xxx_device_set_status (device_t device, dev_flavor_t flavor, + dev_status_t status, size_t statu_cnt) +{ + return D_INVALID_OPERATION; +} + +kern_return_t +ds_xxx_device_get_status (device_t device, dev_flavor_t flavor, + dev_status_t status, size_t *statuscnt) +{ + return D_INVALID_OPERATION; +} + +kern_return_t +ds_xxx_device_set_filter (device_t device, mach_port_t rec, + int pri, filter_array_t filt, size_t len) +{ + return D_INVALID_OPERATION; +} + +kern_return_t +ds_device_open (mach_port_t master_port, mach_port_t reply_port, + mach_msg_type_name_t reply_portPoly, + dev_mode_t mode, dev_name_t name, mach_port_t *device, + mach_msg_type_name_t *devicetype) +{ + error_t err; + + debug ("ds_device_open is called\n"); + + if ((user_device_name && strcmp (user_device_name, name)) + || device_name == NULL) + return D_NO_SUCH_DEVICE; + + err = device_open (master_device, mode, device_name, device); + *devicetype = MACH_MSG_TYPE_MOVE_SEND; + return err; +} + +kern_return_t +ds_device_close (device_t device) +{ + return D_INVALID_OPERATION; +} + +kern_return_t +ds_device_write (device_t device, mach_port_t reply_port, + mach_msg_type_name_t reply_type, dev_mode_t mode, + recnum_t recnum, io_buf_ptr_t data, size_t datalen, + int *bytes_written) +{ + return D_INVALID_OPERATION; +} + +kern_return_t +ds_device_write_inband (device_t device, mach_port_t reply_port, + mach_msg_type_name_t reply_type, dev_mode_t mode, + recnum_t recnum, io_buf_ptr_inband_t data, + size_t datalen, int *bytes_written) +{ + return D_INVALID_OPERATION; +} + +kern_return_t +ds_device_read (device_t device, mach_port_t reply_port, + mach_msg_type_name_t reply_type, dev_mode_t mode, + recnum_t recnum, int bytes_wanted, + io_buf_ptr_t *data, size_t *datalen) +{ + return D_INVALID_OPERATION; +} + +kern_return_t +ds_device_read_inband (device_t device, mach_port_t reply_port, + mach_msg_type_name_t reply_type, dev_mode_t mode, + recnum_t recnum, int bytes_wanted, + io_buf_ptr_inband_t data, size_t *datalen) +{ + return D_INVALID_OPERATION; +} + +kern_return_t +ds_device_map (device_t device, vm_prot_t prot, vm_offset_t offset, + vm_size_t size, memory_object_t *pager, int unmap) +{ + return D_INVALID_OPERATION; +} + +kern_return_t +ds_device_set_status (device_t device, dev_flavor_t flavor, + dev_status_t status, size_t statuslen) +{ + return D_INVALID_OPERATION; +} + +kern_return_t +ds_device_get_status (device_t device, dev_flavor_t flavor, + dev_status_t status, size_t *statuslen) +{ + return D_INVALID_OPERATION; +} + +kern_return_t +ds_device_set_filter (device_t device, mach_port_t receive_port, + int priority, filter_array_t filter, size_t filterlen) +{ + return D_INVALID_OPERATION; +} + +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) + + if (user_device_name) + ADD_OPT ("--name=%s", user_device_name); + if (master_file) + ADD_OPT ("--master-device=%s", master_file); + + ADD_OPT (device_name); + +#undef ADD_OPT + return err; +} + +void +trivfs_modify_stat (struct trivfs_protid *cred, io_statbuf_t *stat) +{ +} + +error_t +trivfs_goaway (struct trivfs_control *fsys, int flags) +{ + int count; + + /* 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]); + debug ("the number of ports alive: %d\n", count); + + if (count && !(flags & FSYS_GOAWAY_FORCE)) + { + /* 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]); + return EBUSY; + } + + mach_port_deallocate (mach_task_self (), master_device); + debug ("the translator is gone away\n"); + exit (0); +} + +static error_t +parse_opt (int opt, char *arg, struct argp_state *state) +{ + switch (opt) + { + case 'M': + master_file = arg; + master_device = file_name_lookup (arg, 0, 0); + if (master_device == MACH_PORT_NULL) + error (1, errno, "file_name_lookup"); + break; + case 'n': + user_device_name = arg; + break; + case ARGP_KEY_ARG: + device_name = arg; + break; + case ARGP_KEY_ERROR: + case ARGP_KEY_SUCCESS: + case ARGP_KEY_INIT: + break; + default: + return ARGP_ERR_UNKNOWN; + } + return 0; +} + +int +main (int argc, char *argv[]) +{ + error_t err; + mach_port_t bootstrap; + struct trivfs_control *fsys; + const struct argp argp = { options, parse_opt, args_doc, doc }; + + 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); + + argp_parse (&argp, argc, argv, 0, 0, 0); + + task_get_bootstrap_port (mach_task_self (), &bootstrap); + if (bootstrap == MACH_PORT_NULL) + error (1, 0, "must be started as a translator"); + + if (master_device == MACH_PORT_NULL) + { + err = get_privileged_ports (0, &master_device); + if (err) + error (1, err, "get_privileged_ports"); + } + + /* 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"); + + /* Launch. */ + do + { + ports_manage_port_operations_one_thread (port_bucket, + devnode_demuxer, 0); + } while (trivfs_goaway (fsys, 0)); + return 0; +} diff --git a/devnode/devnode.prof_d b/devnode/devnode.prof_d new file mode 100644 index 00000000..2e474391 --- /dev/null +++ b/devnode/devnode.prof_d @@ -0,0 +1 @@ +devnode.prof: devnode_p.o ourdeviceServer_p.o notifyServer_p.o ../libports/libports_p.a ../libtrivfs/libtrivfs_p.a ../libfshelp/libfshelp_p.a ../libshouldbeinlibc/libshouldbeinlibc_p.a diff --git a/devnode/notify.defs b/devnode/notify.defs new file mode 100644 index 00000000..2014be5c --- /dev/null +++ b/devnode/notify.defs @@ -0,0 +1 @@ +#include <mach/notify.defs> diff --git a/devnode/ourdevice.defs b/devnode/ourdevice.defs new file mode 100644 index 00000000..1b8ac442 --- /dev/null +++ b/devnode/ourdevice.defs @@ -0,0 +1,383 @@ +# 1 "device.defs" +# 1 "<built-in>" +# 1 "<command-line>" +# 1 "device.defs" +# 1 "/usr/local/include/device/device.defs" 1 3 +# 39 "/usr/local/include/device/device.defs" 3 +subsystem + + + + device 2800; + +# 1 "/usr/local/include/mach/std_types.defs" 1 3 +# 33 "/usr/local/include/mach/std_types.defs" 3 +type char = MACH_MSG_TYPE_CHAR; +type short = MACH_MSG_TYPE_INTEGER_16; +type int = MACH_MSG_TYPE_INTEGER_32; +type int32 = MACH_MSG_TYPE_INTEGER_32; +type int64 = MACH_MSG_TYPE_INTEGER_64; +type boolean_t = MACH_MSG_TYPE_BOOLEAN; +type unsigned = MACH_MSG_TYPE_INTEGER_32; +type unsigned32 = MACH_MSG_TYPE_INTEGER_32; +type unsigned64 = MACH_MSG_TYPE_INTEGER_64; + + +# 1 "/usr/local/include/mach/machine/machine_types.defs" 1 3 +# 50 "/usr/local/include/mach/machine/machine_types.defs" 3 +type natural_t = unsigned32; +# 59 "/usr/local/include/mach/machine/machine_types.defs" 3 +type integer_t = int32; +# 45 "/usr/local/include/mach/std_types.defs" 2 3 + +type kern_return_t = int; + +type pointer_t = ^array[] of MACH_MSG_TYPE_BYTE + ctype: vm_offset_t; + + +type mach_port_t = MACH_MSG_TYPE_COPY_SEND; +type mach_port_array_t = array[] of mach_port_t; + +type mach_port_name_t = MACH_MSG_TYPE_PORT_NAME + ctype: mach_port_t; +type mach_port_name_array_t = array[] of mach_port_name_t + ctype: mach_port_array_t; + +type mach_port_right_t = natural_t; + +type mach_port_type_t = natural_t; +type mach_port_type_array_t = array[] of mach_port_type_t; + +type mach_port_urefs_t = natural_t; +type mach_port_delta_t = integer_t; +type mach_port_seqno_t = natural_t; +type mach_port_mscount_t = unsigned; +type mach_port_msgcount_t = unsigned; +type mach_port_rights_t = unsigned; +type mach_msg_id_t = integer_t; +type mach_msg_type_name_t = unsigned; +type mach_msg_type_number_t = natural_t; + +type mach_port_move_receive_t = MACH_MSG_TYPE_MOVE_RECEIVE + ctype: mach_port_t; +type mach_port_copy_send_t = MACH_MSG_TYPE_COPY_SEND + ctype: mach_port_t; +type mach_port_make_send_t = MACH_MSG_TYPE_MAKE_SEND + ctype: mach_port_t; +type mach_port_move_send_t = MACH_MSG_TYPE_MOVE_SEND + ctype: mach_port_t; +type mach_port_make_send_once_t = MACH_MSG_TYPE_MAKE_SEND_ONCE + ctype: mach_port_t; +type mach_port_move_send_once_t = MACH_MSG_TYPE_MOVE_SEND_ONCE + ctype: mach_port_t; + +type mach_port_receive_t = MACH_MSG_TYPE_PORT_RECEIVE + ctype: mach_port_t; +type mach_port_send_t = MACH_MSG_TYPE_PORT_SEND + ctype: mach_port_t; +type mach_port_send_once_t = MACH_MSG_TYPE_PORT_SEND_ONCE + ctype: mach_port_t; + +type mach_port_poly_t = polymorphic + ctype: mach_port_t; + +import <mach/std_types.h>; +# 46 "/usr/local/include/device/device.defs" 2 3 +# 1 "/usr/local/include/mach/mach_types.defs" 1 3 +# 61 "/usr/local/include/mach/mach_types.defs" 3 +type mach_port_status_t = struct[9] of integer_t; + +type old_mach_port_status_t = struct[8] of integer_t; + +type task_t = mach_port_t + ctype: mach_port_t + + + + + + ; +# 85 "/usr/local/include/mach/mach_types.defs" 3 +type thread_t = mach_port_t + ctype: mach_port_t + + + + + + ; + +type thread_state_t = array[*:1024] of natural_t; + +type task_array_t = ^array[] of task_t; +type thread_array_t = ^array[] of thread_t; + +type vm_task_t = mach_port_t + ctype: mach_port_t + + + + + ; + +type ipc_space_t = mach_port_t + ctype: mach_port_t + + + + + ; + +type vm_address_t = natural_t; +type vm_offset_t = natural_t; +type vm_size_t = natural_t; +type vm_prot_t = int; +type vm_inherit_t = int; +type vm_statistics_data_t = struct[13] of integer_t; +type vm_machine_attribute_t = int; +type vm_machine_attribute_val_t = int; + +type thread_info_t = array[*:1024] of natural_t; +type thread_basic_info_data_t = struct[11] of integer_t; +type thread_sched_info_data_t = struct[7] of integer_t; + +type task_info_t = array[*:1024] of natural_t; +type task_basic_info_data_t = struct[8] of integer_t; +type task_events_info = struct[7] of natural_t; +type task_thread_times_info_data_t = struct[4] of integer_t; + + +type memory_object_t = mach_port_t + ctype: mach_port_t + + + + ; + +type memory_object_control_t = mach_port_t + ctype: mach_port_t + + + + ; + +type memory_object_name_t = mach_port_t + ctype: mach_port_t + + + + + ; + +type memory_object_copy_strategy_t = int; +type memory_object_return_t = int; + +type machine_info_data_t = struct[5] of integer_t; +type machine_slot_data_t = struct[8] of integer_t; + +type host_t = mach_port_t + ctype: mach_port_t + + + + + ; + +type host_priv_t = mach_port_t + ctype: mach_port_t + + + + ; + +type host_info_t = array[*:1024] of natural_t; +type host_basic_info_data_t = struct[5] of integer_t; +type host_sched_info_data_t = struct[2] of integer_t; +type host_load_info_data_t = struct[6] of integer_t; + + +type processor_t = mach_port_t + ctype: mach_port_t + + + + + ; + +type processor_array_t = ^array[] of processor_t; +type processor_info_t = array[*:1024] of natural_t; +type processor_basic_info_data_t = struct[5] of integer_t; + + +type processor_set_t = mach_port_t + ctype: mach_port_t + + + + + + ; + +type processor_set_array_t = ^array[] of processor_set_t; + +type processor_set_name_t = mach_port_t + ctype: mach_port_t + + + + + + ; + +type processor_set_name_array_t = ^array[] of processor_set_name_t; + +type processor_set_info_t = array[*:1024] of natural_t; +type processor_set_basic_info_data_t = struct[5] of integer_t; +type processor_set_sched_info_data_t = struct[2] of integer_t; + + +type kernel_version_t = (MACH_MSG_TYPE_STRING, 512*8); + +type kernel_boot_info_t = (MACH_MSG_TYPE_STRING, 4096*8); + +type time_value_t = struct[2] of integer_t; + +type emulation_vector_t = ^array[] of vm_offset_t; + +type xxx_emulation_vector_t = array[*:1024] of vm_offset_t + ctype: emulation_vector_t; + + +type rpc_signature_info_t = array[*:1024] of int; +# 250 "/usr/local/include/mach/mach_types.defs" 3 +import <mach/mach_types.h>; +# 47 "/usr/local/include/device/device.defs" 2 3 +# 1 "/usr/local/include/device/device_types.defs" 1 3 +# 42 "/usr/local/include/device/device_types.defs" 3 +type recnum_t = unsigned32; +type dev_mode_t = unsigned32; +type dev_flavor_t = unsigned32; +type dev_name_t = (MACH_MSG_TYPE_STRING_C, 8*128); +type dev_status_t = array[*:1024] of int; +type io_buf_ptr_t = ^array[] of MACH_MSG_TYPE_INTEGER_8; +type io_buf_ptr_inband_t= array[*:128] of char; +type filter_t = short; +type filter_array_t = array[*:128] of filter_t; + +type device_t = mach_port_t + ctype: mach_port_t + + + + + + ; + +import <device/device_types.h>; +import <device/net_status.h>; +# 48 "/usr/local/include/device/device.defs" 2 3 + +serverprefix ds_; + +type reply_port_t = MACH_MSG_TYPE_MAKE_SEND_ONCE | polymorphic + ctype: mach_port_t; + +routine device_open( + master_port : mach_port_t; + sreplyport reply_port : reply_port_t; + mode : dev_mode_t; + name : dev_name_t; + out device : mach_port_send_t + ); + +routine device_close( + device : device_t + ); + +routine device_write( + device : device_t; + sreplyport reply_port : reply_port_t; + in mode : dev_mode_t; + in recnum : recnum_t; + in data : io_buf_ptr_t; + out bytes_written : int + ); + +routine device_write_inband( + device : device_t; + sreplyport reply_port : reply_port_t; + in mode : dev_mode_t; + in recnum : recnum_t; + in data : io_buf_ptr_inband_t; + out bytes_written : int + ); + +routine device_read( + device : device_t; + sreplyport reply_port : reply_port_t; + in mode : dev_mode_t; + in recnum : recnum_t; + in bytes_wanted : int; + out data : io_buf_ptr_t + ); + +routine device_read_inband( + device : device_t; + sreplyport reply_port : reply_port_t; + in mode : dev_mode_t; + in recnum : recnum_t; + in bytes_wanted : int; + out data : io_buf_ptr_inband_t + ); + + +routine xxx_device_set_status( + device : device_t; + in flavor : dev_flavor_t; + in status : dev_status_t, IsLong + ); + + +routine xxx_device_get_status( + device : device_t; + in flavor : dev_flavor_t; + out status : dev_status_t, IsLong + ); + + +routine xxx_device_set_filter( + device : device_t; + in receive_port : mach_port_send_t; + in priority : int; + in filter : filter_array_t, IsLong + ); + +routine device_map( + device : device_t; + in prot : vm_prot_t; + in offset : vm_offset_t; + in size : vm_size_t; + out pager : memory_object_t; + in unmap : int + ); + +routine device_set_status( + device : device_t; + in flavor : dev_flavor_t; + in status : dev_status_t + ); + +routine device_get_status( + device : device_t; + in flavor : dev_flavor_t; + out status : dev_status_t, CountInOut + ); + +routine device_set_filter( + device : device_t; + in receive_port : mach_port_send_t; + in priority : int; + in filter : filter_array_t + ); +# 1 "device.defs" 2 diff --git a/devnode/util.h b/devnode/util.h new file mode 100644 index 00000000..2efc1ef5 --- /dev/null +++ b/devnode/util.h @@ -0,0 +1,42 @@ +/* + Copyright (C) 2008 Free Software Foundation, Inc. + Written by Zheng Da. + + 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 the GNU Hurd; see the file COPYING. If not, write to + the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#ifndef UTIL_H +#define UTIL_H + +#include <stdio.h> + +#ifdef DEBUG + +#define debug(format, ...) do \ +{ \ + char buf[1024]; \ + snprintf (buf, 1024, "devnode: %s", format); \ + fprintf (stderr , buf, ## __VA_ARGS__); \ + fflush (stderr); \ +} while (0) + +#else + +#define debug(format, ...) do {} while (0) + +#endif + +#endif |