summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hurdtranslatorexample.mdwn492
1 files changed, 241 insertions, 251 deletions
diff --git a/hurdtranslatorexample.mdwn b/hurdtranslatorexample.mdwn
index 61d3e4cf..83ac7da1 100644
--- a/hurdtranslatorexample.mdwn
+++ b/hurdtranslatorexample.mdwn
@@ -10,302 +10,292 @@ is included in the section entitled
The code examples were written by Anand Babu.
-We have a data.h header file, a data.defs file, a data-user.c, data-server.c sources files and a Makefile.
+We have a data.h header file, a data.defs file, a data-user.c, data-server.c
+sources files and a Makefile.
data.h:
-------
-<pre>
-#ifndef _data_user_
-#define _data_user_
-
-/* Module data */
-
-#include <mach/kern_return.h>
-#include <mach/port.h>
-#include <mach/message.h>
-
-#include <mach/std_types.h>
-#include <mach/mach_types.h>
-#include <device/device_types.h>
-#include <device/net_status.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/statfs.h>
-#include <sys/resource.h>
-#include <sys/utsname.h>
-#include <hurd/hurd_types.h>
-
-/* Routine data_set_value */
-#ifdef mig_external
-mig_external
-#else
-extern
-#endif
-kern_return_t S_data_set_value
-#if defined(LINTLIBRARY)
- (data_port, value)
- mach_port_t data_port;
- int value;
-{ return S_data_set_value(data_port, value); }
-#else
-(
- mach_port_t data_port,
- int value
-);
-#endif
-
-/* Routine data_get_value */
-#ifdef mig_external
-mig_external
-#else
-extern
-#endif
-kern_return_t S_data_get_value
-#if defined(LINTLIBRARY)
- (data_port, value)
- mach_port_t data_port;
- int *value;
-{ return S_data_get_value(data_port, value); }
-#else
-(
- mach_port_t data_port,
- int *value
-);
-#endif
-
-#endif /* not defined(_data_user_) */
-</pre>
+ #ifndef _data_user_
+ #define _data_user_
+
+ /* Module data */
+
+ #include <mach/kern_return.h>
+ #include <mach/port.h>
+ #include <mach/message.h>
+
+ #include <mach/std_types.h>
+ #include <mach/mach_types.h>
+ #include <device/device_types.h>
+ #include <device/net_status.h>
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <sys/statfs.h>
+ #include <sys/resource.h>
+ #include <sys/utsname.h>
+ #include <hurd/hurd_types.h>
+
+ /* Routine data_set_value */
+ #ifdef mig_external
+ mig_external
+ #else
+ extern
+ #endif
+ kern_return_t S_data_set_value
+ #if defined(LINTLIBRARY)
+ (data_port, value)
+ mach_port_t data_port;
+ int value;
+ { return S_data_set_value(data_port, value); }
+ #else
+ (
+ mach_port_t data_port,
+ int value
+ );
+ #endif
+
+ /* Routine data_get_value */
+ #ifdef mig_external
+ mig_external
+ #else
+ extern
+ #endif
+ kern_return_t S_data_get_value
+ #if defined(LINTLIBRARY)
+ (data_port, value)
+ mach_port_t data_port;
+ int *value;
+ { return S_data_get_value(data_port, value); }
+ #else
+ (
+ mach_port_t data_port,
+ int *value
+ );
+ #endif
+
+ #endif /* not defined(_data_user_) */
data.defs:
----------
-<pre>
-/* Definitions for data interface
-
-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. */
-
-subsystem data 45000;
-
-#include <hurd/hurd_types.defs>
-
-#ifdef STACK_IMPORTS
-STACK_IMPORTS
-#endif
-
-/* intr-rpc.defs defines the INTR_INTERFACE macro to make the generated RPC
-stubs send-interruptible, and to prefix them with `hurd_intr_rpc_'. */
-INTR_INTERFACE
-
-/* set integer value to data */
-routine data_set_value (
- data_port: mach_port_t;
- value: int);
-
-/* get integer value from data */
-routine data_get_value (
- data_port: mach_port_t;
- out value: int);
-</pre>
+ /* Definitions for data interface
+
+ 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. */
+
+ subsystem data 45000;
+
+ #include <hurd/hurd_types.defs>
+
+ #ifdef STACK_IMPORTS
+ STACK_IMPORTS
+ #endif
+
+ /* intr-rpc.defs defines the INTR_INTERFACE macro to make the generated RPC
+ stubs send-interruptible, and to prefix them with `hurd_intr_rpc_'. */
+ INTR_INTERFACE
+
+ /* set integer value to data */
+ routine data_set_value (
+ data_port: mach_port_t;
+ value: int);
+
+ /* get integer value from data */
+ routine data_get_value (
+ data_port: mach_port_t;
+ out value: int);
data-user.c:
------------
-<pre>
-#include <stdio.h>
-#include <hurd.h>
-#include <hurd/hurd_types.h>
-#include "data.h"
-
-#ifndef _GNU_SOURCE
- #define _GNU_SOURCE
-#endif
-
-int
-main(int argc, char *argv[])
-{
- int value=0;
- mach_port_t data_server_port;
-
- data_server_port = file_name_lookup ("/tmp/trans", 0, 0);
- printf ("data_server_port [%u]\n", data_server_port);
- S_data_set_value (data_server_port, 99);
- S_data_get_value (data_server_port, &value);
- printf ("data->get_value: [%d]\n", value);
-
- return 0;
-}
-</pre>
+ #include <stdio.h>
+ #include <hurd.h>
+ #include <hurd/hurd_types.h>
+ #include "data.h"
+
+ #ifndef _GNU_SOURCE
+ #define _GNU_SOURCE
+ #endif
+
+ int
+ main(int argc, char *argv[])
+ {
+ int value=0;
+ mach_port_t data_server_port;
+
+ data_server_port = file_name_lookup ("/tmp/trans", 0, 0);
+ printf ("data_server_port [%u]\n", data_server_port);
+ S_data_set_value (data_server_port, 99);
+ S_data_get_value (data_server_port, &value);
+ printf ("data->get_value: [%d]\n", value);
+
+ return 0;
+ }
data-server.c:
--------------
-<pre>
-#ifndef _GNU_SOURCE
- #define _GNU_SOURCE
-#endif
-
-#include <stdio.h>
-#include <getopt.h>
-#include <errno.h>
-#include <sys/stat.h>
-#include <error.h>
-
-#include <hurd/ports.h>
-#include <hurd/hurd_types.h>
-#include <hurd/trivfs.h>
-
-#include "data.h"
-
-extern boolean_t S_data_server
-(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP);
-
-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 = 0x00;
-int trivfs_protid_nportclasses = 0;
-int trivfs_cntl_nportclasses = 0;
-
-int data_value;
-
-int demuxer (mach_msg_header_t *inp, mach_msg_header_t *outp)
-{
- return (S_data_server(inp,outp)||trivfs_demuxer(inp,outp));
-}
-
-void trivfs_modify_stat (struct trivfs_protid *cred, io_statbuf_t *st)
-{
-}
-error_t trivfs_goaway (struct trivfs_control *fsys, int flags)
-{
- exit (0);
-}
-
-kern_return_t S_data_set_value (mach_port_t data_port, int value)
-{
- data_value = value;
- return 0;
-}
-
-kern_return_t S_data_get_value (mach_port_t data_port, int *value)
-{
- *value = data_value;
- return 0;
-}
-
-int
-main(int argc, char *argv[])
-{
- int err;
- mach_port_t bootstrap;
- struct trivfs_control *fsys;
-
- if (argc > 1)
+ #ifndef _GNU_SOURCE
+ #define _GNU_SOURCE
+ #endif
+
+ #include <stdio.h>
+ #include <getopt.h>
+ #include <errno.h>
+ #include <sys/stat.h>
+ #include <error.h>
+
+ #include <hurd/ports.h>
+ #include <hurd/hurd_types.h>
+ #include <hurd/trivfs.h>
+
+ #include "data.h"
+
+ extern boolean_t S_data_server
+ (mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP);
+
+ 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 = 0x00;
+ int trivfs_protid_nportclasses = 0;
+ int trivfs_cntl_nportclasses = 0;
+
+ int data_value;
+
+ int demuxer (mach_msg_header_t *inp, mach_msg_header_t *outp)
{
- fprintf(stderr, "Usage: settrans [opts] node %s\n", program_invocation_name);
- exit (1);
+ return (S_data_server(inp,outp)||trivfs_demuxer(inp,outp));
+ }
+
+ void trivfs_modify_stat (struct trivfs_protid *cred, io_statbuf_t *st)
+ {
+ }
+ error_t trivfs_goaway (struct trivfs_control *fsys, int flags)
+ {
+ exit (0);
+ }
+
+ kern_return_t S_data_set_value (mach_port_t data_port, int value)
+ {
+ data_value = value;
+ return 0;
+ }
+
+ kern_return_t S_data_get_value (mach_port_t data_port, int *value)
+ {
+ *value = data_value;
+ return 0;
+ }
+
+ int
+ main(int argc, char *argv[])
+ {
+ int err;
+ mach_port_t bootstrap;
+ struct trivfs_control *fsys;
+
+ if (argc > 1)
+ {
+ fprintf(stderr, "Usage: settrans [opts] node %s\n", program_invocation_name);
+ exit (1);
+ }
+
+ task_get_bootstrap_port (mach_task_self (), &bootstrap);
+ if (bootstrap == MACH_PORT_NULL)
+ error(2, 0, "Must be started as a translator");
+
+ /* Reply to our parent */
+ err = trivfs_startup (bootstrap, 0, 0, 0, 0, 0,&fsys);
+ mach_port_deallocate (mach_task_self (), bootstrap);
+ if (err) {
+ return (0);
+ }
+
+ ports_manage_port_operations_one_thread (fsys->pi.bucket, demuxer, 0);
+
+ return 0;
}
-
- task_get_bootstrap_port (mach_task_self (), &bootstrap);
- if (bootstrap == MACH_PORT_NULL)
- error(2, 0, "Must be started as a translator");
-
- /* Reply to our parent */
- err = trivfs_startup (bootstrap, 0, 0, 0, 0, 0,&fsys);
- mach_port_deallocate (mach_task_self (), bootstrap);
- if (err) {
- return (0);
- }
-
- ports_manage_port_operations_one_thread (fsys->pi.bucket, demuxer, 0);
-
- return 0;
-}
-</pre>
Makefile:
---------
-<pre>
-CC = gcc
-MIG = mig
-CFLAGS = -Wall -g -D_GNU_SOURCE
-LDFLAGS = -lthreads -lports -ltrivfs -lfshelp -lshouldbeinlibc
-INCLUDES = -I.
-LCHDRS =
-MIGCOMSFLAGS = -prefix S_
-OBJS = $(SRCS:.c=.o)
-TAGS = etags.emacs21
-
-all: data-server data-user
-tags:
- $(TAGS) $(SRCS) $(LCHDRS)
-
-stubs: data.defs
- $(MIG) $(MIGCOMSFLAGS) -server dataServer.c -user dataUser.c $^
-data-server: data-server.c dataServer.c
- $(CC) $^ $(CFLAGS) $(INCLUDES) $(LDFLAGS) -o $@
-data-user: data-user.c dataUser.c
- $(CC) $^ $(CFLAGS) $(INCLUDES) -o $@
-clean:
- rm -f *.o data-server data-user
-
-start: data-server data-user
- settrans -ac /tmp/trans data-server
- ps -x | grep data-server
-end:
- settrans -fg /tmp/trans
-</pre>
+ CC = gcc
+ MIG = mig
+ CFLAGS = -Wall -g -D_GNU_SOURCE
+ LDFLAGS = -lthreads -lports -ltrivfs -lfshelp -lshouldbeinlibc
+ INCLUDES = -I.
+ LCHDRS =
+ MIGCOMSFLAGS = -prefix S_
+ OBJS = $(SRCS:.c=.o)
+ TAGS = etags.emacs21
+
+ all: data-server data-user
+ tags:
+ $(TAGS) $(SRCS) $(LCHDRS)
+
+ stubs: data.defs
+ $(MIG) $(MIGCOMSFLAGS) -server dataServer.c -user dataUser.c $^
+ data-server: data-server.c dataServer.c
+ $(CC) $^ $(CFLAGS) $(INCLUDES) $(LDFLAGS) -o $@
+ data-user: data-user.c dataUser.c
+ $(CC) $^ $(CFLAGS) $(INCLUDES) -o $@
+ clean:
+ rm -f *.o data-server data-user
+
+ start: data-server data-user
+ settrans -ac /tmp/trans data-server
+ ps -x | grep data-server
+ end:
+ settrans -fg /tmp/trans
Building
--------
Do
-<pre> make stubs </pre>
+ make stubs
-to create the dataUser.c and dataServer.c files generated by mig. Create the executables using:
+to create the dataUser.c and dataServer.c files generated by mig. Create the
+executables using:
-<pre> make all </pre>
+ make all
Testing
-------
Start the data-server translator using:
-<pre> settrans -ac /tmp/trans data-server </pre>
+ settrans -ac /tmp/trans data-server
-You can check if it is running u sing
+You can check if it is running using
-<pre> ps -x | grep data-server </pre>
+ ps -x | grep data-server
Run the data-user executable to get the resultant output.
You can remove the translator using:
-<pre> settrans -fg /tmp/trans </pre>
+ settrans -fg /tmp/trans
To remove the built files use:
-<pre> make clean </pre>.
+ make clean
Happy Hacking!
-
--- ShakthiKannan - 01 Dec 2006 \ No newline at end of file