mariadb/fs/korbit-kernel-2.4.1-patch
monty@work.mysql.com 8f62579c38 Added all changes from old 4.0 version:
PSTACK, libmysqld and MySQL filesystem
UPDATE ... ORDER BY
DELETE ... ORDER BY
New faster fulltext handling
Faster compressed keys
2001-04-11 13:04:03 +02:00

35661 lines
1 MiB

diff -urN linux-2.4.1/.cvsignore linux-2.4.1-korbit/.cvsignore
--- linux-2.4.1/.cvsignore Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/.cvsignore Thu Feb 1 11:46:48 2001
@@ -0,0 +1 @@
+makekorbit.sh
diff -urN linux-2.4.1/KORBit.Announce linux-2.4.1-korbit/KORBit.Announce
--- linux-2.4.1/KORBit.Announce Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/KORBit.Announce Thu Feb 1 11:46:48 2001
@@ -0,0 +1,62 @@
+From sabre@nondot.org Fri Dec 8 15:15:43 2000
+Date: Fri, 8 Dec 2000 17:10:47 -0600 (CST)
+From: Chris Lattner <sabre@nondot.org>
+To: linux-kernel@vger.kernel.org, orbit-list@gnome.org
+Cc: korbit-cvs@lists.sourceforge.net
+Subject: ANNOUNCE: Linux Kernel ORB: kORBit
+
+
+This email is here to announce the availability of a port of ORBit (the
+GNOME ORB) to the Linux kernel. This ORB, named kORBit, is available from
+our sourceforge web site (http://korbit.sourceforge.net/). A kernel ORB
+allows you to write kernel extensions in CORBA and have the kernel call
+into them, or to call into the kernel through CORBA. This opens the door
+to a wide range of experiments/hacks:
+
+* We can now write device drivers in perl, and let them run on the iMAC
+ across the hall from you. :)
+* Through the use of a LD_PRELOAD'd syscall wrapper library, you can
+ forward system calls through CORBA to an arbitrary local/remote machine.
+* CORBA servers are implemented as Linux kernel modules, so they may be
+ dynamically loaded or unloaded from a running system at any time. CORBA
+ servers expose their IOR's through a /proc/corba filesystem.
+* Filesystems may be implemented as remote CORBA objects and mounted on
+ the local machine, by using 'mount -t corbafs -o IOR:... none /mnt/corba'
+
+This are just some of the features available _RIGHT_NOW_ that are
+supported by kORBit. I'm sure that YOU can think of many more.
+
+Implementation:
+We implemented this port by providing a user->kernel mapping layer that
+consists of providing standard system header files for the "user" code to
+#include. In these header files, we do the mapping required. For
+example, we implement a <stdio.h> that #defines printf to printk (as a
+trivial example). Only user level code sees or uses these wrappers... all
+of our modifications to the Linux kernel are contained within the
+linux/net/korbit subdirectory.
+
+This is currently implemented with a 2.4.0test10 kernel, although forward
+porting should be very easy. This project was implemented as a cs423
+semester project by Chris Lattner, Fredrik Vraalsen, Andy Reitz, and Keith
+Wessel at the University of Illinois @ Urbana Champaign.
+
+Unresolved issues:
+* Our poll model is not optimial. Currently we actually do a real poll on
+ a (struct socket *) set. This causes relatively high latencies (on the
+ order 1 second, worst case) for CORBA requests. Our waitqueues are not
+ working quite as well as they should. :)
+* Security is completely unimplemented. Someone could use corba
+ interfaces to read any file on your system, for example (if the
+ CORBA-FileServer module is installed). Thus, this is really more for
+ prototyping and development than actual real world use. :)
+
+If you have any questions or comments, please feel free to contact us at:
+
+Chris Lattner, Fredrik Vraalsen, Andy Reitz, Keith Wessel
+<korbit-cvs@lists.sourceforge.net>
+
+btw, yes we are quite crazy, but what good is it to be normal and
+conformist afterall? :)
+
+
+
diff -urN linux-2.4.1/Makefile linux-2.4.1-korbit/Makefile
--- linux-2.4.1/Makefile Tue Jan 30 09:19:26 2001
+++ linux-2.4.1-korbit/Makefile Thu Feb 1 15:48:45 2001
@@ -70,7 +70,7 @@
# images. Uncomment if you want to place them anywhere other than root.
#
-#export INSTALL_PATH=/boot
+export INSTALL_PATH=/boot
#
# INSTALL_MOD_PATH specifies a prefix to MODLIB for module directory
diff -urN linux-2.4.1/README.korbit linux-2.4.1-korbit/README.korbit
--- linux-2.4.1/README.korbit Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/README.korbit Thu Feb 1 11:46:48 2001
@@ -0,0 +1,83 @@
+ ====================
+ KORBit: A CORBA ORB
+ For The Linux Kernel
+ ====================
+
+ Submitted as a final project in CS423 by
+ Chris Lattner <lattner@uiuc.edu>,
+ Andy Reitz <areitz@uiuc.edu>,
+ Fredrik Vraalsen <vraalsen@uiuc.edu>, and
+ Keith Wessel <kwessel@uiuc.edu>
+
+ December 8, 2000
+
+
+About:
+======
+KORBit is a port of the CORBA Object Request Broker ORBit to the Linux
+kernel. For more information, see http://korbit.sourceforge.net/
+
+In order to use this code, you need to have ORBit-0.5.3 or later
+installed (including the development environment). The KORBit server
+modules make use of the ORBit IDL Compiler during the build process.
+
+Building The Code:
+==================
+In order to compile and run KORBit you need a recent 2.4.0-test
+version of the Linux kernel (KORBit is developed on 2.4.0-test10).
+
+To obtain a copy of the KORBit source code, see the webpage above.
+Once you have untar'ed the source code, copy the contents of the linux
+subdirectory of KORBit into the Linux root source directory
+(e.g. /usr/src/linux).
+
+Run your favourite configuration option for Linux (e.g. 'make
+menuconfig'). To enable KORBit support in the kernel, go into the
+'Networking options' section of the configuration and enable 'Kernel
+ORB'. Then add the various CORBA services that you wish to run in the
+kernel.
+
+NOTE: The Kernel ORB *must* be compiled statically into the kernel
+(answer 'Y') and CORBA services *must* be compiled as modules (answer
+'M') at the moment.
+
+Then compile and install the Linux kernel in the standard way, e.g.:
+
+make dep ; make clean ; make bzImage ; make modules ; make modules_install
+
+Copy System.map and arch/<i386|whatever>/boot/bzImage to the proper
+places (/boot), edit your lilo.conf, run lilo and reboot.
+
+You should now be able to use CORBA in your Linux kernel! Remember,
+this is *pre-alpha* software! Use on your own risk! Don't come to us
+crying if your machine blows up...
+
+Using Our Example KORBit Objects:
+=================================
+The "CORBA Echo Server" is effectively our "hello world" object. Once
+loaded into the kernel, module will instantiate an object that
+implements the "echoString()" interface. This method allows the client
+to send a string, which will be printed on the system console. Then,
+it will return a random number, which the client will print. Thus,
+after running this test, you will verify that two-way communication is
+working between KORBit and your ORB of choice.
+
+To insert this module into your newly-compiled kernel, type
+
+insmod /lib/modules/2.4.0-test10/kernel/net/korbit/modules/Echo/server/corba-echo-server.o
+
+Next verify that this module is actually loaded, by invoking
+"lsmod". You should see something like this:
+
+ Module Size Used by
+ corba-echo-server 3344 0 (unused)
+
+Now, you can grab the IOR to this object by typing "cat
+/proc/corba/echo-server". Now, you need to build the echo client,
+which will use this IOR in order to connect to the echo server. This
+can be accomplished by simply changing to the
+"/usr/src/linux/net/korbit/modules/Echo/client" directory, and then
+typing "make". Once finished, simply type "./echo-client `cat
+/proc/corba/echo-server`", and then cross your fingers!
+
+
diff -urN linux-2.4.1/Rules.make linux-2.4.1-korbit/Rules.make
--- linux-2.4.1/Rules.make Sat Dec 30 00:07:19 2000
+++ linux-2.4.1-korbit/Rules.make Thu Feb 1 15:46:07 2001
@@ -222,9 +222,9 @@
$(MODINCL)/%.ver: %.c
@if [ ! -r $(MODINCL)/$*.stamp -o $(MODINCL)/$*.stamp -ot $< ]; then \
- echo '$(CC) $(CFLAGS) -E -D__GENKSYMS__ $<'; \
+ echo '$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -E -D__GENKSYMS__ $<'; \
echo '| $(GENKSYMS) $(genksyms_smp_prefix) -k $(VERSION).$(PATCHLEVEL).$(SUBLEVEL) > $@.tmp'; \
- $(CC) $(CFLAGS) -E -D__GENKSYMS__ $< \
+ $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -E -D__GENKSYMS__ $< \
| $(GENKSYMS) $(genksyms_smp_prefix) -k $(VERSION).$(PATCHLEVEL).$(SUBLEVEL) > $@.tmp; \
if [ -r $@ ] && cmp -s $@ $@.tmp; then echo $@ is unchanged; rm -f $@.tmp; \
else echo mv $@.tmp $@; mv -f $@.tmp $@; fi; \
diff -urN linux-2.4.1/korbit.patch linux-2.4.1-korbit/korbit.patch
--- linux-2.4.1/korbit.patch Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/korbit.patch Thu Feb 1 11:46:48 2001
@@ -0,0 +1,43 @@
+--- linux/Rules.make.orig Wed Jan 31 22:50:40 2001
++++ linux/Rules.make Thu Feb 1 01:39:46 2001
+@@ -222,9 +222,9 @@
+
+ $(MODINCL)/%.ver: %.c
+ @if [ ! -r $(MODINCL)/$*.stamp -o $(MODINCL)/$*.stamp -ot $< ]; then \
+- echo '$(CC) $(CFLAGS) -E -D__GENKSYMS__ $<'; \
++ echo '$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -E -D__GENKSYMS__ $<'; \
+ echo '| $(GENKSYMS) $(genksyms_smp_prefix) -k $(VERSION).$(PATCHLEVEL).$(SUBLEVEL) > $@.tmp'; \
+- $(CC) $(CFLAGS) -E -D__GENKSYMS__ $< \
++ $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -E -D__GENKSYMS__ $< \
+ | $(GENKSYMS) $(genksyms_smp_prefix) -k $(VERSION).$(PATCHLEVEL).$(SUBLEVEL) > $@.tmp; \
+ if [ -r $@ ] && cmp -s $@ $@.tmp; then echo $@ is unchanged; rm -f $@.tmp; \
+ else echo mv $@.tmp $@; mv -f $@.tmp $@; fi; \
+--- linux/net/Config.in.orig Wed Jan 31 22:39:32 2001
++++ linux/net/Config.in Thu Feb 1 01:40:02 2001
+@@ -30,6 +30,7 @@
+ fi
+ if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+ source net/khttpd/Config.in
++ source net/korbit/Config.in
+ fi
+ fi
+ if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+--- linux/net/Makefile.orig Thu Feb 1 01:41:42 2001
++++ linux/net/Makefile Thu Feb 1 01:41:35 2001
+@@ -7,7 +7,7 @@
+
+ O_TARGET := network.o
+
+-mod-subdirs := ipv4/netfilter ipv6/netfilter ipx irda atm netlink sched
++mod-subdirs := ipv4/netfilter ipv6/netfilter ipx irda atm netlink sched korbit
+ export-objs := netsyms.o
+
+ subdir-y := core ethernet
+@@ -27,6 +27,7 @@
+ endif
+
+ subdir-$(CONFIG_KHTTPD) += khttpd
++subdir-$(CONFIG_KORBIT) += korbit
+ subdir-$(CONFIG_NETLINK) += netlink
+ subdir-$(CONFIG_PACKET) += packet
+ subdir-$(CONFIG_NET_SCHED) += sched
diff -urN linux-2.4.1/makekorbit.sh linux-2.4.1-korbit/makekorbit.sh
--- linux-2.4.1/makekorbit.sh Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/makekorbit.sh Thu Feb 1 11:46:48 2001
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+make CFLAGS="-D__KERNEL__ -I`pwd`/include -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strict-aliasing -pipe -march=k6 -DHAVE_CONFIG_H -DHAVE_UNISTD_H -I. -I.. -I../include -nostdinc" -C net/korbit TOPDIR=`pwd`
+
diff -urN linux-2.4.1/net/CVS/Entries linux-2.4.1-korbit/net/CVS/Entries
--- linux-2.4.1/net/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/CVS/Entries Thu Feb 1 11:46:49 2001
@@ -0,0 +1 @@
+D
diff -urN linux-2.4.1/net/CVS/Entries.Log linux-2.4.1-korbit/net/CVS/Entries.Log
--- linux-2.4.1/net/CVS/Entries.Log Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/CVS/Entries.Log Thu Feb 1 11:46:49 2001
@@ -0,0 +1 @@
+A D/korbit////
diff -urN linux-2.4.1/net/CVS/Repository linux-2.4.1-korbit/net/CVS/Repository
--- linux-2.4.1/net/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/CVS/Repository Thu Feb 1 11:46:49 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net
diff -urN linux-2.4.1/net/CVS/Root linux-2.4.1-korbit/net/CVS/Root
--- linux-2.4.1/net/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/CVS/Root Thu Feb 1 11:46:49 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/Config.in linux-2.4.1-korbit/net/Config.in
--- linux-2.4.1/net/Config.in Tue Oct 10 19:33:52 2000
+++ linux-2.4.1-korbit/net/Config.in Thu Feb 1 15:46:07 2001
@@ -30,6 +30,7 @@
fi
if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
source net/khttpd/Config.in
+ source net/korbit/Config.in
fi
fi
if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
diff -urN linux-2.4.1/net/Makefile linux-2.4.1-korbit/net/Makefile
--- linux-2.4.1/net/Makefile Sat Dec 30 00:07:24 2000
+++ linux-2.4.1-korbit/net/Makefile Thu Feb 1 15:46:07 2001
@@ -7,7 +7,7 @@
O_TARGET := network.o
-mod-subdirs := ipv4/netfilter ipv6/netfilter ipx irda atm netlink sched
+mod-subdirs := ipv4/netfilter ipv6/netfilter ipx irda atm netlink sched korbit
export-objs := netsyms.o
subdir-y := core ethernet
@@ -27,6 +27,7 @@
endif
subdir-$(CONFIG_KHTTPD) += khttpd
+subdir-$(CONFIG_KORBIT) += korbit
subdir-$(CONFIG_NETLINK) += netlink
subdir-$(CONFIG_PACKET) += packet
subdir-$(CONFIG_NET_SCHED) += sched
diff -urN linux-2.4.1/net/korbit/CVS/Entries linux-2.4.1-korbit/net/korbit/CVS/Entries
--- linux-2.4.1/net/korbit/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/CVS/Entries Thu Feb 1 11:46:49 2001
@@ -0,0 +1,6 @@
+/Config.in/1.3/Thu Feb 1 09:46:49 2001//
+/Makefile/1.7/Thu Feb 1 09:46:49 2001//
+/config.h/1.2/Thu Feb 1 09:46:49 2001//
+/exported_symbols.c/1.8/Thu Feb 1 09:46:49 2001//
+/korbit.h/1.2/Thu Feb 1 09:46:49 2001//
+D
diff -urN linux-2.4.1/net/korbit/CVS/Entries.Log linux-2.4.1-korbit/net/korbit/CVS/Entries.Log
--- linux-2.4.1/net/korbit/CVS/Entries.Log Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/CVS/Entries.Log Thu Feb 1 11:47:15 2001
@@ -0,0 +1,7 @@
+A D/IIOP////
+A D/ORBitutil////
+A D/include////
+A D/kglib////
+A D/modules////
+A D/orb////
+A D/sup////
diff -urN linux-2.4.1/net/korbit/CVS/Repository linux-2.4.1-korbit/net/korbit/CVS/Repository
--- linux-2.4.1/net/korbit/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/CVS/Repository Thu Feb 1 11:46:49 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit
diff -urN linux-2.4.1/net/korbit/CVS/Root linux-2.4.1-korbit/net/korbit/CVS/Root
--- linux-2.4.1/net/korbit/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/CVS/Root Thu Feb 1 11:46:49 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/Config.in linux-2.4.1-korbit/net/korbit/Config.in
--- linux-2.4.1/net/korbit/Config.in Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/Config.in Thu Feb 1 11:46:49 2001
@@ -0,0 +1,8 @@
+#
+# KORBit
+#
+
+#tristate ' Kernel ORB (EXPERIMENTAL)' CONFIG_KORBIT
+bool ' Kernel ORB (EXPERIMENTAL)' CONFIG_KORBIT
+
+source net/korbit/modules/Config.in
diff -urN linux-2.4.1/net/korbit/IIOP/CVS/Entries linux-2.4.1-korbit/net/korbit/IIOP/CVS/Entries
--- linux-2.4.1/net/korbit/IIOP/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/IIOP/CVS/Entries Thu Feb 1 11:46:51 2001
@@ -0,0 +1,15 @@
+/IIOP-config.h/1.1.1.1/Thu Feb 1 09:46:50 2001//
+/IIOP-design.txt/1.1.1.1/Thu Feb 1 09:46:50 2001//
+/IIOP-private.h/1.2/Thu Feb 1 09:46:50 2001//
+/IIOP-types.h/1.1.1.1/Thu Feb 1 09:46:50 2001//
+/IIOP.h/1.1.1.1/Thu Feb 1 09:46:50 2001//
+/Makefile/1.4/Thu Feb 1 09:46:51 2001//
+/connection.c/1.19/Thu Feb 1 09:46:51 2001//
+/encoders.c/1.1.1.1/Thu Feb 1 09:46:51 2001//
+/giop-msg-buffer.c/1.12/Thu Feb 1 09:46:51 2001//
+/giop-msg-buffer.h/1.1.1.1/Thu Feb 1 09:46:51 2001//
+/iiop-encoders.h/1.1.1.1/Thu Feb 1 09:46:51 2001//
+/iiop-endian.c/1.1.1.1/Thu Feb 1 09:46:51 2001//
+/iiop-endian.h/1.1.1.1/Thu Feb 1 09:46:51 2001//
+/iiop-endianP.h/1.1.1.1/Thu Feb 1 09:46:51 2001//
+D
diff -urN linux-2.4.1/net/korbit/IIOP/CVS/Repository linux-2.4.1-korbit/net/korbit/IIOP/CVS/Repository
--- linux-2.4.1/net/korbit/IIOP/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/IIOP/CVS/Repository Thu Feb 1 11:46:50 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/IIOP
diff -urN linux-2.4.1/net/korbit/IIOP/CVS/Root linux-2.4.1-korbit/net/korbit/IIOP/CVS/Root
--- linux-2.4.1/net/korbit/IIOP/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/IIOP/CVS/Root Thu Feb 1 11:46:49 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/IIOP/IIOP-config.h linux-2.4.1-korbit/net/korbit/IIOP/IIOP-config.h
--- linux-2.4.1/net/korbit/IIOP/IIOP-config.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/IIOP/IIOP-config.h Thu Feb 1 11:46:50 2001
@@ -0,0 +1,5 @@
+/* The size of the chunks that are used for indirect pieces of messages.
+ Too low, and you'll have a lot of malloc overhead. Too high, and you'll
+ get wasted mem.
+*/
+#define GIOP_INDIRECT_CHUNK_SIZE 1024
diff -urN linux-2.4.1/net/korbit/IIOP/IIOP-design.txt linux-2.4.1-korbit/net/korbit/IIOP/IIOP-design.txt
--- linux-2.4.1/net/korbit/IIOP/IIOP-design.txt Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/IIOP/IIOP-design.txt Thu Feb 1 11:46:50 2001
@@ -0,0 +1,14 @@
+
+void Hello_hello(CORBA_Object anobj, const char *arg1, CORBA_Environment *ev)
+
+If we're doing a local call (i.e. shared library object activation),
+just do it.
+
+If we're doing a remote call, we need to setup generic header
+(utilfunc), setup request header (utilfunc), encode arguments (stubs),
+send the message headers & body (utilfunc) and wait for a reply (XXX
+define more clearly). When we get the reply, we need to read the
+reply(utilfunc), decode the return value & out/inout arguments(stubs)
+& fill them in (or decode the exception that resulted (utilfunc)), and
+return.
+
diff -urN linux-2.4.1/net/korbit/IIOP/IIOP-private.h linux-2.4.1-korbit/net/korbit/IIOP/IIOP-private.h
--- linux-2.4.1/net/korbit/IIOP/IIOP-private.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/IIOP/IIOP-private.h Thu Feb 1 11:46:50 2001
@@ -0,0 +1,46 @@
+#ifndef IIOP_PRIVATE_H
+#define IIOP_PRIVATE_H 1
+
+
+#include "config.h"
+
+#if defined(HAVE_POLL) && defined(I_WANT_POLL)
+#define USE_POLL
+#else
+#undef USE_POLL
+#endif
+
+#ifdef HAVE_SYS_POLL_H
+#include <sys/poll.h>
+#endif
+
+#include <sys/time.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <glib.h>
+
+typedef struct {
+ GList *list;
+ gboolean connection_list_changed;
+#ifndef __KORBIT__
+ GPtrArray *fd_to_connection_mapping;
+#else /* __KORBIT__ */
+ GHashTable *fd_to_connection_mapping;
+#endif /* __KORBIT__ */
+# ifdef USE_POLL
+ GArray *pollset;
+# else
+ fd_set selectset_rd, selectset_ex;
+# endif
+ int max_fd;
+} GIOPConnectionList;
+
+extern GIOPConnectionList giop_connection_list;
+
+/* If you get a buffer that you didn't want, add it to the list! */
+void giop_received_list_push(GIOPRecvBuffer *recv_buffer);
+GIOPRecvBuffer *giop_received_list_pop(void);
+
+
+#endif
diff -urN linux-2.4.1/net/korbit/IIOP/IIOP-types.h linux-2.4.1-korbit/net/korbit/IIOP/IIOP-types.h
--- linux-2.4.1/net/korbit/IIOP/IIOP-types.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/IIOP/IIOP-types.h Thu Feb 1 11:46:50 2001
@@ -0,0 +1,76 @@
+#ifndef IIOP_TYPES_H
+#define IIOP_TYPES_H 1
+
+/* XXX todo sync this up with basic_types.h if needed */
+#include <unistd.h>
+#include <netinet/in.h>
+#include <sys/un.h>
+
+#include <ORBitutil/basic_types.h>
+
+typedef enum {
+ GIOP_CONNECTION_SERVER, /* Not a real connection to any place - just
+ listening */
+ GIOP_CONNECTION_CLIENT
+} GIOPConnectionClass;
+
+typedef struct _GIOPConnection GIOPConnection;
+struct _GIOPConnection {
+ enum { GIOP_CONNECTION_NONE, GIOP_CONNECTION_IIOP } connection_type;
+ void (*destroy_func)(GIOPConnection *connection);
+
+ gint refcount;
+ GIOPConnectionClass connection_class;
+
+ int fd;
+
+ /* You can access these if you wish. */
+ gpointer orb_data;
+ gpointer user_data;
+ /* end accessable stuff */
+
+ guchar is_valid, was_initiated, is_auth;
+
+ gpointer incoming_msg; /* GIOPRecvBuffer */
+};
+
+#define GIOP_CONNECTION(x) ((GIOPConnection *)(x))
+#define GIOP_CONNECTION_GET_FD(x) (GIOP_CONNECTION((x))->fd)
+
+typedef enum { IIOP_IPV4, IIOP_IPV6, IIOP_USOCK } IIOPConnectionType;
+
+typedef struct {
+ GIOPConnection giop_connection;
+
+ gboolean is_serversock;
+ IIOPConnectionType icnxtype;
+ union {
+ struct {
+ char *hostname;
+ struct sockaddr_in location;
+ } ipv4;
+ struct sockaddr_un usock;
+ /* Yes this is a config.h define, and no it doesn't matter,
+ because this structure should only be used internally anyways */
+#ifdef HAVE_IPV6
+ struct {
+ char *hostname;
+ struct sockaddr_in6 location;
+ } ipv6;
+#endif
+ } u;
+} IIOPConnection;
+
+#define IIOP_CONNECTION(x) ((IIOPConnection *)(x))
+
+#if defined(DEBUG_sopwith_connection_refcounting)
+#define giop_connection_ref(x) G_STMT_START{ (GIOP_CONNECTION(x)->refcount++); g_print("! reffing fd %d in " __PRETTY_FUNCTION__ ":%d to %d\n", GIOP_CONNECTION_GET_FD(x), __LINE__, GIOP_CONNECTION(x)->refcount); }G_STMT_END
+
+#define giop_connection_unref(x) G_STMT_START{ GIOP_CONNECTION(x)->refcount--; g_print("! dereffing fd %d in " __PRETTY_FUNCTION__ ":%d to %d\n", GIOP_CONNECTION_GET_FD(x), __LINE__, GIOP_CONNECTION(x)->refcount); if(GIOP_CONNECTION(x)->refcount <= 0) giop_connection_free(x); }G_STMT_END
+#else
+#define giop_connection_ref(x) G_STMT_START{ (GIOP_CONNECTION(x)->refcount++); }G_STMT_END
+
+#define giop_connection_unref(x) G_STMT_START{ GIOP_CONNECTION(x)->refcount--; if(GIOP_CONNECTION(x)->refcount <= 0) giop_connection_free(x); }G_STMT_END
+#endif
+
+#endif /* IIOP_TYPES_H */
diff -urN linux-2.4.1/net/korbit/IIOP/IIOP.h linux-2.4.1-korbit/net/korbit/IIOP/IIOP.h
--- linux-2.4.1/net/korbit/IIOP/IIOP.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/IIOP/IIOP.h Thu Feb 1 16:19:47 2001
@@ -0,0 +1,52 @@
+#ifndef IIOP_H
+#define IIOP_H 1
+
+#include <unistd.h>
+#include <ORBitutil/util.h>
+#include "IIOP-config.h"
+#include "IIOP-types.h"
+#include "giop-msg-buffer.h"
+#include "iiop-encoders.h"
+#include "iiop-endian.h"
+
+/* We don't speak GIOP 1.0, sosumi */
+#define GIOP_1_1
+
+
+void giop_init(const char *argv0);
+
+/* You use this to get a pointer to a new (or existing) connection
+ that has the specified host/port characteristics */
+IIOPConnection *iiop_connection_get(const char *host, gushort port,
+ gboolean existing_only);
+/* Similar, but for UNIX sockets */
+IIOPConnection *iiop_connection_unix_get(const char *sockpath,
+ gboolean existing_only);
+
+/* gives us a local socket that other people can connect to... */
+IIOPConnection *iiop_connection_server(void);
+IIOPConnection *iiop_connection_server_ipv6(void);
+IIOPConnection *iiop_connection_server_unix(const char *sockpath);
+
+void giop_main_quit(void);
+void giop_main(void); /* main loop for the program if none other is given,
+ and also used while waiting for a reply */
+void giop_main_iterate(gboolean blocking);
+void giop_main_handle_connection(GIOPConnection *connection);
+void giop_main_handle_connection_exception(GIOPConnection *connection);
+GIOPRecvBuffer *giop_main_next_message(gboolean blocking);
+GIOPRecvBuffer *giop_main_next_message_2(gboolean blocking,
+ GIOPConnection *monitor);
+GIOPConnection *giop_check_connections(gboolean block_for_reply);
+
+/* This assumes that the appropriate GIOP_CLOSECONNECTION message
+ has been sent to the peer */
+void giop_connection_free(GIOPConnection *connection);
+
+/* Called when a connection is created */
+extern void (*IIOPAddConnectionHandler)(GIOPConnection *newcnx);
+/* Called when a connection is about to be destroyed */
+extern void (*IIOPRemoveConnectionHandler)(GIOPConnection *oldcnx);
+extern void (*IIOPIncomingMessageHandler)(GIOPRecvBuffer *recv_buffer);
+
+#endif /* IIOP_H */
diff -urN linux-2.4.1/net/korbit/IIOP/Makefile linux-2.4.1-korbit/net/korbit/IIOP/Makefile
--- linux-2.4.1/net/korbit/IIOP/Makefile Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/IIOP/Makefile Thu Feb 1 11:46:51 2001
@@ -0,0 +1,18 @@
+#
+# Makefile for KORBit/IIOP
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .o file).
+#
+# Note 2! The CFLAGS definition is now in the main makefile...
+
+O_TARGET := IIOPlib.o
+
+#obj-m := $(O_TARGET)
+obj-y := connection.o encoders.o giop-msg-buffer.o iiop-endian.o
+
+
+EXTRA_CFLAGS = -D__KORBIT__ -DHAVE_CONFIG_H -I. -I.. -I../include -I../kglib -I../ORBitutil -nostdinc
+
+include $(TOPDIR)/Rules.make
diff -urN linux-2.4.1/net/korbit/IIOP/connection.c linux-2.4.1-korbit/net/korbit/IIOP/connection.c
--- linux-2.4.1/net/korbit/IIOP/connection.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/IIOP/connection.c Thu Feb 1 19:26:07 2001
@@ -0,0 +1,1565 @@
+#include "config.h"
+
+#if defined(HAVE_POLL) && defined(I_WANT_POLL)
+#define USE_POLL
+#else
+#undef USE_POLL
+#endif
+
+#ifndef _XOPEN_SOURCE_EXTENDED
+# define _XOPEN_SOURCE_EXTENDED 1
+# define WE_DEFINED_XOPEN_SOURCE_EXTENDED 1
+#endif
+#include "iiop-endianP.h"
+#ifdef WE_DEFINED_XOPEN_SOURCE_EXTENDED
+# undef _XOPEN_SOURCE_EXTENDED
+#endif
+#include "IIOP.h"
+#include "IIOP-private.h"
+#include "giop-msg-buffer.h"
+#include <stdlib.h>
+#include <unistd.h>
+#ifdef ORBIT_DEBUG
+#include <errno.h>
+#endif
+#include <sys/types.h>
+#include <fcntl.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#ifndef _XOPEN_SOURCE_EXTENDED
+# define _XOPEN_SOURCE_EXTENDED 1
+#endif
+#include <arpa/inet.h>
+#include <netdb.h>
+#ifdef WE_DEFINED_XOPEN_SOURCE_EXTENDED
+# undef _XOPEN_SOURCE_EXTENDED
+#endif
+#include <ctype.h>
+#include <string.h>
+#include <sys/time.h>
+#include <sys/ioctl.h>
+#include <signal.h>
+#include <syslog.h>
+#include <stdio.h>
+
+/*
+#ifdef O_NONBLOCK
+#undef O_NONBLOCK
+#endif
+#define O_NONBLOCK 0
+*/
+
+#if defined(HAVE_TCPD_H) && defined(HAVE_HOSTS_ACCESS)
+#include <tcpd.h>
+#endif
+
+#if 0
+#include <malloc.h>
+
+static struct mallinfo mi1, mi2;
+
+#define AM() mi1 = mallinfo();
+#define PM(x) mi2 = mallinfo(); printf(x ": used %d, now %d\n", \
+mi2.uordblks - mi1.uordblks, mi2.uordblks);
+#endif
+
+#ifdef HAVE_POLL
+#include <sys/poll.h>
+#endif
+
+#ifndef SUN_LEN
+/* This system is not POSIX.1g. */
+#define SUN_LEN(ptr) ((size_t) (((struct sockaddr_un *) 0)->sun_path) \
+ + strlen ((ptr)->sun_path))
+#endif
+
+void (*IIOPAddConnectionHandler)(GIOPConnection *newcnx) = NULL;
+void (*IIOPRemoveConnectionHandler)(GIOPConnection *oldcnx) = NULL;
+void (*IIOPIncomingMessageHandler)(GIOPRecvBuffer *recv_buffer) = NULL;
+
+static void giop_connection_add_to_list (GIOPConnection *cnx);
+static void giop_connection_remove_from_list (GIOPConnection *cnx);
+
+static void iiop_init (void);
+static void iiop_connection_server_accept (GIOPConnection *connection);
+static void iiop_connection_destroy (IIOPConnection *connection);
+static IIOPConnection *iiop_connection_new (const char *host, gushort port);
+static IIOPConnection *iiop_connection_unix_new (const char *sockpath);
+static void iiop_unlink_unix_sockets (void);
+
+DEFINE_LOCK(giop_connection_list);
+GIOPConnectionList giop_connection_list;
+static GSList *iiop_unix_socket_list = NULL;
+
+#if defined(HAVE_HOSTS_ACCESS) && defined (HAVE_TCPD_H)
+static const char *argv0_val = NULL;
+#endif
+
+struct fd_hash_elem
+{
+ guint fd;
+ GIOPConnection *cnx;
+};
+
+static guint fd_hash_func(gconstpointer key)
+{
+ const guint *key_ptr = (guint *)key;
+ guint result = *key_ptr >> 2;
+ return result;
+}
+
+static gint fd_compare_func(gconstpointer a, gconstpointer b)
+{
+ const guint *a_ptr = (guint *)a;
+ const guint *b_ptr = (guint *)b;
+ return *a_ptr == *b_ptr;
+}
+
+static gboolean fd_hash_clear(gpointer key, gpointer value, gpointer user_data)
+{
+ struct fd_hash_elem *el = (struct fd_hash_elem *)value;
+ g_free(el);
+ return TRUE;
+}
+
+/*
+ * giop_init
+ *
+ * Inputs: None
+ * Outputs: None
+ *
+ * Side effects: Initializes giop_connection_list
+ * Global data structures used: giop_connection_list
+ *
+ * Description: Initializes giop_connection_list. Calls
+ * giop_message_buffer_init() to initialize the
+ * message_buffer subsystem. Calls iiop_init()
+ * to perform IIOP-specific initialization.
+ */
+
+void giop_init(const char *argv0)
+{
+#ifndef __KERNEL__
+ struct sigaction mypipe;
+#endif
+ g_assert(sizeof(GIOPMessageHeader) == 12);
+
+#if defined(HAVE_HOSTS_ACCESS) && defined (HAVE_TCPD_H)
+ argv0_val = g_strdup(g_basename(argv0)); /* For TCP wrappers */
+#endif
+
+#ifndef __KERNEL__
+ memset(&mypipe, '\0', sizeof(mypipe));
+ mypipe.sa_handler = SIG_IGN;
+
+ sigaction(SIGPIPE, &mypipe, NULL);
+#endif
+
+ giop_message_buffer_init();
+
+ INIT_LOCK(giop_connection_list);
+
+ giop_connection_list.list = NULL;
+ giop_connection_list.connection_list_changed = FALSE;
+
+#ifdef USE_POLL
+ giop_connection_list.pollset = g_array_new(FALSE, FALSE,
+ sizeof(struct pollfd));
+#else
+ FD_ZERO(&giop_connection_list.selectset_rd);
+ FD_ZERO(&giop_connection_list.selectset_ex);
+#endif
+
+#ifndef __KORBIT__
+ giop_connection_list.fd_to_connection_mapping = g_ptr_array_new();
+#else
+ giop_connection_list.fd_to_connection_mapping =
+ g_hash_table_new(&fd_hash_func,
+ &fd_compare_func);
+#endif
+
+ /*
+ * This also needs to do any transport-specific initialization
+ * as appropriate
+ */
+ iiop_init();
+}
+
+/*** giop_connection_init
+ *
+ * Inputs: 'giop_connection' - memory region allocated for use as a
+ * GIOPConnection.
+ * 'cnxclass' - the class of connection that will be stored
+ * here (SERVER, CLIENT)
+ *
+ * Outputs: None
+ *
+ * Side effects: Initializes 'giop_connection'.
+ *
+ * Description: Basic setup of a GIOPConnection.
+ * Sets is_valid to FALSE because it is the responsibility of
+ * the transport-specific initialization routine to make
+ * a connection valid.
+ */
+
+static void giop_connection_init(GIOPConnection *giop_connection,
+ GIOPConnectionClass cnxclass)
+{
+ giop_connection->connection_type = GIOP_CONNECTION_NONE;
+ giop_connection->refcount = 0;
+ giop_connection->connection_class = cnxclass;
+ giop_connection->is_valid = FALSE;
+ giop_connection->is_auth = FALSE;
+ giop_connection->was_initiated = FALSE;
+}
+
+/*
+ * giop_connection_free
+ * Inputs: 'connection'
+ * Outputs: None
+ * Side effects: Makes the 'connection' invalid as a GIOPConnection
+ * and as a gpointer.
+ *
+ * Description: Calls giop_connection_remove_from_list() to
+ * stop the connection from being used for incoming.
+ *
+ * If a transport-specific finalization function has
+ * been provided, call it.
+ *
+ * Free the memory block at '*connection'.
+ *
+ */
+void giop_connection_free(GIOPConnection *connection)
+{
+ g_return_if_fail(connection != NULL);
+ giop_connection_remove_from_list(connection);
+
+ if(connection->is_valid && connection->destroy_func)
+ connection->destroy_func(connection);
+
+ connection->is_valid = FALSE;
+
+ if(connection->incoming_msg) {
+ GIOPRecvBuffer *buf;
+
+ buf = connection->incoming_msg;
+ connection->incoming_msg = NULL;
+ giop_recv_buffer_unuse(buf);
+ }
+
+ g_free(connection);
+}
+
+/*
+ * giop_connection_list_recreate
+ *
+ * Inputs: None
+ * Outputs: None
+ *
+ * Side effects: giop_connection_list changes.
+ *
+ * Global data structures used: giop_connection_list
+ *
+ * Description:
+ * When new connections are added to giop_connection_list.list,
+ * the data structures passed to poll() or select() (OS-dependant)
+ * must be recreated to match this list.
+ *
+ * [We do this at add-connection/remove-connection time
+ * instead of every time a poll/select is done in order to
+ * speed things up a little]
+ *
+ * This function reinitializes the OS-specific file
+ * descriptor data structure and then adds all the file
+ * descriptors in the list to it.
+ *
+ * It also regenerates the array that maps file descriptors
+ * into GIOPConnection*'s
+ *
+ */
+static void
+giop_connection_list_recreate(void)
+{
+ int curfd;
+ GList *item;
+ GIOPConnection *cnx;
+#ifdef USE_POLL
+ struct pollfd new_poll;
+
+ new_poll.revents = 0;
+#endif
+
+ giop_connection_list.max_fd = 0;
+ for(item = giop_connection_list.list; item; item = g_list_next(item))
+ {
+ cnx = item->data;
+ curfd = GIOP_CONNECTION_GET_FD(cnx);
+
+ if(curfd > giop_connection_list.max_fd)
+ giop_connection_list.max_fd = curfd;
+ }
+
+#ifndef __KORBIT__
+ g_ptr_array_set_size(giop_connection_list.fd_to_connection_mapping,
+ giop_connection_list.max_fd + 1);
+#else
+ g_hash_table_foreach_remove(giop_connection_list.fd_to_connection_mapping,
+ fd_hash_clear,
+ NULL);
+#endif
+
+#ifdef USE_POLL
+ g_array_set_size(giop_connection_list.pollset, 0);
+#else
+ FD_ZERO(&giop_connection_list.selectset_rd);
+ FD_ZERO(&giop_connection_list.selectset_ex);
+#endif
+
+ for(item = giop_connection_list.list; item; item = g_list_next(item))
+ {
+ struct fd_hash_elem *el;
+
+ cnx = item->data;
+ curfd = GIOP_CONNECTION_GET_FD(cnx);
+
+#ifndef __KORBIT__
+ giop_connection_list.fd_to_connection_mapping->pdata[curfd] = cnx;
+#else
+ el = g_new(struct fd_hash_elem, 1);
+ el->fd = curfd;
+ el->cnx = cnx;
+ g_hash_table_insert(giop_connection_list.fd_to_connection_mapping,
+ &(el->fd),
+ el);
+#endif
+
+# ifdef USE_POLL
+ new_poll.fd = curfd;
+ new_poll.events = POLLIN|POLLPRI;
+ g_array_append_val(giop_connection_list.pollset,
+ new_poll);
+# else
+ FD_SET(curfd, &giop_connection_list.selectset_rd);
+ FD_SET(curfd, &giop_connection_list.selectset_ex);
+# endif
+ }
+}
+
+/*
+ * giop_connection_add_to_list
+ *
+ * Inputs: 'cnx' - a GIOPConnection that the user wishes added to the list
+ * Outputs: None
+ *
+ * Side effects: Modifies giop_connection_list
+ * Global data structures used: giop_connection_list
+ * Bugs: Does not check for duplicate additions.
+ *
+ * Description:
+ * Adds a connection to the list of active connections.
+ */
+static void
+giop_connection_add_to_list(GIOPConnection *cnx)
+{
+ g_return_if_fail(cnx->is_valid == FALSE);
+
+ cnx->is_valid = TRUE;
+
+ GET_LOCK(giop_connection_list);
+ giop_connection_list.list = g_list_prepend(giop_connection_list.list, cnx);
+
+ giop_connection_list_recreate();
+
+ RELEASE_LOCK(giop_connection_list);
+
+ if(IIOPAddConnectionHandler)
+ IIOPAddConnectionHandler(cnx);
+
+ giop_connection_ref(cnx);
+}
+
+/*
+ * giop_connection_remove_from_list
+ *
+ * Inputs: 'cnx' - a GIOPConnection that the user wishes
+ * Outputs: None
+ *
+ * Side effects: Modifies giop_connection_list
+ * Global data structures used: giop_connection_list
+ *
+ * Description:
+ * Removes a connection from the list of active connections.
+ * Calls the library user's "I removed connection" handler if it
+ * exists.
+ *
+ * Bugs: Does not check for duplicate removals. This may not be "bad" though.
+ */
+void
+giop_connection_remove_from_list(GIOPConnection *cnx)
+{
+ GList *link;
+
+ GET_LOCK(giop_connection_list);
+
+ link = g_list_find(giop_connection_list.list, cnx);
+
+ if(!link)
+ goto out;
+
+ if(IIOPRemoveConnectionHandler && cnx->is_valid)
+ IIOPRemoveConnectionHandler(cnx);
+
+ giop_connection_list.list = g_list_remove_link(giop_connection_list.list,
+ link);
+ g_list_free_1(link);
+
+ giop_connection_unref(cnx);
+
+ giop_connection_list_recreate();
+ out:
+ RELEASE_LOCK(giop_connection_list);
+}
+
+/************************************************
+ * Routines specific to the IIOP/IPv4 transport *
+ ************************************************/
+
+/*
+ * iiop_init
+ *
+ * Inputs: None
+ * Outputs: None
+ *
+ * Side effects: Initializes iiop_unix_socket_list
+ * Global data structures used: iiop_unix_socket_list
+ *
+ * Description: Initializes iiop_unix_socket_list.
+ * Registers Unix domain sockets for
+ * removal at server termination.
+ */
+static void
+iiop_init(void)
+{
+#ifndef __KERNEL__
+ g_atexit(iiop_unlink_unix_sockets);
+#endif
+}
+
+/*
+ * iiop_connection_init
+ *
+ * Inputs: 'connection' - a memory region that needs to be initialized as
+ * an 'IIOPConnection'.
+ *
+ * Side effects: initializes 'connection'
+ *
+ * Description: Performs the IIOP-specific initialization of an
+ * IIOPConnection. giop_connection_init is called.
+ *
+ */
+void
+iiop_connection_init(IIOPConnection *connection,
+ GIOPConnectionClass cnxclass,
+ IIOPConnectionType iioptype)
+{
+ giop_connection_init(GIOP_CONNECTION(connection), cnxclass);
+
+ GIOP_CONNECTION(connection)->connection_type =
+ GIOP_CONNECTION_IIOP;
+
+ GIOP_CONNECTION(connection)->destroy_func =
+ (void (*)(GIOPConnection *))iiop_connection_destroy;
+
+ connection->icnxtype = iioptype;
+}
+
+/*
+ * iiop_connection_from_fd
+ *
+ * Inputs: 'fd' - a file descriptor that attention should be paid to
+ * Outputs: 'fd_cnx' - the created connection
+ *
+ * Description: This is intended to be used on a file descriptor
+ * that has been accept()'d. It creates the connection
+ * and fills in the connection information, then adds
+ * it to the active list.
+ */
+IIOPConnection *
+iiop_connection_from_fd(int fd, IIOPConnection *parent)
+{
+ IIOPConnection *fd_cnx;
+ struct hostent *hent;
+ socklen_t n;
+
+ g_assert(fd >= 0);
+
+ fd_cnx = g_new0(IIOPConnection, 1);
+
+ iiop_connection_init(fd_cnx, GIOP_CONNECTION_CLIENT, parent->icnxtype);
+
+ GIOP_CONNECTION(fd_cnx)->fd = fd;
+
+ switch(parent->icnxtype) {
+ case IIOP_IPV4:
+ n = sizeof(struct sockaddr_in);
+ if(getpeername(GIOP_CONNECTION_GET_FD(fd_cnx), (struct sockaddr *)&fd_cnx->u.ipv4.location, &n))
+ {
+ fd_cnx->u.ipv4.hostname = g_strdup("");
+ }
+ else
+ {
+ hent = gethostbyaddr((const char *)&fd_cnx->u.ipv4.location.sin_addr.s_addr, 4, AF_INET);
+ if(hent)
+ {
+ fd_cnx->u.ipv4.hostname = g_strdup(hent->h_name);
+ }
+ else
+ {
+ fd_cnx->u.ipv4.hostname = inet_ntoa(*((struct in_addr *)&fd_cnx->u.ipv4.location.sin_addr));
+ }
+ }
+ break;
+
+ case IIOP_USOCK:
+ n = sizeof(struct sockaddr_un);
+ fd_cnx->u.usock.sun_family = AF_UNIX;
+ getpeername(GIOP_CONNECTION_GET_FD(fd_cnx),
+ (struct sockaddr *)&fd_cnx->u.usock, &n);
+ break;
+
+#ifdef HAVE_IPV6
+ case IIOP_IPV6:
+ n = sizeof(struct sockaddr_in6);
+ getpeername(GIOP_CONNECTION_GET_FD(fd_cnx),
+ (struct sockaddr *)&fd_cnx->u.ipv6.location, &n);
+ hent = gethostbyaddr((const char *)&fd_cnx->u.ipv6.location.sin6_addr,
+ sizeof(fd_cnx->u.ipv6.location.sin6_addr), AF_INET6);
+ fd_cnx->u.ipv6.hostname = g_strdup(hent->h_name);
+ break;
+#endif
+
+ default:
+ g_error("Unsupported connection type %d", parent->icnxtype);
+ }
+
+ fcntl(GIOP_CONNECTION_GET_FD(fd_cnx), F_SETFD,
+ fcntl(GIOP_CONNECTION_GET_FD(fd_cnx), F_GETFD, 0)
+ | FD_CLOEXEC);
+ fcntl(GIOP_CONNECTION_GET_FD(fd_cnx), F_SETFL,
+ fcntl(GIOP_CONNECTION_GET_FD(fd_cnx), F_GETFL, 0)
+ | O_NONBLOCK);
+
+ ORBit_Trace(TraceMod_IIOP, TraceLevel_Debug,
+ "iiop_connection_from_fd connect [%d]\n",
+ GIOP_CONNECTION_GET_FD(fd_cnx));
+
+ giop_connection_add_to_list(GIOP_CONNECTION(fd_cnx));
+
+ return fd_cnx;
+}
+
+/*
+ * iiop_connection_server
+ *
+ * Outputs: 'server_cnx'
+ *
+ * Description: Creates a special IIOPConnection on which incoming
+ * connections come.
+ */
+IIOPConnection *
+iiop_connection_server(void)
+{
+ struct hostent *hent;
+ char hn_tmp[65];
+ socklen_t n;
+ IIOPConnection *server_cnx = g_new0(IIOPConnection, 1);
+
+ iiop_connection_init(server_cnx, GIOP_CONNECTION_SERVER, IIOP_IPV4);
+
+ server_cnx->is_serversock = TRUE;
+ GIOP_CONNECTION(server_cnx)->fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
+
+ if(GIOP_CONNECTION_GET_FD(server_cnx) < 0) {
+ ORBit_Trace(TraceMod_IIOP, TraceLevel_Debug, "iiop_connection_server: socket_error: %s\n", strerror(errno));
+ goto failed;
+ }
+
+ server_cnx->u.ipv4.location.sin_family = AF_INET;
+ server_cnx->u.ipv4.location.sin_addr.s_addr = INADDR_ANY;
+ bind(GIOP_CONNECTION_GET_FD(server_cnx),
+ (struct sockaddr *)&server_cnx->u.ipv4.location,
+ sizeof(struct sockaddr_in));
+
+ fcntl(GIOP_CONNECTION_GET_FD(server_cnx), F_SETFD,
+ fcntl(GIOP_CONNECTION_GET_FD(server_cnx), F_GETFD, 0)
+ | FD_CLOEXEC);
+ fcntl(GIOP_CONNECTION_GET_FD(server_cnx), F_SETFL,
+ fcntl(GIOP_CONNECTION_GET_FD(server_cnx), F_GETFL, 0)
+ | O_NONBLOCK);
+
+ n = sizeof(struct sockaddr_in);
+ getsockname(GIOP_CONNECTION_GET_FD(server_cnx),
+ (struct sockaddr *)&server_cnx->u.ipv4.location, &n);
+
+ gethostname(hn_tmp, sizeof(hn_tmp) - 1);
+
+ hent = gethostbyname(hn_tmp);
+ if(hent)
+ {
+ if (strchr (hent->h_name, '.'))
+ server_cnx->u.ipv4.hostname = g_strdup(hent->h_name);
+ else
+ {
+ struct in_addr * addr = (struct in_addr *) hent->h_addr_list[0];
+ g_assert (hent->h_length == sizeof (struct in_addr) && addr);
+ server_cnx->u.ipv4.hostname = g_strdup (inet_ntoa (*addr));
+ }
+ }
+ else
+ server_cnx->u.ipv4.hostname = g_strdup(hn_tmp);
+
+ listen(GIOP_CONNECTION_GET_FD(server_cnx), 5);
+
+ giop_connection_add_to_list(GIOP_CONNECTION(server_cnx));
+
+ return server_cnx;
+
+failed:
+ close(GIOP_CONNECTION_GET_FD(server_cnx));
+ GIOP_CONNECTION(server_cnx)->fd = -1;
+ giop_connection_free(GIOP_CONNECTION(server_cnx));
+ server_cnx = NULL;
+ /*
+ * FIXME: GET_LOCK and DEFINE_LOCK never called for server_cnx
+ RELEASE_LOCK(server_cnx);
+ */
+ return NULL;
+}
+
+/*
+ * iiop_connection_server_ipv6
+ * Outputs: 'server_cnx'
+ *
+ * Description: Create a special IIOPConnection on which incoming
+ * connections come.
+ */
+IIOPConnection *
+iiop_connection_server_ipv6(void)
+{
+#ifdef HAVE_IPV6
+ struct hostent *hent, *hent2;
+
+ char hn_tmp[65];
+ int n;
+ IIOPConnection *server_cnx;
+
+ g_error("IPv6 support is baroquen! (Actually just never worked)");
+
+ server_cnx = g_new0(IIOPConnection, 1);
+
+ iiop_connection_init(server_cnx, GIOP_CONNECTION_SERVER, IIOP_IPV6);
+
+ server_cnx->is_serversock = TRUE;
+ GIOP_CONNECTION(server_cnx)->fd = socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP);
+
+ if(GIOP_CONNECTION_GET_FD(server_cnx) < 0) {
+ ORBit_Trace(TraceMod_IIOP, TraceLevel_Debug, "iiop_connection_server_ipv6: socket_error: %s\n", strerror(errno));
+ goto failed;
+ }
+
+ server_cnx->u.ipv6.location.sin6_family = AF_INET6;
+ bind(GIOP_CONNECTION_GET_FD(server_cnx),
+ (struct sockaddr *)&server_cnx->u.ipv6.location,
+ sizeof(struct sockaddr_in6));
+
+ fcntl(GIOP_CONNECTION_GET_FD(server_cnx), F_SETFD,
+ fcntl(GIOP_CONNECTION_GET_FD(server_cnx), F_GETFD, 0)
+ | FD_CLOEXEC);
+ fcntl(GIOP_CONNECTION_GET_FD(server_cnx), F_SETFL,
+ fcntl(GIOP_CONNECTION_GET_FD(server_cnx), F_GETFL, 0)
+ | O_NONBLOCK);
+
+ n = sizeof(struct sockaddr_in6);
+ getsockname(GIOP_CONNECTION_GET_FD(server_cnx), &server_cnx->u.ipv6.location, &n);
+
+ gethostname(hn_tmp, sizeof(hn_tmp) - 1);
+
+ hent = gethostbyname(hn_tmp);
+ if(hent) {
+ hent2 = gethostbyaddr(hent->h_addr, sizeof(server_cnx->u.ipv6.location.sin6_addr), AF_INET6);
+ if(hent2)
+ server_cnx->hostname = g_strdup(hent2->h_name);
+ else
+ server_cnx->hostname = g_strdup(hn_tmp);
+ } else
+ server_cnx->hostname = g_strdup(hn_tmp);
+
+ listen(GIOP_CONNECTION_GET_FD(server_cnx), 5);
+
+ giop_connection_add_to_list(GIOP_CONNECTION(server_cnx));
+
+ return server_cnx;
+
+failed:
+ close(GIOP_CONNECTION_GET_FD(server_cnx));
+ GIOP_CONNECTION(server_cnx)->fd = -1;
+ giop_connection_free(GIOP_CONNECTION(server_cnx));
+ server_cnx = NULL;
+ /*
+ * FIXME: GET_LOCK and DEFINE_LOCK never called for server_cnx
+ RELEASE_LOCK(server_cnx);
+ */
+#endif
+ return NULL;
+}
+
+/*
+ * iiop_connection_server_unix
+ *
+ * Outputs: 'server_cnx_unix'
+ *
+ * Side effects: Initializes 'server_cnx_unix' if not initialized.
+ *
+ * Description: Return a special IIOPConnection on which incoming connections
+ * come. If not already initialized, it creates the connection,
+ * otherwise it returns the existing one.
+ * This is
+ */
+IIOPConnection *
+iiop_connection_server_unix(const char *sockpath)
+{
+ IIOPConnection *server_cnx_unix;
+
+ g_assert(sockpath && *sockpath);
+
+ server_cnx_unix = g_new0(IIOPConnection, 1);
+
+ iiop_connection_init(server_cnx_unix, GIOP_CONNECTION_SERVER, IIOP_USOCK);
+
+ server_cnx_unix->is_serversock = TRUE;
+ GIOP_CONNECTION(server_cnx_unix)->fd = socket(AF_UNIX, SOCK_STREAM, 0);
+
+ if(GIOP_CONNECTION_GET_FD(server_cnx_unix) < 0) {
+ ORBit_Trace(TraceMod_IIOP, TraceLevel_Debug, "iiop_connection_server_unix: socket_error: %s\n", strerror(errno));
+ goto failed;
+ }
+
+ strcpy(server_cnx_unix->u.usock.sun_path, sockpath);
+
+ server_cnx_unix->u.usock.sun_family = AF_UNIX;
+ if(bind(GIOP_CONNECTION_GET_FD(server_cnx_unix),
+ (struct sockaddr *)&server_cnx_unix->u.usock,
+ SUN_LEN(&server_cnx_unix->u.usock)) != 0) {
+ /* see the comment in iiop_connection_destroy switch as to why we
+ close it here. bad hack */
+ close(GIOP_CONNECTION_GET_FD(server_cnx_unix));
+ GIOP_CONNECTION(server_cnx_unix)->fd = -1;
+ goto failed;
+ }
+
+ fcntl(GIOP_CONNECTION_GET_FD(server_cnx_unix), F_SETFD,
+ fcntl(GIOP_CONNECTION_GET_FD(server_cnx_unix), F_GETFD, 0)
+ | FD_CLOEXEC);
+ fcntl(GIOP_CONNECTION_GET_FD(server_cnx_unix), F_SETFL,
+ fcntl(GIOP_CONNECTION_GET_FD(server_cnx_unix), F_GETFL, 0)
+ | O_NONBLOCK);
+
+ if(listen(GIOP_CONNECTION_GET_FD(server_cnx_unix), 5) != 0)
+ goto failed;
+
+ giop_connection_add_to_list(GIOP_CONNECTION(server_cnx_unix));
+ iiop_unix_socket_list = g_slist_prepend(iiop_unix_socket_list,
+ server_cnx_unix);
+
+ /*
+ * FIXME: GET_LOCK and DEFINE_LOCK never called for server_cnx_unix
+ RELEASE_LOCK(server_cnx_unix);
+ */
+
+ return server_cnx_unix;
+
+failed:
+ close(GIOP_CONNECTION_GET_FD(server_cnx_unix));
+ GIOP_CONNECTION(server_cnx_unix)->fd = -1;
+ giop_connection_free(GIOP_CONNECTION(server_cnx_unix));
+ server_cnx_unix = NULL;
+ /*
+ * FIXME: GET_LOCK and DEFINE_LOCK never called for server_cnx_unix
+ RELEASE_LOCK(server_cnx_unix);
+ */
+ return NULL;
+}
+
+/*
+ * iiop_unlink_unix_sockets(void)
+ *
+ * Inputs: None
+ * Outputs: None
+ *
+ * Side effects: Modifies iiop_unix_socket_list
+ * Global data structures used: iiop_unix_socket_list
+ *
+ * Description:
+ * Unlinks any Unix server sockets created.
+ * Called during program termination.
+ */
+static void
+iiop_unlink_unix_sockets(void)
+{
+ GSList *item;
+
+ for (item = iiop_unix_socket_list;
+ item; item = g_slist_next(item)) {
+ GIOPConnection *cnx;
+
+ cnx = GIOP_CONNECTION(item->data);
+ if(cnx->connection_class == GIOP_CONNECTION_SERVER)
+ unlink(IIOP_CONNECTION(cnx)->u.usock.sun_path);
+ }
+
+ if (iiop_unix_socket_list) {
+ g_slist_free(iiop_unix_socket_list);
+ iiop_unix_socket_list = NULL;
+ }
+}
+
+/*
+ * iiop_connection_get
+ *
+ * Inputs: 'host' - the hostname (or dotted quad) of the remote host that
+ * will be connected
+ * 'port' - the port number on the above host to connect to.
+ * 'existing_only' - don't create a new connection if
+ * an existing one with the specified host:port
+ * doesn't exist.
+ *
+ * Outputs: 'cnx' - the connection to the specified host:port, or
+ * NULL upon error.
+ *
+ * Description: Returns an IIOPConnection that is connected to the
+ * specified host:port. If a connection already exists to the
+ * host:port, just returns it. Otherwise, calls
+ * 'iiop_connection_new' to create a new connection
+ * to host:port.
+ */
+IIOPConnection *
+iiop_connection_get(const char *host, gushort port, gboolean existing_only)
+{
+ IIOPConnection *cnx = NULL, *tmp;
+ GList *link;
+
+ g_assert(host);
+ g_assert(port);
+
+ GET_LOCK(giop_connection_list);
+ for(link = giop_connection_list.list; link; link = link->next)
+ {
+ tmp = IIOP_CONNECTION(link->data);
+ if(GIOP_CONNECTION(tmp)->connection_type != GIOP_CONNECTION_IIOP)
+ continue;
+
+ if(!GIOP_CONNECTION(tmp)->is_valid)
+ continue;
+
+ if(GIOP_CONNECTION(tmp)->connection_class != GIOP_CONNECTION_CLIENT)
+ continue;
+
+ if(IIOP_CONNECTION(tmp)->icnxtype != IIOP_IPV4)
+ continue;
+
+ if(!strcmp(host, tmp->u.ipv4.hostname)
+ && htons(port) == tmp->u.ipv4.location.sin_port) {
+ cnx = tmp;
+ break;
+ }
+ }
+ RELEASE_LOCK(giop_connection_list);
+
+ if(!cnx && !existing_only)
+ cnx = iiop_connection_new(host, port);
+
+ return cnx;
+}
+
+
+/*
+ * iiop_connection_new
+ *
+ * Inputs: same meanings as in 'iiop_connection_get'
+ * Outputs: 'retval' - newly created IIOPConnection
+ *
+ * Description: Allocates and initializes a new IIOPConnection,
+ * turns 'host' into an IP address, and then makes a TCP
+ * connection to host:port. Adds it to the list of active
+ * connections.
+ */
+IIOPConnection *
+iiop_connection_new(const char *host, gushort port)
+{
+ IIOPConnection *retval;
+
+ g_return_val_if_fail(host != NULL && port != 0, NULL);
+
+ retval = g_new0(IIOPConnection, 1);
+
+ iiop_connection_init(retval, GIOP_CONNECTION_CLIENT, IIOP_IPV4);
+
+ GIOP_CONNECTION(retval)->fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
+ if(GIOP_CONNECTION_GET_FD(retval) < 0) {
+ ORBit_Trace(TraceMod_IIOP, TraceLevel_Debug, "iiop_connection_new: socket_error: %s\n", strerror(errno));
+ goto failed;
+ }
+
+ retval->u.ipv4.hostname = g_strdup(host);
+
+ retval->u.ipv4.location.sin_port = htons(port);
+ retval->u.ipv4.location.sin_family = AF_INET;
+ if(!inet_aton(host, &retval->u.ipv4.location.sin_addr))
+ {
+ struct hostent *hent;
+ hent = gethostbyname(host);
+ if(!hent) {
+ /* a (char *)h_strerror(int) function would be nice here */
+ ORBit_Trace(TraceMod_IIOP, TraceLevel_Debug, "iiop_connection_new: gethostbyname error: %d\n", h_errno);
+ goto failed;
+ }
+ memcpy(&retval->u.ipv4.location.sin_addr, hent->h_addr, (size_t) sizeof(retval->u.ipv4.location.sin_addr));
+ }
+ if(connect(GIOP_CONNECTION_GET_FD(retval), (struct sockaddr *)&retval->u.ipv4.location, sizeof(retval->u.ipv4.location)) < 0) {
+ ORBit_Trace(TraceMod_IIOP, TraceLevel_Debug, "iiop_connection_new: connect error: %s\n", strerror(errno));
+ goto failed;
+ }
+
+ ORBit_Trace(TraceMod_IIOP, TraceLevel_Debug,
+ "iiop_connection_new connect [%d] to %s:%d\n",
+ GIOP_CONNECTION_GET_FD(retval),
+ host, (guint)port);
+
+
+ fcntl(GIOP_CONNECTION_GET_FD(retval), F_SETFD, FD_CLOEXEC);
+ fcntl(GIOP_CONNECTION_GET_FD(retval), F_SETFL,
+ fcntl(GIOP_CONNECTION_GET_FD(retval), F_GETFL, 0)
+ | O_NONBLOCK);
+
+ GIOP_CONNECTION(retval)->was_initiated = TRUE;
+ GIOP_CONNECTION(retval)->is_auth = TRUE;
+
+ giop_connection_add_to_list(GIOP_CONNECTION(retval));
+
+ return retval;
+
+failed:
+ close(GIOP_CONNECTION_GET_FD(retval));
+ GIOP_CONNECTION(retval)->fd = -1;
+ giop_connection_free(GIOP_CONNECTION(retval));
+ return NULL;
+}
+
+/*
+ * iiop_connection_unix_get
+ *
+ * Inputs: 'sockpath' - Of the format 'path'
+ *
+ * Outputs: 'cnx' - the connection to the specified path, or
+ * NULL upon error.
+ *
+ * Description: Returns an IIOPConnection that is connected to the
+ * specified UNIX socket, if possible. If a connection
+ * already exists, just returns it. Otherwise,
+ * calls 'iiop_connection_unix_new' to create a new
+ * connection to sockpath.
+ */
+IIOPConnection *
+iiop_connection_unix_get(const char *sockpath, gboolean existing_only)
+{
+ IIOPConnection *cnx = NULL, *tmp;
+ GList *link;
+
+ GET_LOCK(giop_connection_list);
+ for(link = giop_connection_list.list; link; link = link->next)
+ {
+ tmp = IIOP_CONNECTION(link->data);
+
+ if(GIOP_CONNECTION(tmp)->connection_type != GIOP_CONNECTION_IIOP)
+ continue;
+
+ if(!GIOP_CONNECTION(tmp)->is_valid)
+ continue;
+
+ if(GIOP_CONNECTION(tmp)->connection_class != GIOP_CONNECTION_CLIENT)
+ continue;
+
+ if(IIOP_CONNECTION(tmp)->icnxtype != IIOP_USOCK)
+ continue;
+
+ if(!strcmp(sockpath, tmp->u.usock.sun_path)) {
+ cnx = tmp;
+ break;
+ }
+ }
+ RELEASE_LOCK(giop_connection_list);
+
+ if(!cnx && !existing_only)
+ cnx = iiop_connection_unix_new(sockpath);
+
+ return cnx;
+}
+
+/*
+ * iiop_connection_unix_new
+ *
+ * Inputs:
+ *
+ * Outputs: 'retval' - newly created IIOPConnection, or NULL upon error
+ *
+ * Description: Creates a connection to a UNIX socket (if possible)
+ * Adds it to the list of active connections.
+ */
+static IIOPConnection *
+iiop_connection_unix_new(const char *sockpath)
+{
+ IIOPConnection *retval;
+
+ retval = g_new0(IIOPConnection, 1);
+
+ retval->u.usock.sun_family = AF_UNIX;
+
+ g_snprintf(retval->u.usock.sun_path,
+ sizeof(retval->u.usock.sun_path), "%s", sockpath);
+
+ iiop_connection_init(retval, GIOP_CONNECTION_CLIENT, IIOP_USOCK);
+
+ GIOP_CONNECTION(retval)->fd = socket(AF_UNIX, SOCK_STREAM, 0);
+ if(GIOP_CONNECTION_GET_FD(retval) < 0) {
+ ORBit_Trace(TraceMod_IIOP, TraceLevel_Debug, "iiop_connection_new: socket_error: %s\n", strerror(errno));
+ goto failed;
+ }
+
+ if(connect(GIOP_CONNECTION_GET_FD(retval), (struct sockaddr *)&retval->u.usock, SUN_LEN(&retval->u.usock)) < 0) {
+ ORBit_Trace(TraceMod_IIOP, TraceLevel_Debug, "iiop_connection_new: connect error: %s\n", strerror(errno));
+ goto failed;
+ }
+
+ GIOP_CONNECTION(retval)->was_initiated = TRUE;
+ GIOP_CONNECTION(retval)->is_auth = TRUE;
+
+ fcntl(GIOP_CONNECTION_GET_FD(retval), F_SETFD, FD_CLOEXEC);
+ fcntl(GIOP_CONNECTION_GET_FD(retval), F_SETFL,
+ fcntl(GIOP_CONNECTION_GET_FD(retval), F_GETFL, 0)
+ | O_NONBLOCK);
+
+ giop_connection_add_to_list(GIOP_CONNECTION(retval));
+
+ ORBit_Trace(TraceMod_IIOP, TraceLevel_Debug,
+ "iiop_connection_unix_new connect [%d] to %s\n",
+ GIOP_CONNECTION_GET_FD(retval),
+ sockpath);
+
+ return retval;
+
+failed:
+ close(GIOP_CONNECTION_GET_FD(retval));
+ GIOP_CONNECTION(retval)->fd = -1;
+ giop_connection_free(GIOP_CONNECTION(retval));
+ return NULL;
+}
+
+/*
+ * iiop_connection_server_accept
+ * Inputs: 'connection' - a server IIOPConnection.
+ *
+ * Description: Performs accept(), TCP wrapper, access checking and related
+ * duties on a connection
+ */
+int allow_severity = LOG_INFO, deny_severity = LOG_NOTICE;
+
+#if defined(HAVE_HOSTS_ACCESS) && defined(HAVE_TCPD_H)
+DEFINE_LOCK(tcp_wrappers_usage);
+
+#endif
+static void
+iiop_connection_server_accept(GIOPConnection *connection)
+{
+ struct sockaddr sock;
+ socklen_t n;
+ int newfd;
+ GIOPConnection *newcnx;
+
+// printk("iiop_conncetion_server_accept( %d )\n",
+// GIOP_CONNECTION_GET_FD(connection));
+
+ n = sizeof(sock);
+
+ switch(IIOP_CONNECTION(connection)->icnxtype) {
+ case IIOP_IPV4: sock.sa_family = AF_INET; break;
+ case IIOP_USOCK: sock.sa_family = AF_UNIX; break;
+ case IIOP_IPV6:
+#ifdef HAVE_IPV6
+ sock.sa_family = AF_INET6;
+#endif
+ break;
+ }
+
+ newfd = accept(GIOP_CONNECTION_GET_FD(connection), &sock, &n);
+
+#if defined(HAVE_HOSTS_ACCESS) && defined(HAVE_TCPD_H)
+ /* tcp wrappers access checking */
+ switch(IIOP_CONNECTION(connection)->icnxtype) {
+ case IIOP_IPV4:
+ {
+ struct request_info request;
+
+ GET_LOCK(tcp_wrappers_usage);
+
+ request_init(&request, RQ_DAEMON, argv0_val, RQ_FILE, newfd, 0);
+
+ fromhost(&request);
+ if(!hosts_access(&request)) {
+ syslog(deny_severity, "[orbit] refused connect from %s", eval_client(&request));
+ close(newfd); newfd = -1;
+ } else
+ syslog(allow_severity, "[orbit] connect from %s", eval_client(&request));
+
+ RELEASE_LOCK(tcp_wrappers_usage);
+ }
+ break;
+ default:
+ /* No access controls for these transports */
+ break;
+ }
+#endif
+
+ if(newfd >= 0) {
+ newcnx = GIOP_CONNECTION(iiop_connection_from_fd(newfd,
+ IIOP_CONNECTION(connection)));
+ GIOP_CONNECTION(newcnx)->orb_data = connection->orb_data;
+ switch(IIOP_CONNECTION(connection)->icnxtype) {
+ case IIOP_USOCK: newcnx->is_auth = TRUE; break;
+ default:
+ break;
+ }
+ }
+}
+
+/*
+ * iiop_connection_destroy
+ *
+ * Inputs: 'iiop_connection' - an IIOPConnection to be finalized
+ *
+ * Side effects: invalidates 'iiop_connection' for use as an IIOPConnection
+ *
+ * Description: Performs the IIOP-specific parts of connection shutdown,
+ * including sending a CLOSECONNECTION message to the remote side.
+ */
+static void
+iiop_connection_destroy(IIOPConnection *iiop_connection)
+{
+ const GIOPMessageHeader mh = {"GIOP", {1,0}, FLAG_ENDIANNESS,
+ GIOP_CLOSECONNECTION, 0};
+
+ switch(iiop_connection->icnxtype) {
+ case IIOP_IPV4:
+ ORBit_Trace(TraceMod_IIOP, TraceLevel_Debug,
+ "iiop_connection_destroy connect [%d] of %s:%d\n",
+ GIOP_CONNECTION_GET_FD(iiop_connection),
+ iiop_connection->u.ipv4.hostname,
+ ntohs(iiop_connection->u.ipv4.location.sin_port));
+ g_free(iiop_connection->u.ipv4.hostname);
+ break;
+ case IIOP_IPV6:
+#ifdef HAVE_IPV6
+ g_free(iiop_connection->u.ipv6.hostname);
+#else
+ g_warning("IPv6 unsupported, can't free it!");
+#endif
+ break;
+ case IIOP_USOCK:
+ /* why do we check if fd is > 0 here?
+ the orb code tries to reuse existing socket connection points.
+ If binding to any of those fails because another process is using it,
+ we don't want to unlink the other server's socket!
+ if the bind fails, iiop_connection_server_unix closes the fd for us */
+ if(GIOP_CONNECTION(iiop_connection)->connection_class == GIOP_CONNECTION_SERVER
+ && GIOP_CONNECTION(iiop_connection)->fd >= 0)
+ unlink(iiop_connection->u.usock.sun_path);
+ break;
+ default:
+ break;
+ }
+
+ if(GIOP_CONNECTION_GET_FD(iiop_connection) >= 0) {
+ if(GIOP_CONNECTION(iiop_connection)->is_valid
+ && !GIOP_CONNECTION(iiop_connection)->was_initiated)
+ {
+ write(GIOP_CONNECTION_GET_FD(iiop_connection), &mh, sizeof(mh));
+ }
+
+ shutdown(GIOP_CONNECTION_GET_FD(iiop_connection), 2);
+ close(GIOP_CONNECTION_GET_FD(iiop_connection));
+ GIOP_CONNECTION(iiop_connection)->fd = -1;
+ }
+}
+
+static int giop_nloops = 0;
+
+void giop_main_quit(void) { giop_nloops--; }
+
+void
+giop_main(void)
+{
+ int looplevel;
+
+ looplevel = ++giop_nloops;
+
+ while(giop_nloops > 0) {
+
+ giop_main_iterate(TRUE);
+
+ if(giop_nloops != looplevel) {
+ giop_nloops = --looplevel;
+ return;
+ }
+ }
+}
+
+GIOPRecvBuffer *
+giop_main_next_message(gboolean blocking)
+{
+ return giop_main_next_message_2(blocking, NULL);
+}
+
+GIOPRecvBuffer *
+giop_main_next_message_2(gboolean blocking,
+ GIOPConnection *monitor)
+{
+ GIOPConnection *connection;
+ GIOPRecvBuffer *recv_buffer = NULL;
+
+ do {
+ recv_buffer = giop_received_list_pop();
+// printk("giop_main_next_message_2 : recv_buffer = 0x%08X\n", recv_buffer);
+ if(recv_buffer)
+ break;
+
+ connection = giop_check_connections(blocking);
+// printk("giop_main_next_message_2 : connection = 0x%08X\n", connection);
+ if(!connection)
+ {
+ return NULL;
+ }
+
+ if(GIOP_CONNECTION_GET_FD(connection) < 0) {
+ g_assert(!"connection has -ve fd!");
+ }
+
+// printk("giop_main_next_message_2 : connection class = %d\n",
+// connection->connection_class);
+ if(connection->connection_class == GIOP_CONNECTION_SERVER)
+ iiop_connection_server_accept(connection);
+ else
+ recv_buffer = giop_recv_message_buffer_use(connection);
+
+ if(monitor && !monitor->is_valid)
+ {
+ return NULL;
+ }
+
+ } while(!recv_buffer);
+
+ return recv_buffer;
+}
+
+void
+giop_main_handle_connection(GIOPConnection *connection)
+{
+ GIOPRecvBuffer *recv_buffer;
+
+ //printk("giop_main_handle_connection\n");
+
+ g_return_if_fail(connection != NULL);
+ g_return_if_fail(connection->is_valid);
+
+ if(connection->connection_class == GIOP_CONNECTION_SERVER) {
+ iiop_connection_server_accept(connection);
+ return;
+ } else
+ recv_buffer = giop_recv_message_buffer_use(connection);
+
+ if(recv_buffer) {
+ if(IIOPIncomingMessageHandler)
+ IIOPIncomingMessageHandler(recv_buffer);
+ else
+ giop_received_list_push(recv_buffer);
+ }
+}
+
+/*
+ * giop_main_handle_connection_exception
+ *
+ * Input: GIOPConnection *connection
+ *
+ * Output:
+ *
+ * Side effects: invalidates connection
+ *
+ * Description:
+ * When poll() or select() indicates that a file descriptor
+ * has been closed at the remote end, we must invalidate the associated
+ * GIOPConnection structure.
+ */
+void
+giop_main_handle_connection_exception(GIOPConnection *connection)
+{
+ g_return_if_fail(connection != NULL);
+ g_return_if_fail(connection->is_valid);
+
+// printk("giop_main_handle_connection_exception(0x%X)\n", GIOP_CONNECTION_GET_FD(connection));
+
+ giop_connection_ref(connection);
+
+ giop_connection_remove_from_list(connection);
+
+ shutdown(GIOP_CONNECTION_GET_FD(connection), 2);
+ close(GIOP_CONNECTION_GET_FD(connection));
+ GIOP_CONNECTION(connection)->fd = -1;
+ connection->is_valid = FALSE;
+
+ if(connection->incoming_msg) {
+ giop_recv_buffer_unuse(connection->incoming_msg);
+ connection->incoming_msg = NULL;
+ }
+
+ giop_connection_unref(connection);
+}
+
+/*
+ * giop_main_iterate
+ *
+ * Input: 'blocking' - flag to indicate whether to wait for incoming
+ * messages (TRUE), or whether to return immediately if no
+ * incoming messages are available (FALSE).
+ * Output: None
+ * Description:
+ * Gets the next message into recv_buffer (see
+ * giop_main_next_message) If we have a handler for incoming
+ * messages, then pass recv_buffer to the handler (handler
+ * becomes the new owner of recv_buffer's contents). Otherwise,
+ * tosses it onto the list of received-but-unprocessed buffers.
+ *
+ * Warnings:
+ * If you don't have an IIOPIncomingMessageHandler set, you're
+ * probably really screwed in the long run.
+ */
+void
+giop_main_iterate(gboolean blocking)
+{
+ GIOPRecvBuffer *recv_buffer;
+
+// printk("giop_main_iterate: blocking: %d\n", blocking);
+schedule();
+
+ recv_buffer = giop_main_next_message(blocking);
+
+// printk("giop_main_iterate: recv_buffer = 0x%08X\n", recv_buffer);
+
+ if(recv_buffer) {
+ if(IIOPIncomingMessageHandler)
+ IIOPIncomingMessageHandler(recv_buffer);
+ else
+ giop_received_list_push(recv_buffer);
+ }
+}
+
+/*
+ * giop_check_connections
+ *
+ * Inputs: 'block_for_reply' - If no incoming data is immediately available
+ * should this routine wait for incoming data (TRUE) or return
+ * immediately (FALSE).
+ *
+ * Outputs: 'connection' - the first connection that has incoming
+ * data available for reading (supposedly a GIOP message, but
+ * could be anything).
+ *
+ * Side effects: Removes closed connections from the active list.
+ *
+ * Global data structures used: giop_connection_list
+ *
+ * Description: Does a poll or select (OS-dependant) on the list of file
+ * descriptors in giop_connection_list.
+ *
+ * If a file descriptor has been closed, call
+ * giop_connection_handle_exception() on it and (as
+ * appropriated by 'block_for_reply') either return
+ * NULL or do another poll/select.
+ *
+ * If a file descriptor has data available for
+ * reading, find the associated GIOPConnection (using
+ * giop_connection_list.fd_to_connection_mapping) and
+ * return that.
+ *
+ */
+GIOPConnection *
+giop_check_connections(gboolean block_for_reply)
+{
+ GIOPConnection *connection = NULL;
+ int pollret;
+ int numcnx_checks;
+ int i;
+#ifndef USE_POLL
+ fd_set selectset_rd, selectset_ex;
+
+ struct timeval immediate_timeout = {0,0};
+#endif
+
+// printk("giop_check_connections\n");
+
+ do_read_msg:
+
+ if(!giop_connection_list.list)
+ {
+// printk("giop_check_connections : list = NULL\n");
+ BUG();
+ return NULL;
+ }
+
+#if 0
+ giop_connection_list_recreate(); /* easiest way to get valid
+ select sets... */
+#endif
+
+#ifdef USE_POLL
+ numcnx_checks = giop_connection_list.pollset->len;
+#else
+ memcpy(&selectset_rd, &giop_connection_list.selectset_rd,
+ sizeof(selectset_rd));
+ memcpy(&selectset_ex, &giop_connection_list.selectset_ex,
+ sizeof(selectset_ex));
+
+ numcnx_checks = giop_connection_list.max_fd+1;
+#endif
+
+ restart:
+#ifdef USE_POLL
+ pollret = poll((struct pollfd *)giop_connection_list.pollset->data,
+ giop_connection_list.pollset->len,
+ block_for_reply?-1:0);
+
+#if KORBIT_DEBUG_WRITING
+{
+ int ix;
+ struct pollfd *fds = (struct pollfd *)giop_connection_list.pollset->data;
+// printk("back from poll(#fds = %d, block = %d) = %d)\n", giop_connection_list.pollset->len, block_for_reply, pollret);
+// for (ix = 0; ix < giop_connection_list.pollset->len; ix++)
+ // printk(" [fd = 0x%X, event = 0x%X, revent = 0x%X]\n",
+// fds[ix].fd, fds[ix].events, fds[ix].revents);
+
+}
+#endif /* KORBIT_DEBUG_WRITING */
+
+
+# else /* !USE_POLL */
+
+ {
+ pollret = select (giop_connection_list.max_fd + 1,
+ &selectset_rd,
+ NULL, &selectset_ex,
+ block_for_reply?NULL:&immediate_timeout);
+ }
+# endif /* !USE_POLL */
+
+// printk("giop_check_connections : pollret == %d\n", pollret);
+ if(pollret <= 0) {
+ if(pollret < 0) {
+ if(errno == EINTR)
+ goto restart;
+ else
+ g_warning("Error code from select/poll: %s", g_strerror(errno));
+ } else
+ return NULL;
+ }
+
+ /* Check for data to be read on the fd's.
+ Note we have to do the hangup/exception checking in a separate loop,
+ because there may be data waiting to be read on a connection that the
+ other end has closed. */
+ for(i = 0; i < numcnx_checks; i++) {
+ struct fd_hash_elem *el;
+
+#ifdef USE_POLL
+ struct pollfd *p =
+ &g_array_index(giop_connection_list.pollset,
+ struct pollfd,
+ i);
+ g_assert(p->fd <= giop_connection_list.max_fd);
+#ifndef __KORBIT__
+ connection = giop_connection_list.fd_to_connection_mapping->pdata[p->fd];
+#else
+ el = g_hash_table_lookup(giop_connection_list.fd_to_connection_mapping,
+ &(p->fd));
+ if (el)
+ connection = el->cnx;
+#endif
+ if(p->revents & POLLIN)
+ goto got_connection;
+#else
+#ifndef __KORBIT__
+ connection = giop_connection_list.fd_to_connection_mapping->pdata[i];
+#else
+ el = g_hash_table_lookup(giop_connection_list.fd_to_connection_mapping,
+ &i);
+ if (el)
+ connection = el->cnx;
+#endif
+ if (FD_ISSET(i, &selectset_rd)) {
+ goto got_connection;
+ }
+#endif
+ }
+
+ /* Handle fd exceptions */
+ for(i = 0; i < numcnx_checks; i++)
+ {
+ struct fd_hash_elem *el;
+#ifdef USE_POLL
+ struct pollfd *p =
+ &g_array_index(giop_connection_list.pollset,
+ struct pollfd,
+ i);
+
+ g_assert(p->fd <= giop_connection_list.max_fd);
+ if(p->revents & (POLLHUP|POLLNVAL)) {
+#ifndef __KORBIT__
+ connection = giop_connection_list.fd_to_connection_mapping->pdata[p->fd];
+#else
+ el = g_hash_table_lookup(giop_connection_list.fd_to_connection_mapping,
+ &(p->fd));
+ if (el)
+ connection = el->cnx;
+#endif
+ giop_main_handle_connection_exception(connection);
+ }
+#else /* !USE_POLL */
+ if(FD_ISSET(i, &selectset_ex)) {
+#ifndef __KORBIT__
+ connection = giop_connection_list.fd_to_connection_mapping->pdata[i];
+#else
+ el = g_hash_table_lookup(giop_connection_list.fd_to_connection_mapping,
+ &i);
+ if (el)
+ connection = el->cnx;
+#endif
+ giop_main_handle_connection_exception(connection);
+ }
+#endif /* !USE_POLL */
+ }
+
+ /* Only reached if we didn't find a connection to read data from */
+ if(block_for_reply)
+ goto do_read_msg;
+
+ got_connection:
+// printk("giop_check_connections : got connection\n");
+ return connection;
+}
+
diff -urN linux-2.4.1/net/korbit/IIOP/encoders.c linux-2.4.1-korbit/net/korbit/IIOP/encoders.c
--- linux-2.4.1/net/korbit/IIOP/encoders.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/IIOP/encoders.c Thu Feb 1 11:46:51 2001
@@ -0,0 +1,46 @@
+#include "config.h"
+#include <string.h>
+#include "IIOP.h"
+
+ENCODER_DEC(IOP_ServiceContext)
+{
+ APA(&mem->context_id, sizeof(mem->context_id));
+ ENCODER_CALL(CORBA_sequence_octet, &mem->context_data);
+}
+
+ENCODER_DEC(IOP_ServiceContextList)
+{
+ int i;
+
+ if(!mem)
+ {
+ APA((gpointer)giop_scratch_space, sizeof(mem->_length));
+ return;
+ }
+
+ APA(&mem->_length, sizeof(mem->_length));
+
+ for(i = 0; i < mem->_length; i++)
+ ENCODER_CALL(IOP_ServiceContext, &mem->_buffer[i]);
+}
+
+ENCODER_DEC(CORBA_sequence_octet)
+{
+ if(!mem)
+ {
+ APA((gpointer)giop_scratch_space, sizeof(mem->_length));
+ return;
+ }
+
+ APIA(&mem->_length, sizeof(mem->_length));
+ if(mem->_length > 0)
+ AP(mem->_buffer, mem->_length);
+}
+
+ENCODER_DEC(CORBA_char)
+{
+ GIOP_unsigned_long len = strlen(mem) + 1;
+
+ APIA(&len, sizeof(len));
+ AP(mem, len);
+}
diff -urN linux-2.4.1/net/korbit/IIOP/giop-msg-buffer.c linux-2.4.1-korbit/net/korbit/IIOP/giop-msg-buffer.c
--- linux-2.4.1/net/korbit/IIOP/giop-msg-buffer.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/IIOP/giop-msg-buffer.c Fri Feb 2 01:23:46 2001
@@ -0,0 +1,1443 @@
+/* The big picture:
+ * For every outgoing request, we have to have the network-ready data
+ * somewhere in memory.
+ *
+ * Using writev, any pieces that do not need endian conversion can
+ * be written in-place.
+ *
+ * The pieces that do need endian conversion can be put into one or more
+ * buffers.
+ *
+ * WHOA WHOA newsflash
+ * Because IIOP lets the message sender specify the endianness,
+ * we do not need to do endian conversion _ever_! The receiver can do all
+ * conversions if need be, or if they are the same endianness as sender they
+ * can just pull it in right off the wire :)
+ *
+ */
+
+#include "config.h"
+#include "iiop-endianP.h"
+#include <string.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <string.h>
+
+#ifdef HAVE_POLL
+# include <sys/poll.h>
+#else
+# include <sys/types.h>
+# include <sys/time.h>
+#endif
+#include "IIOP.h"
+#include "IIOP-private.h"
+
+#ifdef HAVE_LIMITED_WRITEV
+#define writev g_writev
+#endif
+
+/*
+#ifdef O_NONBLOCK
+#undef O_NONBLOCK
+#endif
+#define O_NONBLOCK 0
+*/
+
+
+/* type defs */
+
+#ifdef __GNUC__
+#define PACKED __attribute__((packed))
+#else
+#define PACKED
+#endif
+
+/*
+ * Overlaps with struct _GIOPMessageHeader on purpose
+ * - we save time because this stuff never changes
+ */
+struct _GIOPMessageHeaderConstants {
+ GIOP_char magic[4];
+ GIOP_char GIOP_version[2];
+ GIOP_octet flags;
+} PACKED;
+
+/* functions */
+static gint giop_recv_decode_message(GIOPRecvBuffer *buf);
+static gboolean num_on_list(GIOP_unsigned_long num,
+ const GIOP_unsigned_long *request_ids,
+ GIOP_unsigned_long req_count);
+static gint giop_recv_reply_decode_message(GIOPRecvBuffer *buf);
+static gint giop_recv_request_decode_message(GIOPRecvBuffer *buf);
+static gint giop_recv_locate_reply_decode_message(GIOPRecvBuffer *buf);
+static gint giop_recv_locate_request_decode_message(GIOPRecvBuffer *buf);
+static GIOPRecvBuffer *giop_received_list_check_reply(GIOP_unsigned_long request_id);
+
+#ifdef NOT_REENTRANT
+extern DEFINE_LOCK(iiop_connection_list);
+#endif
+GList *iiop_connection_list = NULL;
+
+/* global variables */
+char giop_scratch_space[2048];
+
+static const struct _GIOPMessageHeaderConstants
+giop_message_header_constants = {
+ "GIOP",
+ {1,0},
+ FLAG_ENDIANNESS,
+};
+
+struct iovec
+giop_first_message_vec = {NULL,
+ sizeof(struct _GIOPMessageHeaderConstants)};
+
+DEFINE_LOCK(sendbufferlist);
+GSList *sendbufferlist = NULL;
+
+DEFINE_LOCK(recvbufferlist);
+GSList *recvbufferlist = NULL;
+
+DEFINE_LOCK(incoming_bufs);
+GList *incoming_bufs = NULL; /* List of incoming messages that had to be
+ shunted aside */
+
+DEFINE_LOCK(sendbuffers);
+DEFINE_LOCK(recvbuffers);
+GMemChunk *sendbuffers = NULL, *recvbuffers = NULL;
+
+DEFINE_LOCK(request_id_counter);
+GIOP_unsigned_long request_id_counter;
+
+#if 0
+inline
+void giop_message_buffer_append_iovec(GIOPMessageBuffer *msgbuf,
+ const struct iovec *iovec)
+{
+ /* g_print("Appending iovec %d bytes @ %p\n", iovec->iov_len, iovec->iov_base); */
+ g_array_append_val(msgbuf->iovecs, *iovec);
+}
+#else
+#define giop_message_buffer_append_iovec(msgbuf, iovec) g_array_append_val((msgbuf)->iovecs, *(iovec))
+#endif
+
+void
+giop_message_buffer_init(void)
+{
+ giop_first_message_vec.iov_base = (gpointer)&giop_message_header_constants;
+ INIT_LOCK(sendbufferlist);
+ INIT_LOCK(recvbufferlist);
+ request_id_counter = 1;
+ INIT_LOCK(request_id_counter);
+
+ INIT_LOCK(sendbuffers);
+ sendbuffers = g_mem_chunk_create(GIOPSendBuffer, 2, G_ALLOC_ONLY);
+ INIT_LOCK(recvbuffers);
+ recvbuffers = g_mem_chunk_create(GIOPRecvBuffer, 2, G_ALLOC_ONLY);
+}
+
+static void
+giop_message_buffer_new(GIOPMessageBuffer *buf)
+{
+ buf->iovecs = g_array_new(FALSE, FALSE, sizeof(struct iovec));
+}
+
+#define STRUCT_OFFSET(t, f) ((int) ((char*) &((t*) 0)->f))
+
+/* Send buffers only */
+static GIOPSendBuffer *
+giop_send_buffer_new(void)
+{
+ GIOPSendBuffer *msgbuf;
+ struct iovec firstvec;
+
+ GET_LOCK(sendbuffers);
+ msgbuf = g_chunk_new(GIOPSendBuffer, sendbuffers);
+ RELEASE_LOCK(sendbuffers);
+
+ giop_message_buffer_new(GIOP_MESSAGE_BUFFER(msgbuf));
+
+ giop_message_buffer_append_iovec(GIOP_MESSAGE_BUFFER(msgbuf),
+ &giop_first_message_vec);
+
+ firstvec.iov_base = &(GIOP_MESSAGE_BUFFER(msgbuf)->message_header.message_type);
+ firstvec.iov_len = sizeof(GIOPMessageHeader)
+ - STRUCT_OFFSET(GIOPMessageHeader, message_type);
+ GIOP_MESSAGE_BUFFER(msgbuf)->message_header.message_size = 0;
+
+ msgbuf->indirects = g_mem_chunk_create(char[GIOP_INDIRECT_CHUNK_SIZE],
+ 2, G_ALLOC_ONLY);
+
+ giop_message_buffer_append_iovec(GIOP_MESSAGE_BUFFER(msgbuf), &firstvec);
+
+ return msgbuf;
+}
+
+gint
+giop_send_buffer_write(GIOPSendBuffer *send_buffer)
+{
+ gulong nvecs;
+ glong res, sum, t;
+ struct iovec *curvec;
+ int fd;
+ GIOPConnection *cnx;
+ gint retval = -1;
+
+// printf("giop_send_buffer_write\n");
+
+ cnx = GIOP_MESSAGE_BUFFER(send_buffer)->connection;
+ if(!cnx->is_valid)
+ return -1;
+
+ fd = GIOP_CONNECTION_GET_FD(cnx);
+ nvecs = GIOP_MESSAGE_BUFFER(send_buffer)->iovecs->len;
+ curvec = (struct iovec *)GIOP_MESSAGE_BUFFER(send_buffer)->iovecs->data;
+
+#if defined(ORBIT_DEBUG) && 0
+ g_print("Message of length %d looks like:\n",
+ GIOP_MESSAGE_BUFFER(send_buffer)->message_header.message_size);
+{ int i = 0;
+ for(sum = 0; i < nvecs; i++) {
+ sum += curvec[i].iov_len;
+ g_print(" [%p, %d]: %d\n", curvec[i].iov_base, curvec[i].iov_len,
+ sum);
+ }
+}
+#endif
+
+ fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~O_NONBLOCK);
+ res = writev(fd, curvec, nvecs);
+// printk("writev wrote %d byte\n", res);
+
+ sum = (GIOP_MESSAGE_BUFFER(send_buffer)->message_header.message_size + sizeof(GIOPMessageHeader));
+ if(res < sum) {
+ if(res < 0) {
+//printf("writev returned %d\n", res);
+ if(errno != EAGAIN) {
+ giop_main_handle_connection_exception(cnx);
+ goto out;
+ }
+
+ res = 0;
+ }
+
+ /* wrote 7, iovecs 3, 2, 2, 4:
+ 0 + 3 !> 7
+ 3 + 2 !> 7
+ 5 + 2 !> 7
+ */
+
+ for(t = 0; ; t += curvec->iov_len, curvec++, nvecs--) {
+ if((t + curvec->iov_len) > res)
+ break;
+ }
+ if((res - t) > 0) {
+ curvec->iov_len -= (res - t);
+ curvec->iov_base = (gpointer)((char *)curvec->iov_base + (res - t));
+ }
+
+
+ fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~O_NONBLOCK);
+ t = writev(fd, curvec, nvecs);
+
+ fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK);
+
+ if((t < 0) || ((res + t) < sum)) {
+//printf("crap, t = %d res = %d sum = %d\n", t, res, sum);
+ giop_main_handle_connection_exception(cnx);
+ goto out;
+ }
+ }
+
+ retval = 0;
+
+ out:
+
+ return retval;
+}
+
+static GIOPSendBuffer *
+giop_send_buffer_use(GIOPConnection *connection)
+{
+ GIOPSendBuffer *retval;
+
+ if(!connection->is_valid)
+ return NULL;
+
+ GET_LOCK(sendbufferlist);
+
+ if(sendbufferlist)
+ {
+ GSList *head;
+
+ retval = sendbufferlist->data;
+
+ head = sendbufferlist;
+ sendbufferlist = g_slist_remove_link(sendbufferlist, sendbufferlist);
+ g_slist_free_1 (head);
+
+ g_array_set_size(GIOP_MESSAGE_BUFFER(retval)->iovecs, 2);
+ GIOP_MESSAGE_BUFFER(retval)->message_header.message_size = 0;
+ }
+ else
+ retval = giop_send_buffer_new();
+
+ RELEASE_LOCK(sendbufferlist);
+
+ giop_connection_ref(connection);
+ GIOP_MESSAGE_BUFFER(retval)->connection = connection;
+
+ g_mem_chunk_reset(retval->indirects);
+ retval->indirect = g_chunk_new(gpointer, retval->indirects);
+#ifdef ORBIT_DEBUG
+ memset(retval->indirect, '\xFE', GIOP_INDIRECT_CHUNK_SIZE);
+#endif
+ retval->indirect_used = 0;
+
+ return retval;
+}
+
+GIOPSendBuffer *
+giop_send_reply_buffer_use(GIOPConnection *connection,
+ const IOP_ServiceContextList *service_context,
+ GIOP_unsigned_long request_id,
+ GIOPReplyStatusType reply_status)
+{
+ GIOPSendBuffer *send_buffer;
+
+ send_buffer = giop_send_buffer_use(connection);
+
+ if(!send_buffer)
+ return NULL;
+
+ GIOP_MESSAGE_BUFFER(send_buffer)->message_header.message_type = GIOP_REPLY;
+
+ giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER(send_buffer),
+ sizeof(GIOP_unsigned_long));
+ if(!service_context) {
+ static const GIOP_unsigned_long sc_zero_int = 0;
+ AP(&sc_zero_int, sizeof(service_context->_length));
+ } else {
+ int i, n;
+ n = service_context->_length;
+ AP(&service_context->_length, sizeof(service_context->_length));
+ for(i = 0; i < n; i++) {
+ int j, o;
+ CORBA_sequence_octet *seqo;
+
+ giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER(send_buffer),
+ sizeof(GIOP_unsigned_long));
+ AP(&service_context->_buffer[i].context_id,
+ sizeof(service_context->_buffer[i].context_id));
+ seqo = &service_context->_buffer[i].context_data;
+ o = seqo->_length;
+ AP(&seqo->_length, sizeof(GIOP_unsigned_long));
+ for(j = 0; j < o; j++)
+ AP(seqo->_buffer, seqo->_length);
+ }
+ }
+ send_buffer->message.u.reply.request_id = request_id;
+ send_buffer->message.u.reply.reply_status = reply_status;
+ giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER(send_buffer),
+ sizeof(GIOP_unsigned_long));
+ AP(&send_buffer->message.u.reply.request_id,
+ sizeof(GIOP_unsigned_long));
+ AP(&send_buffer->message.u.reply.reply_status,
+ sizeof(GIOP_unsigned_long));
+
+ return send_buffer;
+}
+
+GIOPSendBuffer *
+giop_send_locate_reply_buffer_use(GIOPConnection *connection,
+ GIOP_unsigned_long request_id,
+ GIOPLocateStatusType locate_reply_status)
+{
+ GIOPSendBuffer *send_buffer;
+
+ send_buffer = giop_send_buffer_use(connection);
+
+ if(!send_buffer)
+ return NULL;
+
+ GIOP_MESSAGE_BUFFER(send_buffer)->message_header.message_type = GIOP_LOCATEREPLY;
+
+ APIA(&request_id, sizeof(request_id));
+ APIA(&locate_reply_status, sizeof(locate_reply_status));
+
+ return send_buffer;
+}
+
+GIOPSendBuffer *
+giop_send_request_buffer_use(GIOPConnection *connection,
+ const IOP_ServiceContextList *service_context,
+ GIOP_unsigned_long request_id,
+ GIOP_boolean response_expected,
+ const struct iovec *object_key_vec,
+ const struct iovec *operation_vec,
+ const struct iovec *principal_vec)
+{
+ GIOPSendBuffer *send_buffer;
+#if 0
+ static const struct {
+ CORBA_unsigned_long _length;
+ char _buffer[7];
+ } default_principal = { sizeof("nobody"), "nobody" };
+ static const struct iovec default_principal_vec =
+ {(void *)&default_principal,
+ sizeof(CORBA_unsigned_long) + sizeof("nobody")};
+#endif
+
+ if (!connection)
+ return NULL;
+ if(!object_key_vec)
+ return NULL;
+ if(!operation_vec)
+ return NULL;
+
+ ORBit_Trace(TraceMod_IIOP, TraceLevel_Debug,
+ "Sending request %s id %d to %s\n",
+ ((guchar *)operation_vec->iov_base) + 4,
+ request_id, ((guchar *)object_key_vec->iov_base) + 4);
+
+ send_buffer = giop_send_buffer_use(connection);
+
+ if (!send_buffer)
+ return NULL;
+
+ GIOP_MESSAGE_BUFFER(send_buffer)->message_header.message_type = GIOP_REQUEST;
+
+ giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER(send_buffer),
+ sizeof(GIOP_unsigned_long));
+ if(!service_context) {
+ static const GIOP_unsigned_long sc_zero_int = 0;
+ AP(&sc_zero_int, sizeof(GIOP_unsigned_long));
+ } else {
+ int i, n;
+ n = service_context->_length;
+ AP(&service_context->_length, sizeof(service_context->_length));
+ for(i = 0; i < n; i++) {
+ int j, o;
+ CORBA_sequence_octet *seqo;
+
+ giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER(send_buffer),
+ sizeof(GIOP_unsigned_long));
+ AP(&service_context->_buffer[i].context_id,
+ sizeof(service_context->_buffer[i].context_id));
+ seqo = &service_context->_buffer[i].context_data;
+ o = seqo->_length;
+ AP(&seqo->_length, sizeof(GIOP_unsigned_long));
+ for(j = 0; j < o; j++)
+ AP(seqo->_buffer, seqo->_length);
+ }
+ }
+ send_buffer->message.u.request.request_id = request_id;
+ send_buffer->message.u.request.response_expected = response_expected;
+ giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER(send_buffer),
+ sizeof(GIOP_unsigned_long));
+ AP(&send_buffer->message.u.request.request_id,
+ sizeof(GIOP_unsigned_long));
+ AP(&send_buffer->message.u.request.response_expected,
+ sizeof(GIOP_boolean));
+#if 0
+ API(&response_expected, 1);
+ AP((gpointer)giop_scratch_space, 3);
+#endif
+
+ giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER(send_buffer),
+ sizeof(CORBA_unsigned_long));
+ giop_message_buffer_append_iovec(GIOP_MESSAGE_BUFFER(send_buffer),
+ object_key_vec);
+ GIOP_MESSAGE_BUFFER(send_buffer)->message_header.message_size +=
+ object_key_vec->iov_len;
+
+ /*
+ * We can know the length at compile time - don't calculate it at runtime
+ * if we can help it :)
+ */
+ /* ENCODER_CALL(CORBA_string, (CORBA_string *)operation); */
+ giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER(send_buffer),
+ sizeof(CORBA_unsigned_long));
+ giop_message_buffer_append_iovec(GIOP_MESSAGE_BUFFER(send_buffer),
+ operation_vec);
+ GIOP_MESSAGE_BUFFER(send_buffer)->message_header.message_size +=
+ operation_vec->iov_len;
+
+ giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER(send_buffer),
+ sizeof(CORBA_unsigned_long));
+ giop_message_buffer_append_iovec(GIOP_MESSAGE_BUFFER(send_buffer),
+ principal_vec);
+ GIOP_MESSAGE_BUFFER(send_buffer)->message_header.message_size +=
+ principal_vec->iov_len;
+
+ return send_buffer;
+}
+
+GIOPSendBuffer *
+giop_send_locate_request_buffer_use(GIOPConnection *connection,
+ GIOP_unsigned_long request_id,
+ const struct iovec *object_key_vec)
+{
+ GIOPSendBuffer *send_buffer;
+
+ if (!connection)
+ return NULL;
+ if (!object_key_vec)
+ return NULL;
+
+ ORBit_Trace(TraceMod_IIOP, TraceLevel_Debug,
+ "Sending locate request id %d to %s\n",
+ request_id, ((guchar *)object_key_vec->iov_base) + 4);
+
+ send_buffer = giop_send_buffer_use(connection);
+
+ if (!send_buffer)
+ return NULL;
+
+ GIOP_MESSAGE_BUFFER(send_buffer)->message_header.message_type = GIOP_LOCATEREQUEST;
+
+ APIA(&request_id, sizeof(request_id));
+
+ giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER(send_buffer),
+ sizeof(CORBA_unsigned_long));
+ giop_message_buffer_append_iovec(GIOP_MESSAGE_BUFFER(send_buffer),
+ object_key_vec);
+ GIOP_MESSAGE_BUFFER(send_buffer)->message_header.message_size +=
+ object_key_vec->iov_len;
+
+ return send_buffer;
+}
+
+void
+giop_send_buffer_unuse(GIOPSendBuffer *send_buffer)
+{
+ if (send_buffer == NULL)
+ return;
+
+ giop_connection_unref(GIOP_MESSAGE_BUFFER(send_buffer)->connection);
+
+ GET_LOCK(sendbufferlist);
+ sendbufferlist = g_slist_prepend(sendbufferlist, send_buffer);
+ RELEASE_LOCK(sendbufferlist);
+}
+
+gulong
+giop_message_buffer_do_alignment(GIOPMessageBuffer *buffer,
+ gulong align_for)
+{
+ struct iovec newvec;
+ struct iovec *lastvec;
+ guint alignme;
+ gulong real_msgsize;
+ gulong align_diff;
+
+ if(align_for < 2) return 0;
+ if(align_for >
+ MAX(sizeof(GIOP_long_long),sizeof(GIOP_long_double)))
+ align_for = MAX(sizeof(GIOP_long_long), sizeof(GIOP_long_double));
+
+ real_msgsize = buffer->message_header.message_size+sizeof(GIOPMessageHeader);
+
+ alignme = (gulong)ALIGN_ADDRESS(real_msgsize, align_for);
+
+ align_diff = alignme - real_msgsize;
+ if(align_diff > 0)
+ {
+ lastvec = (struct iovec *)(buffer->iovecs->data)
+ + buffer->iovecs->len - 1;
+
+ if(lastvec->iov_base == giop_scratch_space)
+ {
+ newvec.iov_len = align_diff;
+ lastvec->iov_len += align_diff;
+ buffer->message_header.message_size += align_diff;
+ }
+ else
+ {
+ newvec.iov_base = (gpointer)giop_scratch_space;
+ newvec.iov_len = align_diff;
+ buffer->message_header.message_size += align_diff;
+ giop_message_buffer_append_iovec(buffer, &newvec);
+ }
+ return newvec.iov_len;
+ }
+ else
+ return 0;
+}
+
+void
+giop_message_buffer_append_mem_a(GIOPMessageBuffer *buffer,
+ gconstpointer mem_region,
+ gulong mem_region_length)
+{
+ struct iovec newvec;
+ struct iovec *lastvec;
+ gint alignfor;
+
+ alignfor = giop_message_buffer_do_alignment(buffer, mem_region_length);
+
+ lastvec = (struct iovec *)(buffer->iovecs->data) +
+ + buffer->iovecs->len - 1;
+
+ if((mem_region == giop_scratch_space && lastvec->iov_base == giop_scratch_space)
+ || (alignfor == 0 && (((guchar *)lastvec->iov_base) + lastvec->iov_len) == mem_region))
+ {
+ lastvec->iov_len += mem_region_length;
+ }
+ else
+ {
+ newvec.iov_base = (gpointer)mem_region;
+ newvec.iov_len = mem_region_length;
+ giop_message_buffer_append_iovec(buffer, &newvec);
+ }
+
+ buffer->message_header.message_size += mem_region_length;
+}
+
+void
+giop_message_buffer_append_mem(GIOPMessageBuffer *buffer,
+ gconstpointer mem_region,
+ gulong mem_region_length)
+{
+ struct iovec newvec;
+ struct iovec *lastvec;
+
+ lastvec = (struct iovec *)(buffer->iovecs->data)
+ + buffer->iovecs->len - 1;
+
+ if((mem_region == giop_scratch_space
+ && lastvec->iov_base == giop_scratch_space)
+ || ((((guchar *)lastvec->iov_base) + lastvec->iov_len) == mem_region))
+ {
+ lastvec->iov_len += mem_region_length;
+ }
+ else
+ {
+ newvec.iov_base = (gpointer)mem_region;
+ newvec.iov_len = mem_region_length;
+ giop_message_buffer_append_iovec(buffer, &newvec);
+ }
+
+ buffer->message_header.message_size += mem_region_length;
+}
+
+/* I think we need a WE_WANT_NEW_CRAPPY_BUGGY_CODE ifdef here - this
+ tiny routine seems to be horribly hard to get right.
+
+ Basically we have to paste the whole of 'mem_region' into our
+ memory chunks, possibly subdividing it up to fit it into multiple
+ 1K chunks. Because we have to return the first paste point in case
+ the client wants to manipulate it afterwards, if mem_region_length
+ >= sizeof(CORBA_unsigned_long), we also have to guarantee that the
+ pasted stuff doesn't get divided on a finer boundary than
+ sizeof(CORBA_unsigned_long).
+*/
+gpointer
+giop_send_buffer_append_mem_indirect(GIOPSendBuffer *send_buffer,
+ gconstpointer mem_region,
+ gulong mem_region_length)
+{
+ gulong offset = 0, thisblock_size;
+ gpointer blockstart = NULL;
+
+ while(offset < mem_region_length) {
+ thisblock_size = MIN(mem_region_length - offset,
+ GIOP_INDIRECT_CHUNK_SIZE - send_buffer->indirect_used);
+
+ if((thisblock_size >= sizeof(CORBA_unsigned_long))
+ || (mem_region_length - offset) < sizeof(CORBA_unsigned_long)) {
+ if (!blockstart)
+ blockstart =
+ ((guchar*) send_buffer->indirect) + send_buffer->indirect_used;
+
+ memcpy((guchar*)send_buffer->indirect + send_buffer->indirect_used,
+ (guchar*)mem_region + offset, thisblock_size);
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(send_buffer),
+ (guchar*)send_buffer->indirect +
+ send_buffer->indirect_used,
+ thisblock_size);
+ offset += thisblock_size;
+ send_buffer->indirect_used += thisblock_size;
+ }
+
+ if(send_buffer->indirect_used >= (GIOP_INDIRECT_CHUNK_SIZE - sizeof(CORBA_unsigned_long))) {
+#ifdef I_CANT_FIGURE_OUT_WHAT_THIS_LOGIC_WAS_MEANT_TO_DO
+ || (thisblock_size >= sizeof(CORBA_unsigned_long)
+ && (mem_region_length - offset) > 0)) {
+#endif
+ send_buffer->indirect_used = 0;
+ send_buffer->indirect = g_chunk_new(gpointer,
+ send_buffer->indirects);
+ }
+ }
+
+ return blockstart;
+}
+
+#ifdef WE_WANT_OLD_DEAD_CRAPPY_BUGGY_CODE
+gpointer
+_giop_send_buffer_append_mem_indirect(GIOPSendBuffer *send_buffer,
+ gconstpointer mem_region,
+ gulong mem_region_length)
+{
+ gpointer blockstart = NULL;
+ gulong offset, new_offset;
+
+ for(offset = new_offset = 0; new_offset < mem_region_length;)
+ {
+ new_offset =
+ MIN(mem_region_length - offset,
+ GIOP_INDIRECT_CHUNK_SIZE - send_buffer->indirect_used);
+
+ if((new_offset - offset) > sizeof(CORBA_unsigned_long)
+ || mem_region_length >= sizeof(CORBA_unsigned_long)) {
+
+ if(!blockstart)
+ blockstart = send_buffer->indirect + send_buffer->indirect_used;
+ }
+
+ memcpy(send_buffer->indirect + send_buffer->indirect_used,
+ mem_region + offset, new_offset - offset);
+
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(send_buffer),
+ send_buffer->indirect + send_buffer->indirect_used,
+ new_offset - offset);
+
+ send_buffer->indirect_used += new_offset - offset;
+
+ offset = new_offset;
+
+ if(new_offset >= GIOP_INDIRECT_CHUNK_SIZE)
+ {
+ send_buffer->indirect_used = 0;
+ send_buffer->indirect = g_chunk_new(gpointer,
+ send_buffer->indirects);
+#ifdef ORBIT_DEBUG
+ memset(send_buffer->indirect, '\xFE', GIOP_INDIRECT_CHUNK_SIZE);
+#endif
+ }
+ }
+
+ return blockstart;
+}
+#endif
+
+gpointer
+giop_send_buffer_append_mem_indirect_a(GIOPSendBuffer *send_buffer,
+ gconstpointer mem_region,
+ gulong mem_region_length)
+{
+ giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER(send_buffer),
+ mem_region_length);
+ return giop_send_buffer_append_mem_indirect(send_buffer,
+ mem_region, mem_region_length);
+}
+
+GIOP_unsigned_long
+giop_get_request_id(void)
+{
+ GIOP_unsigned_long retval;
+ GET_LOCK(request_id_counter);
+ retval = request_id_counter++;
+ RELEASE_LOCK(request_id_counter);
+ return retval;
+}
+
+/****************************************************
+ * GIOPRecvBuffer routines
+ ****************************************************/
+
+static GIOPRecvBuffer *
+giop_recv_buffer_new(void)
+{
+ GIOPRecvBuffer *msgbuf;
+
+ GET_LOCK(recvbuffers);
+ msgbuf = g_chunk_new(GIOPRecvBuffer, recvbuffers);
+ RELEASE_LOCK(recvbuffers);
+
+ giop_message_buffer_new(GIOP_MESSAGE_BUFFER(msgbuf));
+ msgbuf->message_body = NULL;
+
+ return msgbuf;
+}
+
+void
+giop_recv_buffer_unuse(GIOPRecvBuffer *buffer)
+{
+ if (buffer == NULL)
+ return;
+
+ if(buffer->message_body) {
+ buffer->message_body = ((guchar *)buffer->message_body)
+ - sizeof(GIOPMessageHeader);
+
+ g_free(buffer->message_body);
+ buffer->message_body = NULL;
+ }
+
+ if(GIOP_MESSAGE_BUFFER(buffer)->connection->incoming_msg == buffer)
+ GIOP_MESSAGE_BUFFER(buffer)->connection->incoming_msg = NULL;
+
+ giop_connection_unref(GIOP_MESSAGE_BUFFER(buffer)->connection);
+
+ GET_LOCK(recvbufferlist);
+ recvbufferlist = g_slist_prepend(recvbufferlist, buffer);
+ RELEASE_LOCK(recvbufferlist);
+}
+
+static GIOPRecvBuffer *
+giop_recv_buffer_use(GIOPConnection *connection)
+{
+ GIOPRecvBuffer *retval;
+
+ if(!connection || !connection->is_valid)
+ return NULL;
+
+ GET_LOCK(recvbufferlist);
+
+ if(recvbufferlist)
+ {
+ GSList *head;
+
+ retval = recvbufferlist->data;
+
+ head = recvbufferlist;
+ recvbufferlist = g_slist_remove_link(recvbufferlist, recvbufferlist);
+ g_slist_free_1 (head);
+
+ GIOP_MESSAGE_BUFFER(retval)->message_header.message_size = 0;
+ retval->message_body = NULL;
+ }
+ else
+ retval = giop_recv_buffer_new();
+
+ retval->state = GIOP_MSG_READING_HEADER;
+ retval->left_to_read = sizeof(GIOPMessageHeader);
+
+ RELEASE_LOCK(recvbufferlist);
+
+ giop_connection_ref(connection);
+ GIOP_MESSAGE_BUFFER(retval)->connection = connection;
+
+ return retval;
+}
+
+GIOPRecvBuffer *
+giop_recv_message_buffer_use(GIOPConnection *connection)
+{
+ GIOPRecvBuffer *retval;
+ char *bptr;
+ int sysret;
+ guint message_size;
+
+// printf("giop_recv_message_buffer_use: connection = 0x%X\n", connection);
+
+ if(!connection || !connection->is_valid)
+ return NULL;
+
+ if(connection->incoming_msg)
+ retval = connection->incoming_msg;
+ else {
+ retval = giop_recv_buffer_use(connection);
+ connection->incoming_msg = retval;
+ }
+
+ if(!retval) return NULL;
+
+ do {
+ switch(retval->state) {
+ case GIOP_MSG_READING_HEADER:
+ bptr = ((char *)&(GIOP_MESSAGE_BUFFER(retval)->message_header));
+ bptr += sizeof(GIOP_MESSAGE_BUFFER(retval)->message_header)
+ - retval->left_to_read;
+ break;
+ case GIOP_MSG_READING_BODY:
+ bptr = retval->cur; /* Reason for not using retval->message_body:
+ See note XXX1 below */
+ bptr += GIOP_MESSAGE_BUFFER(retval)->message_header.message_size;
+ bptr -= retval->left_to_read;
+ break;
+ default:
+ bptr = NULL;
+ }
+
+//printf("#1p1: READ %d bytes: errno %d state = %d\n", retval->left_to_read, errno, retval->state);
+ sysret = read(GIOP_CONNECTION_GET_FD(connection), bptr,
+ retval->left_to_read);
+
+ if((sysret == 0)
+ || ((sysret < 0) && (errno != EAGAIN))) {
+//printf("#1: sysret = %d bptr = 0x%X errno = %d\n", sysret, bptr, errno);
+ goto errout;
+ }
+
+ if(sysret > 0)
+ retval->left_to_read -= sysret;
+
+ if(retval->left_to_read == 0) {
+ /* we change states here */
+
+ switch(retval->state) {
+ case GIOP_MSG_READING_HEADER:
+ /* Check the magic stuff */
+ if(strncmp(GIOP_MESSAGE_BUFFER(retval)->message_header.magic, "GIOP", 4)
+ || GIOP_MESSAGE_BUFFER(retval)->message_header.GIOP_version[0] != 1) {
+//printf("#2: Not a GIOP thinger? '%s'\n", GIOP_MESSAGE_BUFFER(retval)->message_header.magic);
+ goto errout;
+ }
+ if(GIOP_MESSAGE_BUFFER(retval)->message_header.message_size == 0
+ && GIOP_MESSAGE_BUFFER(retval)->message_header.message_type != GIOP_CLOSECONNECTION) {
+// printf("Unexpected 0-length IIOP message\n");
+ goto errout;
+ }
+
+ if(giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(retval))) {
+ CORBA_unsigned_long t = GIOP_MESSAGE_BUFFER(retval)->message_header.message_size;
+ retval->decoder = (void (*)(gpointer, gpointer, gulong))iiop_byteswap;
+
+ iiop_byteswap((gpointer)&GIOP_MESSAGE_BUFFER(retval)->message_header.message_size,
+ (gpointer)&t, sizeof(t));
+ } else {
+#ifdef __KERNEL__
+ retval->decoder = (void (*)(gpointer,gpointer,gulong))__memcpy;
+#else
+ retval->decoder = (void (*)(gpointer,gpointer,gulong))memcpy;
+#endif
+ }
+
+ message_size = GIOP_MESSAGE_BUFFER(retval)->message_header.message_size;
+ if(!connection->is_auth
+ && message_size > 131072) {
+// printf("message size is bigger than 128k (%d)\n", message_size);
+ goto errout;
+ }
+
+ retval->message_body = g_malloc(message_size+sizeof(GIOPMessageHeader));
+ /* XXX1 This is a lame hack to work with the fact that
+ alignment is relative to the MessageHeader, not the RequestHeader */
+ retval->message_body = ((guchar *)retval->message_body) + sizeof(GIOPMessageHeader);
+ retval->cur = retval->message_body;
+ retval->state = GIOP_MSG_READING_BODY;
+ retval->left_to_read = message_size;
+ break;
+ case GIOP_MSG_READING_BODY:
+ if(giop_recv_decode_message(retval)) {
+//printf("giop_recv_decode_message FAILURE!\n");
+ goto errout;
+ }
+ connection->incoming_msg = NULL;
+ retval->state = GIOP_MSG_READY;
+ break;
+ default:
+ break;
+ }
+ } else if(retval->left_to_read < 0) {
+// printf("Whoa, we overstepped the number of bytes we were supposed to read by %d\n", -retval->left_to_read);
+ goto errout;
+ } else /* retval->left_to_read > 0 */ {
+ /* couldn't read the whole piece, save it */
+ retval = NULL;
+ }
+ } while(retval && retval->state != GIOP_MSG_READY);
+
+ return retval;
+
+ errout:
+ giop_recv_buffer_unuse(retval);
+ giop_main_handle_connection_exception(connection);
+ return NULL;
+}
+
+void
+giop_received_list_push(GIOPRecvBuffer *recv_buffer)
+{
+ GET_LOCK(incoming_bufs);
+ incoming_bufs = g_list_prepend(incoming_bufs, recv_buffer);
+ RELEASE_LOCK(incoming_bufs);
+}
+
+GIOPRecvBuffer *giop_received_list_pop(void)
+{
+ GList *head;
+ GIOPRecvBuffer *retval;
+
+ GET_LOCK(incoming_bufs);
+
+ head = incoming_bufs;
+
+ if(!head)
+ return NULL;
+
+ retval = head->data;
+ incoming_bufs = g_list_remove_link(incoming_bufs, head);
+ g_list_free_1 (head);
+
+ RELEASE_LOCK(incoming_bufs);
+
+ return retval;
+}
+
+static GIOPRecvBuffer *
+giop_received_list_check_reply(GIOP_unsigned_long request_id)
+{
+ GIOPRecvBuffer *retval = NULL;
+ GList *item = NULL;
+
+ GET_LOCK(incoming_bufs);
+
+ for(item = incoming_bufs; item; item = g_list_next(item))
+ {
+ if(GIOP_MESSAGE_BUFFER(item->data)->message_header.message_type == GIOP_REPLY
+ && GIOP_RECV_BUFFER(item->data)->message.u.reply.request_id == request_id) {
+ retval = item->data;
+ break;
+ }
+ }
+
+ if(retval)
+ incoming_bufs = g_list_remove(incoming_bufs, retval);
+
+ RELEASE_LOCK(incoming_bufs);
+
+ return retval;
+}
+
+/** giop_recv_reply_buffer_use_multiple
+ */
+GIOPRecvBuffer *
+giop_recv_reply_buffer_use_multiple(GArray *request_ids,
+ gboolean block_for_reply)
+{
+ return giop_recv_reply_buffer_use_multiple_2(NULL, request_ids, block_for_reply);
+}
+
+/* here is how it will be:
+ one routine for getting next message with a specified reply ID.
+ */
+
+GIOPRecvBuffer *
+giop_recv_reply_buffer_use_multiple_2(GIOPConnection *request_cnx,
+ GArray *request_ids,
+ gboolean block_for_reply)
+{
+ int i;
+ GIOPRecvBuffer *retval = NULL;
+ GSList *pushme = NULL;
+
+ do {
+ /*
+ * We _do_ want to put this inside the loop,
+ * because we may call ourselves recursively for different request_id's
+ */
+ for(i = 0; i < request_ids->len && !retval; i++)
+ retval = giop_received_list_check_reply(g_array_index(request_ids, GIOP_unsigned_long, i));
+
+ if(retval)
+ break;
+
+ retval = giop_main_next_message_2(block_for_reply, request_cnx);
+
+ if(retval) {
+ if(GIOP_MESSAGE_BUFFER(retval)->message_header.message_type == GIOP_REPLY) {
+ if(num_on_list(retval->message.u.reply.request_id,
+ (GIOP_unsigned_long *)request_ids->data,
+ request_ids->len))
+ break;
+ else {
+ pushme = g_slist_prepend(pushme, retval); retval = NULL;
+ }
+ } else {
+ if(IIOPIncomingMessageHandler)
+ IIOPIncomingMessageHandler(retval);
+ else {
+ pushme = g_slist_prepend(pushme, retval); retval = NULL;
+ }
+ retval = NULL;
+ }
+ } else
+ return NULL;
+
+ } while(!retval && block_for_reply);
+
+ g_slist_foreach(pushme, (GFunc)giop_received_list_push, NULL);
+ g_slist_free(pushme);
+
+ return retval;
+}
+
+GIOPRecvBuffer *
+giop_recv_reply_buffer_use(GIOP_unsigned_long request_id,
+ gboolean block_for_reply)
+{
+ return giop_recv_reply_buffer_use_2(NULL, request_id, block_for_reply);
+}
+
+GIOPRecvBuffer *
+giop_recv_reply_buffer_use_2(GIOPConnection *request_cnx,
+ GIOP_unsigned_long request_id,
+ gboolean block_for_reply)
+{
+ GArray fakeme;
+
+ fakeme.len = 1;
+ fakeme.data = (gpointer)&request_id;
+
+ return giop_recv_reply_buffer_use_multiple_2(request_cnx,
+ &fakeme,
+ block_for_reply);
+}
+
+GIOPRecvBuffer *
+giop_recv_locate_reply_buffer_use(GIOP_unsigned_long request_id,
+ gboolean block_for_reply)
+{
+ GIOPRecvBuffer *retval = NULL;
+
+ do {
+ /*
+ * We _do_ want to put this inside the loop,
+ * because we may call ourselves recursively for different request_id's
+ */
+ retval = giop_received_list_check_reply(request_id);
+
+ if(retval)
+ break;
+
+ retval = giop_main_next_message_2(TRUE, NULL);
+
+ if(retval) {
+ if(GIOP_MESSAGE_BUFFER(retval)->message_header.message_type == GIOP_LOCATEREPLY
+ && retval->message.u.locate_reply.request_id == request_id)
+ break;
+ else {
+ if(IIOPIncomingMessageHandler)
+ IIOPIncomingMessageHandler(retval);
+ else
+ giop_received_list_push(retval);
+ retval = NULL;
+ }
+ } else
+ return NULL;
+ } while(!retval && block_for_reply);
+
+ return retval;
+}
+
+static gint
+giop_recv_decode_message(GIOPRecvBuffer *buf)
+{
+ switch(GIOP_MESSAGE_BUFFER(buf)->message_header.message_type)
+ {
+ case GIOP_REPLY:
+ return giop_recv_reply_decode_message(buf);
+ break;
+ case GIOP_REQUEST:
+ return giop_recv_request_decode_message(buf);
+ break;
+ case GIOP_LOCATEREQUEST:
+ return(giop_recv_locate_request_decode_message(buf));
+ break;
+ case GIOP_LOCATEREPLY:
+ return(giop_recv_locate_reply_decode_message(buf));
+ break;
+ case GIOP_CLOSECONNECTION:
+ return 0;
+ break;
+ default:
+// printf("Don't know how to decode message type %d\n",
+// GIOP_MESSAGE_BUFFER(buf)->message_header.message_type);
+ return -1;
+ }
+}
+
+/* if(currptr+len > end || currptr + len < currptr) */
+
+/* This whole mess needs redoing. */
+#define CHECK_NEW_POS(buf, requested_increment) \
+if(!( (( ((guchar*)GIOP_RECV_BUFFER(buf)->cur) \
+ + (requested_increment) ) \
+ <= ( ((guchar *)GIOP_RECV_BUFFER(buf)->message_body) \
+ + GIOP_MESSAGE_BUFFER(buf)->message_header.message_size)) \
+ && ( ( ((guchar*)GIOP_RECV_BUFFER(buf)->cur) \
+ + (requested_increment) ) \
+ >= ((guchar*)GIOP_RECV_BUFFER(buf)->cur) ))) goto out;
+
+#define NEW_POS_OUT out: return -1
+
+#define SAFE_ALIGN_ADDRESS(buf, amt) G_STMT_START { \
+guchar *newval; \
+newval = ALIGN_ADDRESS(GIOP_RECV_BUFFER(buf)->cur, amt); \
+CHECK_NEW_POS(buf, newval-((guchar *)GIOP_RECV_BUFFER(buf)->cur)); \
+GIOP_RECV_BUFFER(buf)->cur = newval; \
+} G_STMT_END
+
+#define GET_ULONG(x) G_STMT_START{ \
+ (x) = GUINT32_SWAP_LE_BE((*(CORBA_unsigned_long *)buf->cur)); \
+ CHECK_NEW_POS(buf, sizeof(CORBA_unsigned_long)); \
+ buf->cur = ((guchar *)buf->cur) + sizeof(CORBA_unsigned_long); \
+ }G_STMT_END
+
+#define GET_ULONG_NC(x) G_STMT_START{ \
+ *(x) = (*((CORBA_unsigned_long *)(buf->cur))); \
+ CHECK_NEW_POS(buf, sizeof(CORBA_unsigned_long)); \
+ buf->cur = ((guchar *)buf->cur) + sizeof(CORBA_unsigned_long); \
+ }G_STMT_END
+
+/* There be dragons in here. */
+static gint
+giop_recv_reply_decode_message(GIOPRecvBuffer *buf)
+{
+ /*
+ enum ReplyStatusType {
+ NO_EXCEPTION,
+ USER_EXCEPTION,
+ SYSTEM_EXCEPTION,
+ LOCATION_FORWARD
+ };
+
+ struct ReplyHeader {
+ IOP::ServiceContextList service_context;
+ unsigned long request_id;
+ ReplyStatusType reply_status;
+ };
+ */
+ int i;
+
+ buf->message.u.reply.service_context._maximum = 0;
+ if(giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(buf)))
+ {
+ GET_ULONG(buf->message.u.reply.service_context._length);
+/* XXX bad hardcoded hack until someone gives a "right answer" to how to
+solve this problem */
+ if(buf->message.u.reply.service_context._length > 128) return -1;
+ buf->message.u.reply.service_context._buffer =
+ g_new(IOP_ServiceContext, buf->message.u.reply.service_context._length);
+
+ for(i = 0; i < buf->message.u.reply.service_context._length; i++)
+ {
+ SAFE_ALIGN_ADDRESS(buf, sizeof(GIOP_unsigned_long));
+ GET_ULONG(buf->message.u.reply.service_context._buffer[i].context_id);
+ GET_ULONG(buf->message.u.reply.service_context._buffer[i].context_data._length);
+ buf->message.u.reply.service_context._buffer[i].context_data._buffer =
+ buf->cur;
+ CHECK_NEW_POS(buf, buf->message.u.reply.service_context._buffer[i].context_data._length);
+ buf->cur = ((guchar *)buf->cur) + buf->message.u.reply.service_context._buffer[i].context_data._length;
+ }
+ GET_ULONG(buf->message.u.reply.request_id);
+ GET_ULONG(buf->message.u.reply.reply_status);
+ }
+ else
+ {
+
+ GET_ULONG_NC(&buf->message.u.reply.service_context._length);
+/* XXX bad hardcoded hack until someone gives a "right answer" to how to
+solve this problem */
+ if(buf->message.u.reply.service_context._length > 128) return -1;
+ buf->message.u.reply.service_context._buffer =
+ g_new(IOP_ServiceContext, buf->message.u.reply.service_context._length);
+
+ for(i = 0; i < buf->message.u.reply.service_context._length; i++)
+ {
+ SAFE_ALIGN_ADDRESS(buf, sizeof(CORBA_unsigned_long));
+ GET_ULONG_NC(&buf->message.u.reply.service_context._buffer[i].context_id);
+ GET_ULONG_NC(&buf->message.u.reply.service_context._buffer[i].context_data._length);
+ buf->message.u.reply.service_context._buffer[i].context_data._buffer =
+ buf->cur;
+ CHECK_NEW_POS(buf, buf->message.u.reply.service_context._buffer[i].context_data._length);
+ buf->cur = ((guchar *)buf->cur) + buf->message.u.reply.service_context._buffer[i].context_data._length;
+ }
+ GET_ULONG_NC(&buf->message.u.reply.request_id);
+ GET_ULONG_NC(&buf->message.u.reply.reply_status);
+ }
+
+#if 0
+ g_message("[%d] Received reply %d size %d to request %d",
+ getpid(),
+ buf->message.u.reply.reply_status,
+ GIOP_MESSAGE_BUFFER(buf)->message_header.message_size,
+ buf->message.u.reply.request_id);
+#endif
+
+ return 0;
+
+ NEW_POS_OUT;
+}
+
+static gint
+giop_recv_locate_reply_decode_message(GIOPRecvBuffer *buf)
+{
+ if(giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(buf)))
+ {
+ GET_ULONG(buf->message.u.locate_reply.request_id);
+ GET_ULONG(buf->message.u.locate_reply.locate_status);
+ }
+ else
+ {
+ GET_ULONG_NC(&buf->message.u.locate_reply.request_id);
+ GET_ULONG_NC(&buf->message.u.locate_reply.locate_status);
+ }
+
+ return 0;
+ NEW_POS_OUT;
+}
+
+static gint
+giop_recv_request_decode_message(GIOPRecvBuffer *buf)
+{
+ GIOP_unsigned_long len;
+ int i;
+
+ buf->message.u.request.service_context._maximum = 0;
+ if(giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(buf)))
+ {
+ GET_ULONG(buf->message.u.request.service_context._length);
+
+ /* XXX bad hardcoded hack until someone gives a "right answer"
+ to how to solve this problem */
+
+ if(buf->message.u.request.service_context._length > 128) return -1;
+ buf->message.u.request.service_context._buffer =
+ g_new(IOP_ServiceContext, buf->message.u.request.service_context._length);
+
+ for(i = 0; i < buf->message.u.request.service_context._length; i++)
+ {
+ SAFE_ALIGN_ADDRESS(buf, sizeof(GIOP_unsigned_long));
+ GET_ULONG(buf->message.u.request.service_context._buffer[i].context_id);
+ GET_ULONG(buf->message.u.request.service_context._buffer[i].context_data._length);
+ buf->message.u.request.service_context._buffer[i].context_data._buffer =
+ buf->cur;
+ CHECK_NEW_POS(buf, buf->message.u.request.service_context._buffer[i].context_data._length);
+ buf->cur = ((guchar *)buf->cur) + buf->message.u.request.service_context._buffer[i].context_data._length;
+ }
+
+ SAFE_ALIGN_ADDRESS(buf, sizeof(GIOP_unsigned_long));
+ GET_ULONG(buf->message.u.request.request_id);
+ buf->message.u.request.response_expected = *((GIOP_boolean *)buf->cur);
+ CHECK_NEW_POS(buf, sizeof(GIOP_boolean));
+ buf->cur = ((guchar *)buf->cur) + sizeof(GIOP_boolean);
+
+ SAFE_ALIGN_ADDRESS(buf, sizeof(GIOP_unsigned_long));
+ GET_ULONG(buf->message.u.request.object_key._length);
+ buf->message.u.request.object_key._buffer = buf->cur;
+
+ CHECK_NEW_POS(buf, buf->message.u.request.object_key._length);
+ buf->cur = ((guchar *)buf->cur) + buf->message.u.request.object_key._length;
+
+ SAFE_ALIGN_ADDRESS(buf, sizeof(GIOP_unsigned_long));
+ GET_ULONG(len);
+ buf->message.u.request.operation = buf->cur;
+
+ CHECK_NEW_POS(buf, len);
+ buf->cur = ((guchar *)buf->cur) + len;
+
+ SAFE_ALIGN_ADDRESS(buf, sizeof(GIOP_unsigned_long));
+ GET_ULONG(buf->message.u.request.requesting_principal._length);
+ buf->message.u.request.requesting_principal._buffer = buf->cur;
+
+ CHECK_NEW_POS(buf, buf->message.u.request.requesting_principal._length);
+ buf->cur = ((guchar *)buf->cur) + buf->message.u.request.requesting_principal._length;
+ }
+ else
+ {
+ GET_ULONG_NC(&buf->message.u.request.service_context._length);
+
+ /* XXX bad hardcoded hack until someone gives a "right answer"
+ to how to solve this problem */
+ if(buf->message.u.request.service_context._length > 128) return -1;
+ buf->message.u.request.service_context._buffer =
+ g_new(IOP_ServiceContext, buf->message.u.request.service_context._length);
+
+ for(i = 0; i < buf->message.u.request.service_context._length; i++)
+ {
+ SAFE_ALIGN_ADDRESS(buf, sizeof(GIOP_unsigned_long));
+ GET_ULONG_NC(&buf->message.u.request.service_context._buffer[i].context_id);
+ GET_ULONG_NC(&buf->message.u.request.service_context._buffer[i].context_data._length);
+ buf->message.u.request.service_context._buffer[i].context_data._buffer =
+ buf->cur;
+ CHECK_NEW_POS(buf, buf->message.u.request.service_context._buffer[i].context_data._length);
+ buf->cur = ((guchar *)buf->cur) + buf->message.u.request.service_context._buffer[i].context_data._length;
+ }
+ SAFE_ALIGN_ADDRESS(buf, sizeof(GIOP_unsigned_long));
+ GET_ULONG_NC(&buf->message.u.request.request_id);
+ buf->message.u.request.response_expected = *((GIOP_boolean *)buf->cur);
+ CHECK_NEW_POS(buf, sizeof(GIOP_boolean));
+ buf->cur = ((guchar *)buf->cur) + sizeof(GIOP_boolean);
+ SAFE_ALIGN_ADDRESS(buf, sizeof(GIOP_unsigned_long));
+ GET_ULONG_NC(&buf->message.u.request.object_key._length);
+ buf->message.u.request.object_key._buffer = buf->cur;
+ CHECK_NEW_POS(buf, buf->message.u.request.object_key._length);
+ buf->cur = ((guchar *)buf->cur) + buf->message.u.request.object_key._length;
+
+ SAFE_ALIGN_ADDRESS(buf, sizeof(GIOP_unsigned_long));
+ GET_ULONG_NC(&len);
+ buf->message.u.request.operation = buf->cur;
+ CHECK_NEW_POS(buf, len);
+ buf->cur = ((guchar *)buf->cur) + len;
+
+ SAFE_ALIGN_ADDRESS(buf, sizeof(GIOP_unsigned_long));
+ GET_ULONG_NC(&buf->message.u.request.requesting_principal._length);
+ buf->message.u.request.requesting_principal._buffer = buf->cur;
+ CHECK_NEW_POS(buf, buf->message.u.request.requesting_principal._length);
+ buf->cur = ((guchar *)buf->cur) + buf->message.u.request.requesting_principal._length;
+ }
+
+#if 0
+ g_message("[%d] Received request %s size %d ID %d",
+ getpid(),
+ buf->message.u.request.operation,
+ GIOP_MESSAGE_BUFFER(buf)->message_header.message_size,
+ buf->message.u.request.request_id);
+#endif
+
+ return 0;
+
+ NEW_POS_OUT;
+}
+
+static gint
+giop_recv_locate_request_decode_message(GIOPRecvBuffer *buf)
+{
+ if(giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(buf)))
+ {
+ SAFE_ALIGN_ADDRESS(buf, sizeof(GIOP_unsigned_long));
+ GET_ULONG(buf->message.u.locate_request.request_id);
+ SAFE_ALIGN_ADDRESS(buf, sizeof(GIOP_unsigned_long));
+ GET_ULONG(buf->message.u.locate_request.object_key._length);
+ buf->message.u.locate_request.object_key._buffer = buf->cur;
+ CHECK_NEW_POS(buf, buf->message.u.locate_request.object_key._length);
+ buf->cur = ((guchar *)buf->cur) + buf->message.u.locate_request.object_key._length;
+ }
+ else
+ {
+ SAFE_ALIGN_ADDRESS(buf, sizeof(GIOP_unsigned_long));
+ GET_ULONG_NC(&buf->message.u.locate_request.request_id);
+ SAFE_ALIGN_ADDRESS(buf, sizeof(GIOP_unsigned_long));
+ GET_ULONG_NC(&buf->message.u.locate_request.object_key._length);
+ buf->message.u.locate_request.object_key._buffer = buf->cur;
+ CHECK_NEW_POS(buf, buf->message.u.locate_request.object_key._length);
+ buf->cur = ((guchar *)buf->cur) + buf->message.u.locate_request.object_key._length;
+ }
+
+ return 0;
+
+ NEW_POS_OUT;
+}
+
+gboolean
+num_on_list(GIOP_unsigned_long num,
+ const GIOP_unsigned_long *request_ids,
+ GIOP_unsigned_long req_count)
+{
+ int i;
+ for(i = 0; i < req_count; i++)
+ {
+ if(num == request_ids[i])
+ return TRUE;
+ }
+
+ return FALSE;
+}
diff -urN linux-2.4.1/net/korbit/IIOP/giop-msg-buffer.h linux-2.4.1-korbit/net/korbit/IIOP/giop-msg-buffer.h
--- linux-2.4.1/net/korbit/IIOP/giop-msg-buffer.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/IIOP/giop-msg-buffer.h Thu Feb 1 16:19:47 2001
@@ -0,0 +1,228 @@
+#ifndef GIOP_MSG_BUFFER_H
+#define GIOP_MSG_BUFFER_H 1
+
+#include "IIOP.h"
+/* For struct iovec */
+#include <sys/uio.h>
+
+typedef enum {
+ GIOP_REQUEST,
+ GIOP_REPLY,
+ GIOP_CANCELREQUEST,
+ GIOP_LOCATEREQUEST,
+ GIOP_LOCATEREPLY,
+ GIOP_CLOSECONNECTION,
+ GIOP_MESSAGEERROR,
+ GIOP_FRAGMENT
+} GIOPMsgType;
+
+/* GIOP message header */
+typedef struct _GIOPMessageHeader {
+ GIOP_char magic[4];
+ GIOP_char GIOP_version[2];
+ GIOP_octet flags;
+
+ /*
+ * We should really use GIOPMsgType
+ * but that enum winds up being an int...
+ */
+ GIOP_octet message_type;
+
+ GIOP_unsigned_long message_size;
+} GIOPMessageHeader;
+
+#define GIOP_MESSAGE_BUFFER(x) ((GIOPMessageBuffer *)x)
+typedef struct _GIOPMessageBuffer
+{
+ /* The connection that this message will go out over... */
+ GIOPConnection *connection;
+
+ GArray *iovecs;
+ GIOPMessageHeader message_header;
+} GIOPMessageBuffer;
+
+#include "../orb/iop.h"
+
+/* GIOP_REQUEST header */
+typedef enum {
+ GIOP_NO_EXCEPTION,
+ GIOP_USER_EXCEPTION,
+ GIOP_SYSTEM_EXCEPTION,
+ GIOP_LOCATION_FORWARD
+} GIOPReplyStatusType;
+
+typedef struct _GIOPMessageRequest {
+ IOP_ServiceContextList service_context;
+ GIOP_unsigned_long request_id;
+ GIOP_boolean response_expected;
+ CORBA_sequence_octet object_key;
+ CORBA_char *operation;
+ CORBA_Principal requesting_principal;
+} GIOPMessageRequest;
+
+typedef struct _GIOPMessageReply {
+ IOP_ServiceContextList service_context;
+ GIOP_unsigned_long request_id;
+ GIOPReplyStatusType reply_status;
+} GIOPMessageReply;
+
+typedef struct _GIOPMessageCancelRequest {
+ GIOP_unsigned_long request_id;
+} GIOPMessageCancelRequest;
+
+typedef struct _GIOPMessageLocateRequest {
+ GIOP_unsigned_long request_id;
+ CORBA_sequence_octet object_key;
+} GIOPMessageLocateRequest;
+
+typedef enum {
+ GIOP_UNKNOWN_OBJECT,
+ GIOP_OBJECT_HERE,
+ GIOP_OBJECT_FORWARD
+} GIOPLocateStatusType;
+
+typedef struct _GIOPMessageLocateReply {
+ GIOP_unsigned_long request_id;
+ GIOPLocateStatusType locate_status;
+} GIOPMessageLocateReply;
+
+typedef struct _GIOPMessage
+{
+ union {
+ GIOPMessageRequest request;
+ GIOPMessageReply reply;
+ GIOPMessageCancelRequest cancel_request;
+ GIOPMessageLocateRequest locate_request;
+ GIOPMessageLocateReply locate_reply;
+ } u;
+} GIOPMessage;
+
+typedef enum {
+ GIOP_MSG_READING_HEADER,
+ GIOP_MSG_READING_BODY,
+ GIOP_MSG_READY
+} GIOPMessageBufferState;
+
+#define GIOP_SEND_BUFFER(x) ((GIOPSendBuffer *)x)
+typedef struct _GIOPSendBuffer
+{
+ GIOPMessageBuffer message_buffer;
+
+ gpointer indirect;
+
+ GMemChunk *indirects; /* Request buffers only (at present) */
+ gulong indirect_used;
+
+ GIOPMessage message;
+ CORBA_unsigned_long scontext_tmp;
+} GIOPSendBuffer;
+
+#define GIOP_RECV_BUFFER(x) ((GIOPRecvBuffer *)x)
+typedef struct _GIOPRecvBuffer
+{
+ GIOPMessageBuffer message_buffer;
+ GIOPMessage message;
+
+ gpointer message_body;
+ gpointer cur;
+
+ void (*decoder)(gpointer dest, gpointer src, gulong len);
+
+ GIOPMessageBufferState state;
+ gint left_to_read;
+} GIOPRecvBuffer;
+
+/* This function needs to be called before useful things happen */
+void giop_message_buffer_init(void);
+
+gint giop_send_buffer_write(GIOPSendBuffer *request_buffer);
+
+void
+giop_message_buffer_append_mem_a(GIOPMessageBuffer *request_buffer,
+ gconstpointer mem_region,
+ gulong mem_region_length);
+void
+giop_message_buffer_append_mem(GIOPMessageBuffer *request_buffer,
+ gconstpointer mem_region,
+ gulong mem_region_length);
+
+/*
+ * This copies the value into a request-specific buffer before
+ * adding it to the list
+ */
+gpointer
+giop_send_buffer_append_mem_indirect_a(GIOPSendBuffer *request_buffer,
+ gconstpointer mem_region,
+ gulong mem_region_length);
+gpointer
+giop_send_buffer_append_mem_indirect(GIOPSendBuffer *request_buffer,
+ gconstpointer mem_region,
+ gulong mem_region_length);
+
+GIOPSendBuffer *
+giop_send_request_buffer_use(GIOPConnection *connection,
+ const IOP_ServiceContextList *service_context,
+ GIOP_unsigned_long request_id,
+ GIOP_boolean response_expected,
+ const struct iovec *object_key_vec,
+ const struct iovec *operation_vec,
+ const struct iovec *principal_vec);
+GIOPSendBuffer *
+giop_send_reply_buffer_use(GIOPConnection *connection,
+ const IOP_ServiceContextList *service_context,
+ GIOP_unsigned_long request_id,
+ GIOPReplyStatusType reply_status);
+GIOPSendBuffer *
+giop_send_locate_request_buffer_use(GIOPConnection *connection,
+ GIOP_unsigned_long request_id,
+ const struct iovec *object_key_vec);
+GIOPSendBuffer *
+giop_send_locate_reply_buffer_use(GIOPConnection *connection,
+ GIOP_unsigned_long request_id,
+ GIOPLocateStatusType reply_status);
+
+void giop_send_buffer_unuse(GIOPSendBuffer *send_buffer);
+
+GIOP_unsigned_long giop_get_request_id(void);
+
+GIOPRecvBuffer *
+giop_recv_reply_buffer_use(GIOP_unsigned_long request_id,
+ gboolean block_for_reply);
+GIOPRecvBuffer *
+giop_recv_reply_buffer_use_2(GIOPConnection *request_cnx,
+ GIOP_unsigned_long request_id,
+ gboolean block_for_reply);
+
+/* For DII - hands back the first received request matching an id on the list */
+GIOPRecvBuffer *
+giop_recv_reply_buffer_use_multiple(GArray *request_ids,
+ gboolean block_for_reply);
+GIOPRecvBuffer *
+giop_recv_reply_buffer_use_multiple_2(GIOPConnection *request_cnx,
+ GArray *request_ids,
+ gboolean block_for_reply);
+
+GIOPRecvBuffer *
+giop_recv_locate_reply_buffer_use(GIOP_unsigned_long request_id,
+ gboolean block_for_reply);
+
+/*
+ * For server-side use. It's the responsibility of the caller to do
+ * any select()ion desired
+ */
+GIOPRecvBuffer *
+giop_recv_message_buffer_use(GIOPConnection *connection);
+
+void giop_recv_buffer_unuse(GIOPRecvBuffer *buffer);
+
+/*
+ * This is used for sending (and recving, if we ever
+ * get zero-copy receives implemented) alignment bytes
+ */
+extern char giop_scratch_space[2048];
+gulong giop_message_buffer_do_alignment(GIOPMessageBuffer *buffer,
+ gulong align_for);
+
+#define giop_msg_conversion_needed(msgbuf) (conversion_needed(GIOP_MESSAGE_BUFFER(msgbuf)->message_header.flags & 1))
+
+#endif /* GIOP_MSG_BUFFER_H */
diff -urN linux-2.4.1/net/korbit/IIOP/iiop-encoders.h linux-2.4.1-korbit/net/korbit/IIOP/iiop-encoders.h
--- linux-2.4.1/net/korbit/IIOP/iiop-encoders.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/IIOP/iiop-encoders.h Thu Feb 1 11:46:51 2001
@@ -0,0 +1,25 @@
+#ifndef ENCODERS_H
+#define ENCODERS_H 1
+
+#define ENCODER_DEC(typename) \
+void giop_encoder_##typename##(GIOPSendBuffer *send_buffer, \
+ const typename *mem)
+
+#define ENCODER_CALL(typename, mem) \
+giop_encoder_##typename##(send_buffer, mem)
+
+#define AP(m, l) giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(send_buffer), m, l)
+#define APA(m, l) giop_message_buffer_append_mem_a(GIOP_MESSAGE_BUFFER(send_buffer), m, l)
+
+#define API(m, l) giop_send_buffer_append_mem_indirect(send_buffer, m, l)
+#define APIA(m, l) giop_send_buffer_append_mem_indirect_a(send_buffer, m, l)
+
+ENCODER_DEC(IOP_ServiceContext);
+ENCODER_DEC(IOP_ServiceContextList);
+ENCODER_DEC(CORBA_sequence_octet);
+ENCODER_DEC(CORBA_Principal);
+#define giop_encoder_CORBA_Principal(rb, mem) \
+ giop_encoder_CORBA_sequence_octet(rb, mem)
+ENCODER_DEC(CORBA_char);
+
+#endif /* ENCODERS_H */
diff -urN linux-2.4.1/net/korbit/IIOP/iiop-endian.c linux-2.4.1-korbit/net/korbit/IIOP/iiop-endian.c
--- linux-2.4.1/net/korbit/IIOP/iiop-endian.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/IIOP/iiop-endian.c Thu Feb 1 11:46:51 2001
@@ -0,0 +1,12 @@
+#define IIOP_DO_NOT_INLINE_IIOP_BYTESWAP
+#include "iiop-endian.h"
+
+void iiop_byteswap(guchar *outdata,
+ const guchar *data,
+ gulong datalen)
+{
+ const guchar *source_ptr = data;
+ guchar *dest_ptr = (guchar *)outdata + datalen - 1;
+ while(dest_ptr >= outdata)
+ *dest_ptr-- = *source_ptr++;
+}
diff -urN linux-2.4.1/net/korbit/IIOP/iiop-endian.h linux-2.4.1-korbit/net/korbit/IIOP/iiop-endian.h
--- linux-2.4.1/net/korbit/IIOP/iiop-endian.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/IIOP/iiop-endian.h Thu Feb 1 11:46:51 2001
@@ -0,0 +1,42 @@
+#ifndef IIOP_ENDIAN_H
+#define IIOP_ENDIAN_H 1
+
+#include <glib.h>
+
+#if G_BYTE_ORDER == G_BIG_ENDIAN
+
+# define FLAG_ENDIANNESS FLAG_BIG_ENDIAN
+# define conversion_needed(to_endianness) ((to_endianness)!=FLAG_BIG_ENDIAN)
+
+#elif G_BYTE_ORDER == G_LITTLE_ENDIAN
+
+# define FLAG_ENDIANNESS FLAG_LITTLE_ENDIAN
+# define conversion_needed(to_endianness) ((to_endianness)!=FLAG_LITTLE_ENDIAN)
+
+#else
+
+#error "Unsupported endianness on this system."
+
+#endif
+
+#define FLAG_BIG_ENDIAN 0
+#define FLAG_LITTLE_ENDIAN 1
+
+/* This is also defined in IIOP-types.c */
+void iiop_byteswap(guchar *outdata,
+ const guchar *data,
+ gulong datalen);
+
+#if defined(G_CAN_INLINE) && !defined(IIOP_DO_NOT_INLINE_IIOP_BYTESWAP)
+G_INLINE_FUNC void iiop_byteswap(guchar *outdata,
+ const guchar *data,
+ gulong datalen)
+{
+ const guchar *source_ptr = data;
+ guchar *dest_ptr = outdata + datalen - 1;
+ while(dest_ptr >= outdata)
+ *dest_ptr-- = *source_ptr++;
+}
+#endif
+
+#endif
diff -urN linux-2.4.1/net/korbit/IIOP/iiop-endianP.h linux-2.4.1-korbit/net/korbit/IIOP/iiop-endianP.h
--- linux-2.4.1/net/korbit/IIOP/iiop-endianP.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/IIOP/iiop-endianP.h Thu Feb 1 16:19:47 2001
@@ -0,0 +1,11 @@
+#ifndef IIOP_ENDIANP_H
+#define IIOP_ENDIANP_H 1
+
+/* This is pretty much "here" */
+
+#include "config.h"
+#include "IIOP.h"
+
+#include "iiop-endian.h"
+
+#endif /* !IIOP_ENDIANP_H */
diff -urN linux-2.4.1/net/korbit/Makefile linux-2.4.1-korbit/net/korbit/Makefile
--- linux-2.4.1/net/korbit/Makefile Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/Makefile Thu Feb 1 15:57:33 2001
@@ -0,0 +1,22 @@
+#
+# Makefile for KORBit
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
+# Note 2! The CFLAGS definition is now in the main makefile...
+
+O_TARGET := korbit.o
+
+subdir-y := kglib orb IIOP ORBitutil modules
+subdir-m := modules
+
+obj-y := kglib/kglib.o orb/orblib.o IIOP/IIOPlib.o ORBitutil/ORBitutillib.o exported_symbols.o
+
+export-objs := exported_symbols.o
+
+EXTRA_CFLAGS = -D__KORBIT__ -DHAVE_CONFIG_H -I. -I./include -I./kglib -I./ORBitutil -nostdinc
+
+include $(TOPDIR)/Rules.make
+
diff -urN linux-2.4.1/net/korbit/ORBitutil/CVS/Entries linux-2.4.1-korbit/net/korbit/ORBitutil/CVS/Entries
--- linux-2.4.1/net/korbit/ORBitutil/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/ORBitutil/CVS/Entries Thu Feb 1 11:46:52 2001
@@ -0,0 +1,13 @@
+/Makefile/1.4/Thu Feb 1 09:46:52 2001//
+/basic_types.h/1.1.1.1/Thu Feb 1 09:46:52 2001//
+/compat.c/1.1.1.1/Thu Feb 1 09:46:52 2001//
+/compat.h/1.1.1.1/Thu Feb 1 09:46:52 2001//
+/orbit-os-config.h/1.2/Thu Feb 1 09:46:52 2001//
+/os-feature-alloca.h/1.1.1.1/Thu Feb 1 09:46:52 2001//
+/os-specifics.h/1.1.1.1/Thu Feb 1 09:46:52 2001//
+/thread-safety.c/1.1.1.1/Thu Feb 1 09:46:52 2001//
+/thread-safety.h/1.1.1.1/Thu Feb 1 09:46:52 2001//
+/trace.c/1.2/Thu Feb 1 09:46:52 2001//
+/trace.h/1.1.1.1/Thu Feb 1 09:46:52 2001//
+/util.h/1.1.1.1/Thu Feb 1 09:46:52 2001//
+D
diff -urN linux-2.4.1/net/korbit/ORBitutil/CVS/Repository linux-2.4.1-korbit/net/korbit/ORBitutil/CVS/Repository
--- linux-2.4.1/net/korbit/ORBitutil/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/ORBitutil/CVS/Repository Thu Feb 1 11:46:51 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/ORBitutil
diff -urN linux-2.4.1/net/korbit/ORBitutil/CVS/Root linux-2.4.1-korbit/net/korbit/ORBitutil/CVS/Root
--- linux-2.4.1/net/korbit/ORBitutil/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/ORBitutil/CVS/Root Thu Feb 1 11:46:51 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/ORBitutil/Makefile linux-2.4.1-korbit/net/korbit/ORBitutil/Makefile
--- linux-2.4.1/net/korbit/ORBitutil/Makefile Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/ORBitutil/Makefile Thu Feb 1 11:46:52 2001
@@ -0,0 +1,17 @@
+#
+# Makefile for KORBit/ORBitutil
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .o file).
+#
+# Note 2! The CFLAGS definition is now in the main makefile...
+
+O_TARGET := ORBitutillib.o
+
+#obj-m := $(O_TARGET)
+obj-y := compat.o thread-safety.o trace.o
+
+EXTRA_CFLAGS = -D__KORBIT__ -DHAVE_CONFIG_H -I. -I.. -I../include -I../kglib -I../ORBitutil -nostdinc
+
+include $(TOPDIR)/Rules.make
diff -urN linux-2.4.1/net/korbit/ORBitutil/basic_types.h linux-2.4.1-korbit/net/korbit/ORBitutil/basic_types.h
--- linux-2.4.1/net/korbit/ORBitutil/basic_types.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/ORBitutil/basic_types.h Thu Feb 1 11:46:52 2001
@@ -0,0 +1,46 @@
+#ifndef BASIC_TYPES_H
+#define BASIC_TYPES_H 1
+
+#include <glib.h>
+
+typedef gint16 CORBA_short;
+typedef gint32 CORBA_long;
+typedef guint16 CORBA_unsigned_short;
+typedef guint32 CORBA_unsigned_long;
+typedef gfloat CORBA_float;
+typedef gdouble CORBA_double;
+typedef char CORBA_char;
+typedef guchar CORBA_boolean;
+typedef guchar CORBA_octet;
+typedef gdouble CORBA_long_double;
+typedef guint16 CORBA_wchar; /* I'm not sure what size a wchar is supposed to be */
+
+/* Just a peeve */
+typedef CORBA_char GIOP_char;
+typedef CORBA_wchar GIOP_wchar;
+typedef CORBA_short GIOP_short;
+typedef CORBA_long GIOP_long;
+typedef CORBA_unsigned_short GIOP_unsigned_short;
+typedef CORBA_unsigned_long GIOP_unsigned_long;
+typedef CORBA_octet GIOP_octet;
+typedef CORBA_long GIOP_enum;
+typedef CORBA_boolean GIOP_boolean;
+typedef CORBA_float GIOP_float;
+typedef CORBA_double GIOP_double;
+typedef CORBA_long_double GIOP_long_double;
+
+#ifdef G_HAVE_GINT64
+#define HAVE_CORBA_LONG_LONG
+/* According to the spec, these two are optional. We support them if we can. */
+typedef gint64 CORBA_long_long;
+typedef guint64 CORBA_unsigned_long_long;
+typedef CORBA_long_long GIOP_long_long;
+typedef CORBA_unsigned_long_long GIOP_unsigned_long_long;
+#else
+#warning ""
+#warning "You don't G_HAVE_GINT64 defined in glib."
+#warning "Please make sure you don't have an old glibconfig.h lying around."
+#warning ""
+#endif
+
+#endif
diff -urN linux-2.4.1/net/korbit/ORBitutil/compat.c linux-2.4.1-korbit/net/korbit/ORBitutil/compat.c
--- linux-2.4.1/net/korbit/ORBitutil/compat.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/ORBitutil/compat.c Thu Feb 1 11:46:52 2001
@@ -0,0 +1,43 @@
+#include "config.h"
+#include "util.h"
+
+#define MAX_IOVS 16
+
+int g_writev(int fd, const struct iovec * vector, size_t count)
+{
+ int retval = 0;
+
+ while(count > MAX_IOVS) {
+ retval += writev(fd, vector, MAX_IOVS);
+ vector += MAX_IOVS; count -= MAX_IOVS;
+ }
+
+ return writev(fd, vector, count) + retval;
+}
+
+#ifndef HAVE_INET_ATON
+#include <netinet/in.h>
+#include <string.h>
+int inet_aton(const char *cp, struct in_addr *inp)
+{
+ union {
+ unsigned int n;
+ char parts[4];
+ } u;
+ int a=0,b=0,c=0,d=0, i;
+
+ i = sscanf(cp, "%d.%d.%d.%d%*s", &a, &b, &c, &d);
+
+ if(i != 4)
+ return 0;
+
+ u.parts[0] = a;
+ u.parts[1] = b;
+ u.parts[2] = c;
+ u.parts[3] = d;
+
+ inp->s_addr = u.n;
+
+ return 1;
+}
+#endif
diff -urN linux-2.4.1/net/korbit/ORBitutil/compat.h linux-2.4.1-korbit/net/korbit/ORBitutil/compat.h
--- linux-2.4.1/net/korbit/ORBitutil/compat.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/ORBitutil/compat.h Thu Feb 1 11:46:52 2001
@@ -0,0 +1,8 @@
+#ifndef ORBITUTIL_COMPAT_H
+#define ORBITUTIL_COMPAT_H 1
+#include <sys/types.h>
+#include <sys/uio.h>
+
+int g_writev(int fd, const struct iovec * vector, size_t count);
+
+#endif /*#define ORBITUTIL_COMPAT_H 1 */
diff -urN linux-2.4.1/net/korbit/ORBitutil/orbit-os-config.h linux-2.4.1-korbit/net/korbit/ORBitutil/orbit-os-config.h
--- linux-2.4.1/net/korbit/ORBitutil/orbit-os-config.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/ORBitutil/orbit-os-config.h Thu Feb 1 11:46:52 2001
@@ -0,0 +1,8 @@
+#ifndef OS_CONFIG_H
+#define OS_CONFIG_H 1
+
+#ifndef __KORBIT__
+#define ORBIT_HAVE_ALLOCA_H 1
+#endif
+
+#endif
diff -urN linux-2.4.1/net/korbit/ORBitutil/os-feature-alloca.h linux-2.4.1-korbit/net/korbit/ORBitutil/os-feature-alloca.h
--- linux-2.4.1/net/korbit/ORBitutil/os-feature-alloca.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/ORBitutil/os-feature-alloca.h Thu Feb 1 11:46:52 2001
@@ -0,0 +1,26 @@
+#ifndef OS_FEATURE_ALLOCA_H
+#define OS_FEATURE_ALLOCA_H 1
+
+# if ORBIT_HAVE_ALLOCA_H
+# include <alloca.h>
+# endif
+
+# include <string.h>
+
+# if defined(__GNUC__)
+
+# if defined(__STRICT_ANSI__)
+# define alloca __builtin_alloca
+# endif
+
+# elif !(ORBIT_HAVE_ALLOCA_H)
+
+# if defined(_AIX)
+ #pragma alloca
+# elif !defined(alloca) /* predefined by HP cc +Olibcalls */
+char *alloca ();
+# endif
+
+# endif /* __GNUC__ etc. */
+
+#endif /* OS_FEATURE_ALLOCA_H */
diff -urN linux-2.4.1/net/korbit/ORBitutil/os-specifics.h linux-2.4.1-korbit/net/korbit/ORBitutil/os-specifics.h
--- linux-2.4.1/net/korbit/ORBitutil/os-specifics.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/ORBitutil/os-specifics.h Thu Feb 1 11:46:52 2001
@@ -0,0 +1,12 @@
+#ifndef ORBITUTIL_OS_SPECIFICS_H
+#define ORBITUTIL_OS_SPECIFICS_H 1
+
+#include <ORBitutil/orbit-os-config.h>
+
+#include <ORBitutil/os-feature-alloca.h>
+
+/* This file should be a bunch of #ifdef's to #include the
+ os-<osname>.h for the current OS. It is intended to abstract the
+ gunkiness necessary to get some OS's to build ORBit properly. */
+
+#endif
diff -urN linux-2.4.1/net/korbit/ORBitutil/thread-safety.c linux-2.4.1-korbit/net/korbit/ORBitutil/thread-safety.c
--- linux-2.4.1/net/korbit/ORBitutil/thread-safety.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/ORBitutil/thread-safety.c Thu Feb 1 11:46:52 2001
@@ -0,0 +1,19 @@
+#include "util.h"
+
+#ifdef NOT_REENTRANT
+#include <pthread.h>
+
+pthread_key_t thread_data;
+
+void init_thread_data(void) __attribute__ ((constructor));
+
+void init_thread_data(void)
+{
+ pthread_key_create(&thread_data, NULL);
+}
+
+#else
+
+gpointer prog_data = NULL;
+
+#endif
diff -urN linux-2.4.1/net/korbit/ORBitutil/thread-safety.h linux-2.4.1-korbit/net/korbit/ORBitutil/thread-safety.h
--- linux-2.4.1/net/korbit/ORBitutil/thread-safety.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/ORBitutil/thread-safety.h Thu Feb 1 11:46:52 2001
@@ -0,0 +1,36 @@
+#ifndef THREAD_SAFETY_H
+#define THREAD_SAFETY_H 1
+
+#ifdef NOT_REENTRANT
+
+#include <pthread.h>
+
+#define DEFINE_LOCK(x) pthread_mutex_t x##_lock = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
+#define INIT_LOCK(x) /* We use static initialization, see above */
+#define GET_LOCK(x) pthread_mutex_lock(&x##_lock)
+#define RELEASE_LOCK(x) pthread_mutex_unlock(&x##_lock)
+#define PARAM_LOCK(x) pthread_mutex_t x##_lock
+#define LOCK_NAME(x) x##_lock
+#define EXTERN_LOCK(x) extern pthread_mutex_t x##_lock
+extern pthread_key_t thread_data;
+#define GET_THREAD_DATA() pthread_getspecific(thread_data)
+#define SET_THREAD_DATA(x) pthread_setspecific(thread_data, (x))
+
+#else
+
+/* stupid work around ANSI & empty semicolons. */
+#define DEFINE_LOCK(x)
+#define INIT_LOCK(x)
+#define GET_LOCK(x)
+#define RELEASE_LOCK(x)
+#define PARAM_LOCK(x) gpointer x##_lock
+#define LOCK_NAME(x) NULL
+#define EXTERN_LOCK(x)
+
+extern gpointer prog_data;
+#define GET_THREAD_DATA() prog_data
+#define SET_THREAD_DATA(x) (prog_data = (x))
+
+#endif
+
+#endif /* THREAD_SAFETY_H */
diff -urN linux-2.4.1/net/korbit/ORBitutil/trace.c linux-2.4.1-korbit/net/korbit/ORBitutil/trace.c
--- linux-2.4.1/net/korbit/ORBitutil/trace.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/ORBitutil/trace.c Thu Feb 1 11:46:52 2001
@@ -0,0 +1,94 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@acm.org>
+ *
+ */
+
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "trace.h"
+
+/*
+ * The function to call to handle trace messages, or NULL to use the default
+ * of printing to stderr.
+ */
+#ifdef ORBIT_DEBUG
+static int (* TraceCallback)(char *, va_list)=NULL;
+static int TraceModules=0;
+static ORBit_TraceLevel TraceMaxLevel=0;
+
+const char *ORBit_Trace_levellist[] = {
+ "ALERT ",
+ "CRITICAL",
+ "ERROR ",
+ "WARNING ",
+ "NOTICE ",
+ "INFO ",
+ "DEBUG "
+};
+
+void ORBit_Trace_setCallback(int (*cbf)(char *, va_list))
+{
+ TraceCallback=cbf;
+}
+
+int (*ORBit_Trace_getCallback(void))(char *, va_list)
+{
+ return(TraceCallback);
+}
+
+void ORBit_Trace_setModules(int modules)
+{
+ TraceModules=modules;
+}
+
+void ORBit_Trace_setLevel(ORBit_TraceLevel level)
+{
+ TraceMaxLevel=level;
+}
+
+int ORBit_Trace(ORBit_TraceModule module, ORBit_TraceLevel level, char *fmt, ...)
+{
+ va_list args;
+
+ if(!BitTest(TraceModules, module))
+ return 0;
+ if(TraceMaxLevel < level)
+ return 0;
+
+ va_start(args, fmt);
+ if(TraceCallback!=NULL)
+ return((*TraceCallback)(fmt, args));
+
+#ifdef __KORBIT__
+ printf("[%s]: ", ORBit_Trace_levellist[level]);
+
+ printf("%s", g_strdup_vprintf(fmt, args));
+ return 0; // breaks semantics, but return value is never used
+#else /* !__KORBIT__ */
+ fprintf(stderr, "[%s]: ", ORBit_Trace_levellist[level]);
+
+ return vfprintf(stderr, fmt, args);
+#endif /* !__KORBIT__ */
+}
+#endif
diff -urN linux-2.4.1/net/korbit/ORBitutil/trace.h linux-2.4.1-korbit/net/korbit/ORBitutil/trace.h
--- linux-2.4.1/net/korbit/ORBitutil/trace.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/ORBitutil/trace.h Thu Feb 1 11:46:52 2001
@@ -0,0 +1,68 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter and Red Hat Software
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@acm.org>
+ *
+ */
+
+#ifndef _ORBIT_TRACE_H_
+#define _ORBIT_TRACE_H_
+
+#include <stdarg.h>
+#include "util.h"
+
+typedef enum {
+ TraceMod_ORB,
+ TraceMod_CDR,
+ TraceMod_IIOP,
+ TraceMod_TC,
+ TraceMod_IR,
+ TraceMod_User=32
+} ORBit_TraceModule;
+
+typedef enum {
+ TraceLevel_Alert=0,
+ TraceLevel_Critical,
+ TraceLevel_Error,
+ TraceLevel_Warning,
+ TraceLevel_Notice,
+ TraceLevel_Info,
+ TraceLevel_Debug
+} ORBit_TraceLevel;
+
+extern const char *ORBit_Trace_levellist[];
+
+#ifdef ORBIT_DEBUG
+extern void ORBit_Trace_setCallback(int (*)(char *, va_list));
+extern int (*ORBit_Trace_getCallback(void))(char *, va_list);
+extern void ORBit_Trace_setModules(int);
+extern void ORBit_Trace_setLevel(ORBit_TraceLevel);
+extern int ORBit_Trace(ORBit_TraceModule, ORBit_TraceLevel, char *, ...);
+#else
+#define ORBit_Trace_setCallback(x)
+#define ORBit_Trace_getCallback() NULL
+#define ORBit_Trace_setModules(x)
+#define ORBit_Trace_setLevel(x)
+#define ORBit_Trace(module,level,fmt,args...)
+#endif
+
+
+#endif /* !_ORBIT_TRACE_H_ */
diff -urN linux-2.4.1/net/korbit/ORBitutil/util.h linux-2.4.1-korbit/net/korbit/ORBitutil/util.h
--- linux-2.4.1/net/korbit/ORBitutil/util.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/ORBitutil/util.h Thu Feb 1 11:46:52 2001
@@ -0,0 +1,35 @@
+#ifndef UTIL_H
+#define UTIL_H 1
+
+#include <glib.h>
+
+#define ORBIT_DEBUG 1
+
+#ifdef ORBIT_DEBUG
+#define ORBIT_DEBUG_NOTE(x) (x)
+#else
+#define ORBIT_DEBUG_NOTE(x)
+#endif
+
+
+#define BitTest(f, bit) ((f) & (1<<(bit)))
+#define BitSet(f, bit) ((f) |= (1<<(bit)))
+#define BitClr(f, bit) ((f) &= ~(1<<(bit)))
+/* Align an address upward to a boundary, expressed as a number of bytes.
+ E.g. align to an 8-byte boundary with argument of 8. */
+
+/*
+ * (this + boundary - 1)
+ * &
+ * ~(boundary - 1)
+ */
+
+#define ALIGN_ADDRESS(this, boundary) \
+ ((gpointer)((( ((unsigned long)(this)) + (((unsigned long)(boundary)) -1)) & (~(((unsigned long)(boundary))-1)))))
+
+#include <ORBitutil/thread-safety.h>
+#include <ORBitutil/trace.h>
+#include <ORBitutil/compat.h>
+#include <ORBitutil/os-specifics.h>
+
+#endif
diff -urN linux-2.4.1/net/korbit/config.h linux-2.4.1-korbit/net/korbit/config.h
--- linux-2.4.1/net/korbit/config.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/config.h Thu Feb 1 11:46:49 2001
@@ -0,0 +1,73 @@
+
+/* Define if you have alloca, as a function or macro. */
+#define HAVE_ALLOCA 1
+
+#define HAVE_ATEXIT 1
+#define NO_SYS_SIGLIST 1 /* reduce dependencies */
+#define NO_SYS_ERRLIST 1 /* reduce dependencies */
+
+/* Define if you have <alloca.h> and it should be used (not on Ultrix). */
+/* #define HAVE_ALLOCA_H 1 */
+
+/* Define if you have the vprintf function. */
+#define HAVE_VPRINTF 1
+
+/* Define if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+#define HAVE_INET_ATON 1
+/* #undef ORBIT_SERIAL */
+
+/* Define to 'int' if it isn't defined in the header files. */
+/* #undef socklen_t */
+
+#define ALIGNOF_CORBA_BOOLEAN 1
+#define ALIGNOF_CORBA_CHAR 1
+#define ALIGNOF_CORBA_DOUBLE 4
+#define ALIGNOF_CORBA_FLOAT 4
+#define ALIGNOF_CORBA_LONG 4
+#define ALIGNOF_CORBA_LONG_DOUBLE 4
+#define ALIGNOF_CORBA_LONG_LONG 4
+#define ALIGNOF_CORBA_OCTET 1
+#define ALIGNOF_CORBA_SHORT 2
+#define ALIGNOF_CORBA_STRUCT 1
+#define ALIGNOF_CORBA_UNSIGNED_LONG 4
+#define ALIGNOF_CORBA_UNSIGNED_LONG_LONG 4
+#define ALIGNOF_CORBA_UNSIGNED_SHORT 2
+#define ALIGNOF_CORBA_WCHAR 2
+#define ALIGNOF_CORBA_POINTER 4
+
+/* TCP wrappers */
+#define HAVE_TCPD_H 1
+
+#ifdef HAVE_ALLOCA_H
+#include <alloca.h>
+#endif
+
+/* Define if you have the basename function. */
+#define HAVE_BASENAME 1
+
+/* Define if you have the poll function. */
+#define HAVE_POLL 1
+#define I_WANT_POLL 1
+
+/* Define if you have the <endian.h> header file. */
+#define HAVE_ENDIAN_H 1
+
+/* Define if you have the <fcntl.h> header file. */
+#define HAVE_FCNTL_H 1
+
+/* Define if you have the <stddef.h> header file. */
+#define HAVE_STDDEF_H 1
+
+/* Define if you have the <sys/poll.h> header file. */
+#define HAVE_SYS_POLL_H 1
+
+/* Define if you have the <tcpd.h> header file. */
+#define HAVE_TCPD_H 1
+
+/* Define if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define if you have the <wchar.h> header file. */
+#define HAVE_WCHAR_H 1
diff -urN linux-2.4.1/net/korbit/exported_symbols.c linux-2.4.1-korbit/net/korbit/exported_symbols.c
--- linux-2.4.1/net/korbit/exported_symbols.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/exported_symbols.c Thu Feb 1 11:46:49 2001
@@ -0,0 +1,93 @@
+/*
+ * #include whatever it takes to get the EXPORT_SYMBOL macro, and
+ * whatever header files from korbit (for things that are being
+ * exported.
+ */
+#include <linux/config.h>
+#include <linux/module.h>
+#include "errno.h"
+#include "orb/orbit.h"
+
+/*
+ * Stuff that's good to export
+ */
+EXPORT_SYMBOL(errno);
+
+/*
+ * kglib exports...
+ */
+EXPORT_SYMBOL(g_malloc0);
+EXPORT_SYMBOL(g_free);
+EXPORT_SYMBOL(g_snprintf);
+
+/*
+ * Mainline CORBA symbols.
+ */
+EXPORT_SYMBOL(CORBA_exception_init);
+EXPORT_SYMBOL(CORBA_ORB_init);
+EXPORT_SYMBOL(CORBA_ORB_resolve_initial_references);
+EXPORT_SYMBOL(CORBA_ORB_object_to_string);
+EXPORT_SYMBOL(CORBA_free);
+EXPORT_SYMBOL(CORBA_ORB_run);
+EXPORT_SYMBOL(CORBA_Object_release);
+EXPORT_SYMBOL(CORBA_Object_duplicate);
+EXPORT_SYMBOL(CORBA_octet_allocbuf);
+EXPORT_SYMBOL(CORBA_exception_set);
+EXPORT_SYMBOL(CORBA_string__free);
+EXPORT_SYMBOL(CORBA_ORB_string_to_object);
+EXPORT_SYMBOL(CORBA_string_alloc);
+EXPORT_SYMBOL(CORBA_exception_set_system);
+
+/*
+ * ORBIT Specific symbols to export
+ */
+EXPORT_SYMBOL(ORBit_TypeCode_epv);
+EXPORT_SYMBOL(ORBit_send_system_exception);
+EXPORT_SYMBOL(ORBit_register_class);
+EXPORT_SYMBOL(ORBit_marshal_object);
+EXPORT_SYMBOL(ORBit_alloc);
+EXPORT_SYMBOL(ORBit_free);
+EXPORT_SYMBOL(ORBit_send_user_exception);
+EXPORT_SYMBOL(ORBit_delete_profiles);
+EXPORT_SYMBOL(ORBit_demarshal_object);
+EXPORT_SYMBOL(_ORBit_object_get_connection);
+EXPORT_SYMBOL(ORBit_handle_exception);
+EXPORT_SYMBOL(ORBit_object_get_forwarded_connection);
+EXPORT_SYMBOL(ORBit_default_principal_iovec);
+EXPORT_SYMBOL(ORBit_demarshal_IOR);
+
+/*
+ * CORBA giop functions
+ */
+EXPORT_SYMBOL(giop_send_buffer_write);
+EXPORT_SYMBOL(giop_send_buffer_unuse);
+EXPORT_SYMBOL(giop_message_buffer_do_alignment);
+EXPORT_SYMBOL(giop_message_buffer_append_mem);
+EXPORT_SYMBOL(giop_send_reply_buffer_use);
+EXPORT_SYMBOL(giop_send_request_buffer_use);
+EXPORT_SYMBOL(giop_recv_buffer_unuse);
+EXPORT_SYMBOL(giop_recv_reply_buffer_use_2);
+
+/*
+ * POA Symbols.
+ */
+EXPORT_SYMBOL(PortableServer_POAManager_activate);
+EXPORT_SYMBOL(PortableServer_POA_activate_object_with_id);
+EXPORT_SYMBOL(PortableServer_POA_servant_to_reference);
+EXPORT_SYMBOL(PortableServer_POA_deactivate_object);
+EXPORT_SYMBOL(PortableServer_POA__get_the_POAManager);
+EXPORT_SYMBOL(PortableServer_ServantBase__init);
+EXPORT_SYMBOL(PortableServer_ServantBase__fini);
+EXPORT_SYMBOL(PortableServer_POA_reference_to_servant);
+EXPORT_SYMBOL(PortableServer_POA_servant_to_id);
+EXPORT_SYMBOL(PortableServer_POA_activate_object);
+EXPORT_SYMBOL(PortableServer_POA_reference_to_id);
+
+/*
+ * TC Stuff (whatever that is)
+ */
+EXPORT_SYMBOL(TC_octet_struct);
+EXPORT_SYMBOL(TC_long_struct);
+EXPORT_SYMBOL(TC_ulong_struct);
+EXPORT_SYMBOL(TC_short_struct);
+EXPORT_SYMBOL(TC_string_struct);
diff -urN linux-2.4.1/net/korbit/include/.cvsignore linux-2.4.1-korbit/net/korbit/include/.cvsignore
--- linux-2.4.1/net/korbit/include/.cvsignore Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/.cvsignore Thu Feb 1 11:46:53 2001
@@ -0,0 +1 @@
+stdarg.h
diff -urN linux-2.4.1/net/korbit/include/CVS/Entries linux-2.4.1-korbit/net/korbit/include/CVS/Entries
--- linux-2.4.1/net/korbit/include/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/CVS/Entries Thu Feb 1 11:46:54 2001
@@ -0,0 +1,24 @@
+/.cvsignore/1.1/Thu Feb 1 09:46:53 2001//
+/alloca.h/1.3/Thu Feb 1 09:46:53 2001//
+/assert.h/1.1.1.1/Thu Feb 1 09:46:53 2001//
+/ctype.h/1.1.1.1/Thu Feb 1 09:46:53 2001//
+/dirent.h/1.1.1.1/Thu Feb 1 09:46:53 2001//
+/errno.h/1.2/Thu Feb 1 09:46:53 2001//
+/fcntl.h/1.3/Thu Feb 1 09:46:53 2001//
+/host_list.h/1.7/Thu Feb 1 09:46:53 2001//
+/limits.h/1.1.1.1/Thu Feb 1 09:46:53 2001//
+/locale.h/1.1.1.1/Thu Feb 1 09:46:53 2001//
+/math.h/1.2/Thu Feb 1 09:46:53 2001//
+/netdb.h/1.17/Thu Feb 1 09:46:53 2001//
+/pwd.h/1.1.1.1/Thu Feb 1 09:46:53 2001//
+/signal.h/1.1.1.1/Thu Feb 1 09:46:53 2001//
+/stdarg.h/1.3/Thu Feb 1 09:46:54 2001//
+/stddef.h/1.1.1.1/Thu Feb 1 09:46:54 2001//
+/stdio.h/1.19/Thu Feb 1 09:46:54 2001//
+/stdlib.h/1.4/Thu Feb 1 09:46:54 2001//
+/string.h/1.3/Thu Feb 1 09:46:54 2001//
+/syslog.h/1.1.1.1/Thu Feb 1 09:46:54 2001//
+/time.h/1.1.1.1/Thu Feb 1 09:46:54 2001//
+/unistd.h/1.3/Thu Feb 1 09:46:54 2001//
+/utime.h/1.1.1.1/Thu Feb 1 09:46:54 2001//
+D
diff -urN linux-2.4.1/net/korbit/include/CVS/Entries.Log linux-2.4.1-korbit/net/korbit/include/CVS/Entries.Log
--- linux-2.4.1/net/korbit/include/CVS/Entries.Log Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/CVS/Entries.Log Thu Feb 1 11:46:55 2001
@@ -0,0 +1,3 @@
+A D/arpa////
+A D/netinet////
+A D/sys////
diff -urN linux-2.4.1/net/korbit/include/CVS/Repository linux-2.4.1-korbit/net/korbit/include/CVS/Repository
--- linux-2.4.1/net/korbit/include/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/CVS/Repository Thu Feb 1 11:46:53 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/include
diff -urN linux-2.4.1/net/korbit/include/CVS/Root linux-2.4.1-korbit/net/korbit/include/CVS/Root
--- linux-2.4.1/net/korbit/include/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/CVS/Root Thu Feb 1 11:46:53 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/include/alloca.h linux-2.4.1-korbit/net/korbit/include/alloca.h
--- linux-2.4.1/net/korbit/include/alloca.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/alloca.h Thu Feb 1 11:46:53 2001
@@ -0,0 +1,6 @@
+#ifndef __KORBIT_ALLOCA_H__
+#define __KORBIT_ALLOCA_H__
+
+#include <stdlib.h>
+
+#endif
diff -urN linux-2.4.1/net/korbit/include/arpa/CVS/Entries linux-2.4.1-korbit/net/korbit/include/arpa/CVS/Entries
--- linux-2.4.1/net/korbit/include/arpa/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/arpa/CVS/Entries Thu Feb 1 11:46:55 2001
@@ -0,0 +1,2 @@
+/inet.h/1.4/Thu Feb 1 09:46:54 2001//
+D
diff -urN linux-2.4.1/net/korbit/include/arpa/CVS/Repository linux-2.4.1-korbit/net/korbit/include/arpa/CVS/Repository
--- linux-2.4.1/net/korbit/include/arpa/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/arpa/CVS/Repository Thu Feb 1 11:46:54 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/include/arpa
diff -urN linux-2.4.1/net/korbit/include/arpa/CVS/Root linux-2.4.1-korbit/net/korbit/include/arpa/CVS/Root
--- linux-2.4.1/net/korbit/include/arpa/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/arpa/CVS/Root Thu Feb 1 11:46:54 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/include/arpa/inet.h linux-2.4.1-korbit/net/korbit/include/arpa/inet.h
--- linux-2.4.1/net/korbit/include/arpa/inet.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/arpa/inet.h Thu Feb 1 11:46:54 2001
@@ -0,0 +1,50 @@
+#ifndef __KORBIT_ARPA_INET_H__
+#define __KORBIT_ARPA_INET_H__
+
+#include <linux/inet.h>
+#include <linux/in.h>
+
+static inline char* inet_ntoa(struct in_addr in)
+{
+ return in_ntoa(in.s_addr);
+}
+
+static inline int inet_aton(const char *cp, struct in_addr *inp)
+{
+ unsigned long l;
+ unsigned int val;
+ int i;
+
+ if (!cp || !inp)
+ return 0;
+
+ l = 0;
+ for (i = 0; i < 4; i++)
+ {
+ l <<= 8;
+ if (*cp != '\0')
+ {
+ val = 0;
+ while (*cp != '\0' && *cp != '.')
+ {
+ if (*cp < '0' || '9' < *cp)
+ return 0;
+
+ val *= 10;
+ val += *cp - '0';
+ cp++;
+ }
+ if (val > 255)
+ return 0;
+
+ l |= val;
+ if (*cp != '\0')
+ cp++;
+ }
+ }
+ inp->s_addr = htonl(l);
+
+ return 1;
+}
+
+#endif /* __KORBIT_ARPA_INET_H__ */
diff -urN linux-2.4.1/net/korbit/include/assert.h linux-2.4.1-korbit/net/korbit/include/assert.h
--- linux-2.4.1/net/korbit/include/assert.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/assert.h Thu Feb 1 11:46:53 2001
@@ -0,0 +1,3 @@
+#ifndef __KORBIT_ASSERT_H__
+#define __KORBIT_ASSERT_H__
+#endif
diff -urN linux-2.4.1/net/korbit/include/ctype.h linux-2.4.1-korbit/net/korbit/include/ctype.h
--- linux-2.4.1/net/korbit/include/ctype.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/ctype.h Thu Feb 1 11:46:53 2001
@@ -0,0 +1,4 @@
+#ifndef __KORBIT_CTYPE_H__
+#define __KORBIT_CTYPE_H__
+#include <linux/ctype.h>
+#endif
diff -urN linux-2.4.1/net/korbit/include/dirent.h linux-2.4.1-korbit/net/korbit/include/dirent.h
--- linux-2.4.1/net/korbit/include/dirent.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/dirent.h Thu Feb 1 11:46:53 2001
@@ -0,0 +1,3 @@
+#ifndef __KORBIT_DIRENT_H__
+#define __KORBIT_DIRENT_H__
+#endif
diff -urN linux-2.4.1/net/korbit/include/errno.h linux-2.4.1-korbit/net/korbit/include/errno.h
--- linux-2.4.1/net/korbit/include/errno.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/errno.h Thu Feb 1 11:46:53 2001
@@ -0,0 +1,9 @@
+#ifndef __KORBIT_ERRNO_H__
+#define __KORBIT_ERRNO_H__
+
+#include <asm/errno.h>
+
+#define errno korbit_errno
+extern int korbit_errno;
+
+#endif
diff -urN linux-2.4.1/net/korbit/include/fcntl.h linux-2.4.1-korbit/net/korbit/include/fcntl.h
--- linux-2.4.1/net/korbit/include/fcntl.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/fcntl.h Thu Feb 1 11:46:53 2001
@@ -0,0 +1,49 @@
+#ifndef __KORBIT_FCNTL_H__
+#define __KORBIT_FCNTL_H__
+
+#include <linux/mm.h>
+#include <linux/file.h>
+#include <linux/smp_lock.h>
+
+#include <asm/fcntl.h>
+
+#include <stdio.h>
+
+#define SETFL_MASK (O_APPEND | O_NONBLOCK | O_NDELAY | FASYNC)
+
+static inline int fcntl(int fd, int cmd, long arg)
+{
+ struct file *filp = fd2file(fd);
+ long err = -EINVAL;
+
+ switch (cmd)
+ {
+ case F_SETFD:
+ case F_GETFD:
+ err = 0;
+ break;
+ case F_GETFL:
+ if (filp)
+ err = filp->f_flags;
+ break;
+ case F_SETFL:
+ if (filp)
+ {
+ lock_kernel();
+
+ /* required for strict SunOS emulation */
+ if (O_NONBLOCK != O_NDELAY)
+ if (arg & O_NDELAY)
+ arg |= O_NONBLOCK;
+
+ filp->f_flags = (arg & SETFL_MASK) |
+ (filp->f_flags & ~SETFL_MASK);
+ err = 0;
+ unlock_kernel();
+ }
+ break;
+ }
+ return err;
+}
+
+#endif
diff -urN linux-2.4.1/net/korbit/include/host_list.h linux-2.4.1-korbit/net/korbit/include/host_list.h
--- linux-2.4.1/net/korbit/include/host_list.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/host_list.h Thu Feb 1 11:46:53 2001
@@ -0,0 +1,24 @@
+/*
+ * A statically-allocated list of Hostnames<->IPv4 addresses.
+ */
+#ifndef __KORBIT_HOST_LIST_H
+#define __KORBIT_HOST_LIST_H
+
+static struct {
+ char *name;
+ char *IP;
+} host_table[] = {
+ {"redefine.dyndns.org", "206.221.225.140"},
+ {"csil-sunb4.cs.uiuc.edu", "128.174.243.204"},
+ {"kazoo.cs.uiuc.edu", "128.174.237.133"},
+ {"opus0.cs.uiuc.edu", "128.174.236.20"},
+ {"wakeland-56.flexabit.net", "64.198.239.56"},
+ {"es-dcl-border1.cso.uiuc.edu", "127.0.0.1"},
+ {"es-dcl-border1", "127.0.0.1"}
+// {"es-dcl-border1.cso.uiuc.edu", "130.126.112.222"},
+// {"es-dcl-border1", "130.126.112.222"}
+};
+
+#define __MAX_STATIC_NAMES (sizeof(host_table) / sizeof(host_table[0]))
+
+#endif
diff -urN linux-2.4.1/net/korbit/include/limits.h linux-2.4.1-korbit/net/korbit/include/limits.h
--- linux-2.4.1/net/korbit/include/limits.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/limits.h Thu Feb 1 11:46:53 2001
@@ -0,0 +1,7 @@
+#ifndef __KORBIT_LIMITS_H__
+#define __KORBIT_LIMITS_H__
+
+#include <linux/limits.h>
+#include <linux/kernel.h>
+
+#endif
diff -urN linux-2.4.1/net/korbit/include/locale.h linux-2.4.1-korbit/net/korbit/include/locale.h
--- linux-2.4.1/net/korbit/include/locale.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/locale.h Thu Feb 1 11:46:53 2001
@@ -0,0 +1,3 @@
+#ifndef __KORBIT_LOCALE_H__
+#define __KORBIT_LOCALE_H__
+#endif
diff -urN linux-2.4.1/net/korbit/include/math.h linux-2.4.1-korbit/net/korbit/include/math.h
--- linux-2.4.1/net/korbit/include/math.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/math.h Thu Feb 1 11:46:53 2001
@@ -0,0 +1,16 @@
+#ifndef __KORBIT_MATH_H__
+#define __KORBIT_MATH_H__
+
+#include <asm/page.h>
+
+static inline double pow(double x, double y) {
+ double Q = 1.0;
+ if (y < 0)
+ BUG();
+/* return 1.0/pow(x,-y);*/
+ while (y-- > 0)
+ Q *= x;
+ return Q;
+}
+
+#endif
diff -urN linux-2.4.1/net/korbit/include/netdb.h linux-2.4.1-korbit/net/korbit/include/netdb.h
--- linux-2.4.1/net/korbit/include/netdb.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/netdb.h Thu Feb 1 11:46:53 2001
@@ -0,0 +1,197 @@
+#ifndef __KORBIT_NETDB_H__
+#define __KORBIT_NETDB_H__
+
+#include <sys/socket.h>
+#include <linux/in.h>
+#include <arpa/inet.h>
+#include "host_list.h"
+
+#define h_errno 0
+/* static int h_errno; */
+
+/* Description of data base entry for a single host. */
+struct hostent
+{
+ char *h_name; /* Official name of host. */
+ char **h_aliases; /* Alias list. */
+ int h_addrtype; /* Host address type. */
+ socklen_t h_length; /* Length of address. */
+ char **h_addr_list; /* List of addresses from name server. */
+#define h_addr h_addr_list[0] /* Address, for backward compatibility. */
+};
+
+/* Is this defined somewhere else? */
+/*struct in_addr {
+ __uint32_t s_addr;
+};*/
+
+/*
+ * Set h_errno?
+ * #define HOST_NOT_FOUND 1
+ * #define TRY_AGAIN 2
+ * #define NO_RECOVERY 3
+ * #define NO_DATA 4
+ */
+static inline struct hostent *gethostbyname (char *host)
+{
+ int c;
+ static struct in_addr tmp_in;
+ static struct hostent ret_host;
+ static char *aliases[2];
+ static char *addrs[2];
+
+ if (host == NULL)
+ {
+ printf ("** gethostbyname() Error: Got NULL parameter! **\n");
+ return (NULL);
+ }
+
+ /*
+ * The actual lookup.
+ */
+ for (c = 0; c < __MAX_STATIC_NAMES; c++)
+ {
+ if (host_table[c].name && strncmp (host, host_table[c].name, strlen(host_table[c].name)) == 0)
+ {
+/* printf ("Name '%s' found at position %d!\n", argv[1], c);*/
+/* printf ("IP address is: '%s'.\n", IPs[c]);*/
+ break;
+ }
+ }
+
+ if (c == __MAX_STATIC_NAMES)
+ {
+ /* Host not found, return NULL. */
+ return (NULL);
+ }
+ /* else, names[c] is gold! */
+
+ /* make a new hostent, ret_host */
+
+ ret_host.h_addrtype = AF_INET;
+ ret_host.h_aliases = aliases;
+ aliases[0] = host_table[c].name;
+ aliases[1] = NULL;
+ ret_host.h_name = host_table[c].name;
+ if (!inet_aton (host_table[c].IP, &tmp_in))
+ {
+ printf ("** gethostbyname() Error: Invalid IP address in table! **\n");
+ return (NULL);
+ }
+ ret_host.h_addr_list = addrs;
+ addrs[0] = (char *)&tmp_in.s_addr;
+ addrs[1] = NULL;
+ ret_host.h_length = sizeof (tmp_in.s_addr);
+ return (&ret_host);
+} /* End gethostbyname(). */
+
+/*
+ * TODO: getpeername(), gethostbyaddr(), getsockname(), gethostname()
+ * Everything from here-on has been untested (in userland). Buyer beware.
+ */
+static inline struct hostent *gethostbyaddr (const char *addr, int len, int type)
+{
+ struct in_addr tin;
+ char *inp_addr;
+ int c;
+ static struct hostent ret_host;
+ static char *aliases[1];
+ static char *addrs[2];
+ static struct in_addr tmp_in;
+
+
+ if ((type != AF_INET) || (len != 4))
+ {
+ printf ("** gethostbyaddr Error: Don't know how to deal with non-AF_INET addresses! **\n");
+ return (NULL);
+ }
+
+ tin.s_addr = *((__u32 *)addr);
+ inp_addr = inet_ntoa (tin);
+ if (inp_addr == NULL)
+ {
+ /* We got some invalid input, baby. */
+ return (NULL);
+
+ }
+
+ /*
+ * The actual lookup.
+ */
+ for (c = 0; c < __MAX_STATIC_NAMES; c++)
+ {
+ if (host_table[c].IP && strncmp (inp_addr, host_table[c].IP, strlen(host_table[c].IP)) == 0)
+ {
+ break;
+ }
+ }
+
+ if (c == __MAX_STATIC_NAMES)
+ {
+ /* Host not found, return NULL. */
+ return (NULL);
+ }
+ /* else, host_table[c].IP is gold! */
+
+ ret_host.h_addrtype = AF_INET;
+ ret_host.h_aliases = aliases;
+ aliases[0] = NULL;
+ ret_host.h_name = host_table[c].name;
+ if (!inet_aton (host_table[c].IP, &tmp_in))
+ {
+ printf ("** gethostbyname() Error: Invalid IP address in table! **\n");
+ return (NULL);
+ }
+ ret_host.h_addr_list = addrs;
+ addrs[0] = (char *)&tmp_in.s_addr;
+ addrs[1] = NULL;
+ ret_host.h_length = sizeof (tmp_in.s_addr);
+ return (&ret_host);
+} /* End gethostbyaddr(). */
+
+/*
+ * If successful, return 0. Else, return -1 and set errno.
+ * Errors:
+ * EBADF The argument s is not a valid file descriptor.
+ *
+ * ENOMEM
+ * There was insufficient memory available for the opera-
+ * tion to complete.
+ *
+ * ENOSR There were insufficient STREAMS resources available
+ * for the operation to complete.
+ *
+ * ENOTSOCK
+ * The argument s is not a socket.
+ */
+static inline int getsockname (int s, struct sockaddr *name, socklen_t *namelen)
+{
+ struct socket *sock = fd2sock(s);
+
+ if (sock == NULL)
+ return -1;
+
+ /*
+ * getname() wants an 'int *' for the length, will it by this
+ * 'socklen_t *' business? (even though it is just an 'int *'?).
+ */
+ if (sock->ops->getname(sock, name, namelen, 0) == 0)
+ return 0;
+ else
+ return -1; /* should normally also set errno */
+} /* End getsockname(). */
+
+static inline int getpeername (int s, struct sockaddr *name, socklen_t *namelen)
+{
+ struct socket *sock = fd2sock(s);
+
+ if (sock == NULL)
+ return -1;
+
+ if (sock->ops->getname(sock, name, namelen, 1) == 0)
+ return 0;
+ else
+ return -1; /* should normally also set errno */
+} /* End getpeername(). */
+
+#endif
diff -urN linux-2.4.1/net/korbit/include/netinet/CVS/Entries linux-2.4.1-korbit/net/korbit/include/netinet/CVS/Entries
--- linux-2.4.1/net/korbit/include/netinet/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/netinet/CVS/Entries Thu Feb 1 11:46:55 2001
@@ -0,0 +1,2 @@
+/in.h/1.1.1.1/Thu Feb 1 09:46:55 2001//
+D
diff -urN linux-2.4.1/net/korbit/include/netinet/CVS/Repository linux-2.4.1-korbit/net/korbit/include/netinet/CVS/Repository
--- linux-2.4.1/net/korbit/include/netinet/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/netinet/CVS/Repository Thu Feb 1 11:46:55 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/include/netinet
diff -urN linux-2.4.1/net/korbit/include/netinet/CVS/Root linux-2.4.1-korbit/net/korbit/include/netinet/CVS/Root
--- linux-2.4.1/net/korbit/include/netinet/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/netinet/CVS/Root Thu Feb 1 11:46:55 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/include/netinet/in.h linux-2.4.1-korbit/net/korbit/include/netinet/in.h
--- linux-2.4.1/net/korbit/include/netinet/in.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/netinet/in.h Thu Feb 1 11:46:55 2001
@@ -0,0 +1,5 @@
+#ifndef __KORBIT_NETINET_IN_H__
+#define __KORBIT_NETINET_IN_H__
+#include <linux/socket.h>
+#include <linux/in.h>
+#endif
diff -urN linux-2.4.1/net/korbit/include/pwd.h linux-2.4.1-korbit/net/korbit/include/pwd.h
--- linux-2.4.1/net/korbit/include/pwd.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/pwd.h Thu Feb 1 11:46:53 2001
@@ -0,0 +1,3 @@
+#ifndef __KORBIT_PWD_H__
+#define __KORBIT_PWD_H__
+#endif
diff -urN linux-2.4.1/net/korbit/include/signal.h linux-2.4.1-korbit/net/korbit/include/signal.h
--- linux-2.4.1/net/korbit/include/signal.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/signal.h Thu Feb 1 11:46:53 2001
@@ -0,0 +1,6 @@
+#ifndef __KORBIT_SIGNAL_H__
+#define __KORBIT_SIGNAL_H__
+
+#include <asm/signal.h>
+
+#endif
diff -urN linux-2.4.1/net/korbit/include/stdarg.h linux-2.4.1-korbit/net/korbit/include/stdarg.h
--- linux-2.4.1/net/korbit/include/stdarg.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/stdarg.h Thu Feb 1 11:46:54 2001
@@ -0,0 +1,13 @@
+#ifndef __KORBIT_STDARG_H__
+#define __KORBIT_STDARG_H__
+
+#define ANDY 1
+
+#if FREDRIK
+#include "/usr/lib/gcc-lib/i386-glibc21-linux/egcs-2.91.66/include/stdarg.h"
+#elif CHRIS
+#include "/usr/lib/gcc-lib/i586-mandrake-linux/egcs-2.91.66/include/stdarg.h"
+#elif ANDY
+#include "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stdarg.h"
+#endif
+#endif
diff -urN linux-2.4.1/net/korbit/include/stddef.h linux-2.4.1-korbit/net/korbit/include/stddef.h
--- linux-2.4.1/net/korbit/include/stddef.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/stddef.h Thu Feb 1 11:46:54 2001
@@ -0,0 +1,3 @@
+#ifndef __KORBIT_STDDEF_H__
+#define __KORBIT_STDDEF_H__
+#endif
diff -urN linux-2.4.1/net/korbit/include/stdio.h linux-2.4.1-korbit/net/korbit/include/stdio.h
--- linux-2.4.1/net/korbit/include/stdio.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/stdio.h Thu Feb 1 11:46:54 2001
@@ -0,0 +1,402 @@
+#ifndef __KORBIT_STDIO_H__
+#define __KORBIT_STDIO_H__
+
+#include <asm/segment.h>
+#include <asm/uaccess.h>
+#include <linux/smp_lock.h>
+#include <linux/kernel.h>
+#include <linux/fs.h>
+#include <linux/sched.h>
+#include <linux/uio.h>
+#include <linux/dcache.h>
+#include <linux/file.h>
+#include <linux/highuid.h>
+#include <sys/socket.h>
+
+#include <errno.h>
+
+#define KORBIT_DEBUG_WRITING 0
+
+
+#define printf(format,args...) printk(format,##args)
+#define fflush(x)
+
+#define SEEK_SET 0 /* Seek from beginning of file. */
+#define SEEK_CUR 1 /* Seek from current position. */
+#define SEEK_END 2 /* Seek from end of file. */
+
+static inline int unlink(const char *pathname) {
+ printf("KERNEL UNLINK('%s') CALLED!\n", pathname);
+ return -1;
+}
+
+static inline struct file *fd2file(int fd) {
+ if (fd & 1) /* can't convert a socket! */
+ return NULL;
+
+ return (struct file *)(-(fd & ~1));
+}
+
+static inline int open(const char *filename, int flags, int mode) {
+ struct file *RetVal = filp_open(filename, flags, mode);
+ if (IS_ERR(RetVal))
+ {
+ errno = PTR_ERR(RetVal);
+ return -1;
+ }
+ return -(int)RetVal;
+}
+
+static inline int creat(const char *filename, mode_t mode)
+{
+ return open(filename, O_CREAT | O_WRONLY | O_TRUNC, mode);
+}
+
+static inline int lseek(int fd, long offset, int whence)
+{
+ if ((fd & 1) == 1)
+ {
+ printk("KERNEL FSEEK() CALLED ON SOCKET!\n");
+ return -1;
+ }
+ else
+ {
+ struct file *F = fd2file(fd);
+ loff_t (*fn)(struct file *, loff_t, int);
+ int retval = -1;
+
+ if (whence <= 2)
+ {
+ fn = default_llseek;
+ if (F->f_op && F->f_op->llseek)
+ fn = F->f_op->llseek;
+
+ lock_kernel();
+ retval = fn(F, offset, whence);
+ unlock_kernel();
+ }
+ if (retval < 0)
+ {
+ errno = -retval;
+ retval = -1;
+ }
+ return retval;
+ }
+}
+
+
+asmlinkage long sys_newstat(char * filename, struct stat * statbuf);
+static inline int stat(char *filename, struct stat *buf)
+{
+ mm_segment_t oldfs;
+ int retval;
+
+ oldfs = get_fs(); set_fs(KERNEL_DS);
+ retval = sys_newstat(filename, buf);
+ set_fs(oldfs);
+ if (retval < 0)
+ {
+ errno = -retval;
+ retval = -1;
+ }
+ return retval;
+}
+
+asmlinkage long sys_newlstat(char * filename, struct stat * statbuf);
+static inline int lstat(char *filename, struct stat *buf)
+{
+ mm_segment_t oldfs;
+ int retval;
+
+ oldfs = get_fs(); set_fs(KERNEL_DS);
+ retval = sys_newlstat(filename, buf);
+ set_fs(oldfs);
+ if (retval < 0)
+ {
+ errno = -retval;
+ retval = -1;
+ }
+ return retval;
+}
+
+
+static inline int do_revalidate(struct dentry *dentry)
+{
+ struct inode * inode = dentry->d_inode;
+ if (inode->i_op && inode->i_op->revalidate)
+ return inode->i_op->revalidate(dentry);
+ return 0;
+}
+
+
+static inline int cp_new_stat(struct inode * inode, struct stat * statbuf)
+{
+ struct stat tmp;
+
+ memset(&tmp, 0, sizeof(tmp));
+ tmp.st_dev = kdev_t_to_nr(inode->i_dev);
+ tmp.st_ino = inode->i_ino;
+ tmp.st_mode = inode->i_mode;
+ tmp.st_nlink = inode->i_nlink;
+ SET_STAT_UID(tmp, inode->i_uid);
+ SET_STAT_GID(tmp, inode->i_gid);
+ tmp.st_rdev = kdev_t_to_nr(inode->i_rdev);
+#if BITS_PER_LONG == 32
+ if (inode->i_size > 0x7fffffff)
+ return -EOVERFLOW;
+ else
+#endif
+ {
+ tmp.st_size = inode->i_size;
+ tmp.st_atime = inode->i_atime;
+ tmp.st_mtime = inode->i_mtime;
+ tmp.st_ctime = inode->i_ctime;
+
+ tmp.st_blocks = inode->i_blocks;
+ tmp.st_blksize = inode->i_blksize;
+
+ memcpy(statbuf, &tmp, sizeof(tmp));
+ return 0;
+ }
+}
+
+
+static inline int fstat(int fd, struct stat *buf)
+{
+ if ((fd & 1) == 1)
+ {
+ printk("TODO : FSTAT FOR SOCKETS, DO WE WANT THIS?\n");
+ errno = EBADF;
+ return -1;
+ }
+ else
+ {
+ struct file *file = fd2file(fd);
+ struct dentry *dentry;
+ int retval = -EBADF;
+
+ if (file)
+ {
+ dentry = file->f_dentry;
+ retval = do_revalidate(dentry);
+
+ if (!retval)
+ retval = cp_new_stat(dentry->d_inode, buf);
+ }
+ if (retval < 0)
+ {
+ errno = -retval;
+ retval = -1;
+ }
+ return retval;
+ }
+}
+
+
+asmlinkage long sys_readlink(const char * path, char * buf, int bufsiz);
+static inline int readlink(const char *path, char *buf, size_t bufsiz)
+{
+ int retval;
+ mm_segment_t oldfs;
+
+ oldfs = get_fs(); set_fs(KERNEL_DS);
+ retval = sys_readlink(path, buf, bufsiz);
+ set_fs(oldfs);
+ if (retval < 0)
+ {
+ errno = -retval;
+ retval = -1;
+ }
+ return retval;
+}
+
+
+static inline int read(int fd, void *buffer, size_t count) {
+ if ((fd & 1) == 1)
+ {
+ struct socket *sock = fd2sock(fd);
+ struct iovec iov;
+ struct msghdr msg;
+ mm_segment_t oldfs;
+ int flags = 0;
+ int RetVal;
+
+ msg.msg_name = NULL;
+ msg.msg_namelen = 0;
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
+ msg.msg_control = NULL;
+ msg.msg_controllen = 0;
+ msg.msg_flags = 0;
+ iov.iov_base = buffer;
+ iov.iov_len = count;
+ oldfs = get_fs(); set_fs(KERNEL_DS);
+ RetVal = sock_recvmsg(sock, &msg, count, flags);
+ set_fs(oldfs);
+ if (RetVal < 0)
+ {
+ errno = -RetVal;
+ RetVal = -1;
+ }
+ return RetVal;
+ }
+ else
+ {
+ struct file *F = fd2file(fd);
+ mm_segment_t oldfs;
+ int RetVal;
+
+ oldfs = get_fs();
+ set_fs(KERNEL_DS);
+ RetVal = F->f_op->read(F, buffer, count, &F->f_pos);
+ set_fs(oldfs);
+ if (RetVal < 0)
+ {
+ errno = -RetVal;
+ RetVal = -1;
+ }
+ return RetVal;
+ }
+}
+
+static inline int write(int fd, const void *buffer, size_t count) {
+ if ((fd & 1) == 1)
+ {
+ struct socket *sock = fd2sock(fd);
+ struct iovec iov;
+ struct msghdr msg;
+ mm_segment_t oldfs;
+ int RetVal;
+ msg.msg_name = NULL;
+ msg.msg_namelen = 0;
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
+ msg.msg_control = NULL;
+ msg.msg_controllen = 0;
+ msg.msg_flags = MSG_NOSIGNAL;
+ if (sock->type == SOCK_SEQPACKET)
+ msg.msg_flags |= MSG_EOR;
+ iov.iov_base = (void *)buffer;
+ iov.iov_len = count;
+
+ oldfs = get_fs(); set_fs(KERNEL_DS);
+ RetVal = sock_sendmsg(sock, &msg, count);
+ set_fs(oldfs);
+ if (RetVal < 0)
+ {
+ errno = -RetVal;
+ RetVal = -1;
+ }
+ return RetVal;
+ }
+ else
+ {
+ struct file *F = fd2file(fd);
+ mm_segment_t oldfs;
+ int RetVal;
+
+ oldfs = get_fs();
+ set_fs(KERNEL_DS);
+ RetVal = F->f_op->write(F, buffer, count, &F->f_pos);
+ set_fs(oldfs);
+ if (RetVal < 0)
+ {
+ errno = -RetVal;
+ RetVal = -1;
+ }
+ return RetVal;
+ }
+}
+
+static inline int writev(int fd, const struct iovec *vector, int count) {
+#ifndef DONT_USE_SIMPLE_WRITEV
+ int i, amount = 0;
+#if KORBIT_DEBUG_WRITING
+ printk("writev (fd = 0x%X, vec=0x%p, count = %d)\n", fd, vector, count);
+#endif
+ for (i = 0; i < count; i++) {
+ char *Buf = vector[i].iov_base;
+ int Amount = vector[i].iov_len;
+ while (Amount > 0) {
+ int A = write(fd, Buf, Amount);
+//#if KORBIT_DEBUG_WRITING
+if (A < Amount)
+ printk(" write(fd = 0x%X, buf = 0x%p, size = 0x%X) "
+ "= 0x%X errno = 0x%X\n", fd, Buf, Amount, A, errno);
+//#endif
+ Amount -= A;
+ amount += A;
+ Buf += A;
+ if (Amount > 0) schedule(); // Behave somewhat nicely...
+ }
+ }
+
+#if KORBIT_DEBUG_WRITING
+ printk("writev returning 0x%X[%d]\n", amount, amount);
+#endif
+ return amount;
+
+#else
+ if ((fd & 1) == 1)
+ {
+ struct socket *sock = fd2sock(fd);
+ struct msghdr msg;
+ mm_segment_t oldfs;
+ int i, RetVal;
+ size_t tot_len = 0;
+
+ for (i = 0; i < count; i++)
+ tot_len += vector[i].iov_len;
+
+ msg.msg_name = NULL;
+ msg.msg_namelen = 0;
+ msg.msg_iov = (struct iovec *)vector;
+ msg.msg_iovlen = count;
+ msg.msg_control = NULL;
+ msg.msg_controllen = 0;
+ if (sock->type == SOCK_SEQPACKET)
+ msg.msg_flags |= MSG_EOR;
+
+ oldfs = get_fs(); set_fs(KERNEL_DS);
+ RetVal = sock_sendmsg(sock, &msg, tot_len);
+ set_fs(oldfs);
+ if (RetVal < 0)
+ {
+ errno = -RetVal;
+ RetVal = -1;
+ }
+ return RetVal;
+ }
+ else
+ {
+ struct file *F = fd2file(fd);
+ mm_segment_t oldfs;
+ int RetVal;
+
+ oldfs = get_fs();
+ set_fs(KERNEL_DS);
+ RetVal = F->f_op->writev(F, vector, (unsigned)count, &F->f_pos);
+ set_fs(oldfs);
+ if (RetVal < 0)
+ {
+ errno = -RetVal;
+ RetVal = -1;
+ }
+ return RetVal;
+ }
+#endif
+}
+
+static inline int close(int fd) {
+ int err = 0;
+ if ((fd & 1) == 1) {
+ struct socket *sock = fd2sock(fd);
+ sock_release(sock);
+ } else {
+ struct file *file = fd2file(fd);
+ fput(file);
+ }
+ return err;
+}
+
+#endif
diff -urN linux-2.4.1/net/korbit/include/stdlib.h linux-2.4.1-korbit/net/korbit/include/stdlib.h
--- linux-2.4.1/net/korbit/include/stdlib.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/stdlib.h Thu Feb 1 11:46:54 2001
@@ -0,0 +1,99 @@
+#ifndef __KORBIT_STDLIB_H__
+#define __KORBIT_STDLIB_H__
+
+#include <linux/kernel.h>
+#include <linux/malloc.h>
+#include <linux/types.h>
+#include <asm/string.h>
+
+#define strtol(nptr,endptr,base) simple_strtol(nptr,endptr,base)
+
+#if 0
+#define malloc(size) kmalloc(size, GFP_KERNEL)
+#define free(ptr) kfree(ptr)
+#endif
+
+static inline void *malloc(size_t size)
+{
+ void *ptr = NULL;
+
+ if (size == 0)
+ size = 4;
+
+ ptr = kmalloc(size + sizeof(size), GFP_KERNEL);
+
+ if (ptr)
+ {
+ *((size_t *)ptr) = size;
+ ptr = (size_t *)ptr + 1;
+ }
+
+ return ptr;
+}
+
+static inline void free(void *ptr)
+{
+ if (ptr)
+ kfree((size_t *)ptr - 1);
+}
+
+#define alloca(size) malloc(size)
+
+/* freeca(ptr) - free a mem allocation if ptr points to one, otherwise do
+ * nothing.
+ */
+static inline void freeca(void *ptr)
+{
+ if (ptr != NULL) { /* Don't free it if it's already free */
+ free(ptr);
+ }
+}
+
+static inline void *calloc(size_t nmemb, size_t size)
+{
+ void *ptr = malloc(nmemb*size);
+ if (ptr)
+ memset(ptr,0,nmemb*size);
+ return ptr;
+}
+
+static inline void *realloc(void *ptr, size_t size)
+{
+ void *newptr = NULL;
+
+ if (size != 0)
+ newptr = malloc(size);
+
+ if (ptr && newptr) /* Copy old contents */
+ {
+ size_t *p1 = (size_t *)ptr - 1;
+ size_t *p2 = (size_t *)newptr - 1;
+ size_t n = *p1 < *p2 ? *p1 : *p2;
+ memcpy(newptr, ptr, n);
+ }
+
+ if (ptr)
+ free(ptr);
+
+ return newptr;
+}
+
+/* Returned by `div'. */
+typedef struct
+{
+ int quot; /* Quotient. */
+ int rem; /* Remainder. */
+} div_t;
+
+static inline div_t div(int number, int denom)
+{
+ div_t result;
+ result.quot = number/denom;
+ result.rem = number-(number*result.quot);
+ return result;
+}
+
+#define atexit(fn) -1
+#define getenv(name) 0
+
+#endif /* __KORBIT_STDLIB_H__ */
diff -urN linux-2.4.1/net/korbit/include/string.h linux-2.4.1-korbit/net/korbit/include/string.h
--- linux-2.4.1/net/korbit/include/string.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/string.h Thu Feb 1 11:46:54 2001
@@ -0,0 +1,11 @@
+#ifndef __KORBIT_STRING_H__
+#define __KORBIT_STRING_H__
+
+#include <linux/types.h>
+#include <asm/string.h>
+
+#include <glib.h>
+
+#define strerror(errno) g_strerror(errno)
+
+#endif
diff -urN linux-2.4.1/net/korbit/include/sys/CVS/Entries linux-2.4.1-korbit/net/korbit/include/sys/CVS/Entries
--- linux-2.4.1/net/korbit/include/sys/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/sys/CVS/Entries Thu Feb 1 11:46:56 2001
@@ -0,0 +1,10 @@
+/ioctl.h/1.1.1.1/Thu Feb 1 09:46:55 2001//
+/poll.h/1.25/Thu Feb 1 09:46:55 2001//
+/socket.h/1.20/Thu Feb 1 09:46:55 2001//
+/stat.h/1.1.1.1/Thu Feb 1 09:46:55 2001//
+/time.h/1.1.1.1/Thu Feb 1 09:46:55 2001//
+/types.h/1.1.1.1/Thu Feb 1 09:46:56 2001//
+/uio.h/1.1.1.1/Thu Feb 1 09:46:56 2001//
+/un.h/1.1.1.1/Thu Feb 1 09:46:56 2001//
+/wait.h/1.1.1.1/Thu Feb 1 09:46:56 2001//
+D
diff -urN linux-2.4.1/net/korbit/include/sys/CVS/Repository linux-2.4.1-korbit/net/korbit/include/sys/CVS/Repository
--- linux-2.4.1/net/korbit/include/sys/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/sys/CVS/Repository Thu Feb 1 11:46:55 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/include/sys
diff -urN linux-2.4.1/net/korbit/include/sys/CVS/Root linux-2.4.1-korbit/net/korbit/include/sys/CVS/Root
--- linux-2.4.1/net/korbit/include/sys/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/sys/CVS/Root Thu Feb 1 11:46:55 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/include/sys/ioctl.h linux-2.4.1-korbit/net/korbit/include/sys/ioctl.h
--- linux-2.4.1/net/korbit/include/sys/ioctl.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/sys/ioctl.h Thu Feb 1 11:46:55 2001
@@ -0,0 +1,3 @@
+#ifndef __KORBIT_SYS_IOCTL_H__
+#define __KORBIT_SYS_IOCTL_H__
+#endif
diff -urN linux-2.4.1/net/korbit/include/sys/poll.h linux-2.4.1-korbit/net/korbit/include/sys/poll.h
--- linux-2.4.1/net/korbit/include/sys/poll.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/sys/poll.h Fri Feb 2 01:22:10 2001
@@ -0,0 +1,112 @@
+#ifndef __KORBIT_SYS_POLL_H__
+#define __KORBIT_SYS_POLL_H__
+
+#include <asm/poll.h>
+#include <asm/param.h>
+#include <linux/net.h>
+#include <linux/tcp.h>
+#include <linux/socket.h>
+#include <net/tcp.h>
+#include <net/sock.h>
+#include <linux/skbuff.h>
+#include <linux/sched.h>
+#include "stdlib.h"
+#include "sys/socket.h"
+
+/* Poll the file descriptors described by the NFDS structures starting at
+ * FDS. If TIMEOUT is nonzero and not -1, allow TIMEOUT milliseconds for
+ * an event to occur; if TIMEOUT is -1, block until an event occurs.
+ * Returns the number of file descriptors with events, zero if timed
+ * out, or -1 for errors.
+ */
+
+/* This implementation of poll assumes that we are sitting on the wait
+ * queues for all of the file descriptors already. Therefore if we are about
+ * to block, all we have to do is perform the schedule call which will
+ * automatically cause us to "block".
+ */
+static int poll_CheckFDs(struct pollfd *fds, unsigned long int nfds)
+{
+ int NumReady = 0, i;
+
+ // Loop over the file descriptors seeing if there is already work to be
+ // done...
+ for (i = 0; i < nfds; i++) {
+ struct socket *sock = fd2sock(fds[i].fd);
+ fds[i].revents = 0;
+
+ // Check to see if stuff is available to read
+ if (sock) {
+ // It's a socket baby
+ fds[i].revents = tcp_poll(0, sock, 0);
+
+ // Apparently tcp_poll doesn't look at the CLOSE_WAIT value,
+ // and we have a lot of sockets that end up in this state.
+ // This is a hack to shortcircuit some read failures from
+ // later. This breaks "poll semantics" strictly speaking, but
+ // it's basically the "right thing to do" (tm).
+ if (sock->sk->state == TCP_CLOSE_WAIT)
+ fds[i].revents = POLLHUP;
+ fds[i].revents &= fds[i].events | POLLERR | POLLHUP;
+ } else {
+ // It's a file
+ //struct file *f = fd2file(fd);
+// printk("POLL NOT IMPLEMENTED FOR FILES YET\n");
+ BUG();
+ }
+
+ if (fds[i].revents) {
+ NumReady++;
+// printk("FD #%d: Event = 0x%X\n", i, fds[i].revents);
+ }
+
+ } /* for */
+
+ return NumReady;
+} /* End poll_CheckFDs(). */
+
+
+static int poll(struct pollfd *fds, unsigned long int nfds, int timeout) {
+ wait_queue_t *WaitQueues = 0;
+ int NumReady = poll_CheckFDs(fds, nfds);
+ int i;
+
+ if (NumReady || timeout == 0)
+ return NumReady;
+
+// printk("Starting to Poll... %d fds...\n", nfds);
+ WaitQueues = (wait_queue_t*)malloc(nfds*sizeof(wait_queue_t));
+ if (WaitQueues == 0) return 0; // Crap, nomem...
+
+ for (i = 0; i < nfds; i++) {
+ struct socket *sock = fd2sock(fds[i].fd);
+ init_waitqueue_entry(WaitQueues+i, current);
+
+ if (sock)
+ add_wait_queue_exclusive(sock->sk->sleep, WaitQueues+i);
+// else
+// printk("I don't know how to wait on fd #%d = 0x%X\n", i, fds[i].fd);
+ }
+
+ // Wait for us to get notified by one of the socket wait queue notifiers!
+ do {
+ // Change our task state so that we are not immediately rescheduled.
+ // This lets the scheduler know that we are waiting for something to happen
+ set_current_state(TASK_INTERRUPTIBLE);
+ schedule();
+ } while (!(NumReady = poll_CheckFDs(fds, nfds)));
+
+ set_current_state(TASK_RUNNING);
+
+ for (i = 0; i < nfds; i++) {
+ struct socket *sock = fd2sock(fds[i].fd);
+ if (sock)
+ remove_wait_queue(sock->sk->sleep, WaitQueues+i);
+ }
+
+ free(WaitQueues);
+// printk("Returning %d\n", NumReady);
+ return NumReady;
+}
+
+#endif
diff -urN linux-2.4.1/net/korbit/include/sys/socket.h linux-2.4.1-korbit/net/korbit/include/sys/socket.h
--- linux-2.4.1/net/korbit/include/sys/socket.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/sys/socket.h Thu Feb 1 11:46:55 2001
@@ -0,0 +1,126 @@
+#ifndef __KORBIT_SYS_SOCKET_H__
+#define __KORBIT_SYS_SOCKET_H__
+typedef unsigned int socklen_t;
+
+#include <linux/socket.h>
+#include <linux/wait.h>
+#include <asm/semaphore.h>
+#include <net/sock.h>
+
+/* These functions are declared in net/socket.c */
+asmlinkage long sys_socket(int family, int type, int protocol);
+struct socket *sockfd_lookup(int fd, int *err);
+
+
+static inline int sock2fd(struct socket *s)
+{
+ return (-(int)s) | 1;
+}
+
+static inline struct socket *fd2sock(int sockfd)
+{
+ if ((sockfd & 1) == 0) /* can't convert a file! */
+ return NULL;
+
+ return (struct socket *)(-(sockfd & ~1));
+}
+
+
+static inline int socket(int domain, int type, int protocol) {
+ struct socket *sock;
+ int retval = sock_create(domain, type, protocol, &sock);
+
+ if (retval < 0) return (int)NULL;
+ return sock2fd(sock);
+}
+
+
+static inline int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen)
+{
+ struct socket *sock = fd2sock(sockfd);
+
+ if (sock == NULL)
+ return -1;
+ if (!sock->ops->bind(sock, my_addr, addrlen))
+ return 0;
+ else
+ return -1; /* should normally also set errno */
+}
+
+
+static inline int connect(int sockfd, const struct sockaddr *serv_addr,
+ socklen_t addrlen)
+{
+ struct socket *sock = fd2sock(sockfd);
+ int flags = 0; /* TODO : what is flags supposed to be? */
+
+ if (sock == NULL)
+ return -1;
+
+ if (sock->ops->connect(sock, (struct sockaddr *)serv_addr, addrlen, flags) == 0)
+ return 0;
+ else
+ return -1; /* should normally also set errno */
+}
+
+
+static inline int listen(int sockfd, int backlog)
+{
+ struct socket *sock = fd2sock(sockfd);
+
+ if (sock == NULL)
+ return -1;
+
+ if (sock->ops->listen(sock, backlog) == 0)
+ return 0;
+ else
+ return -1; /* should normally also set errno */
+}
+
+
+static inline int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
+{
+ struct socket *sock = fd2sock(sockfd);
+ struct socket *newsock;
+ struct sockaddr_in *newaddr = (struct sockaddr_in *)addr; /* check? */
+ int flags = 0; /* Should be ok */
+
+ if (sock == 0)
+ return -1;
+
+ newsock = sock_alloc();
+ if (newsock == 0)
+ return -1;
+
+ newsock->type = sock->type;
+ newsock->ops = sock->ops;
+ if (sock->ops->accept(sock, newsock, flags) < 0)
+ {
+ sock_release(newsock);
+ return -1; /* should normally also set errno */
+ }
+
+ newaddr->sin_family = AF_INET;
+ newaddr->sin_port = newsock->sk->dport;
+ newaddr->sin_addr.s_addr = newsock->sk->daddr;
+
+ *addrlen = sizeof(newaddr);
+
+ return sock2fd(newsock);
+}
+
+
+static inline int shutdown(int sockfd, int how)
+{
+ struct socket *sock = fd2sock(sockfd);
+
+ if (sock == NULL)
+ return -1;
+
+ if (sock->ops->shutdown(sock, how) == 0)
+ return 0;
+ else
+ return -1; /* should normally also set errno */
+}
+
+#endif
diff -urN linux-2.4.1/net/korbit/include/sys/stat.h linux-2.4.1-korbit/net/korbit/include/sys/stat.h
--- linux-2.4.1/net/korbit/include/sys/stat.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/sys/stat.h Thu Feb 1 11:46:55 2001
@@ -0,0 +1,3 @@
+#ifndef __KORBIT_SYS_STAT_H__
+#define __KORBIT_SYS_STAT_H__
+#endif
diff -urN linux-2.4.1/net/korbit/include/sys/time.h linux-2.4.1-korbit/net/korbit/include/sys/time.h
--- linux-2.4.1/net/korbit/include/sys/time.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/sys/time.h Thu Feb 1 11:46:55 2001
@@ -0,0 +1,6 @@
+#ifndef __KORBIT_TIME_H__
+#define __KORBIT_TIME_H__
+
+#include <linux/time.h>
+
+#endif
diff -urN linux-2.4.1/net/korbit/include/sys/types.h linux-2.4.1-korbit/net/korbit/include/sys/types.h
--- linux-2.4.1/net/korbit/include/sys/types.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/sys/types.h Thu Feb 1 11:46:56 2001
@@ -0,0 +1,4 @@
+#ifndef __KORBIT_SYS_TYPES_H__
+#define __KORBIT_SYS_TYPES_H__
+#include <linux/types.h>
+#endif
diff -urN linux-2.4.1/net/korbit/include/sys/uio.h linux-2.4.1-korbit/net/korbit/include/sys/uio.h
--- linux-2.4.1/net/korbit/include/sys/uio.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/sys/uio.h Thu Feb 1 11:46:56 2001
@@ -0,0 +1,4 @@
+#ifndef __KORBIT_SYS_UIO_H__
+#define __KORBIT_SYS_UIO_H__
+#include <linux/uio.h>
+#endif
diff -urN linux-2.4.1/net/korbit/include/sys/un.h linux-2.4.1-korbit/net/korbit/include/sys/un.h
--- linux-2.4.1/net/korbit/include/sys/un.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/sys/un.h Thu Feb 1 11:46:56 2001
@@ -0,0 +1,5 @@
+#ifndef __KORBIT_SYS_UN_H__
+#define __KORBIT_SYS_UN_H__
+#include <linux/socket.h>
+#include <linux/un.h>
+#endif
diff -urN linux-2.4.1/net/korbit/include/sys/wait.h linux-2.4.1-korbit/net/korbit/include/sys/wait.h
--- linux-2.4.1/net/korbit/include/sys/wait.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/sys/wait.h Thu Feb 1 11:46:56 2001
@@ -0,0 +1,3 @@
+#ifndef __KORBIT_SYS_WAIT_H__
+#define __KORBIT_SYS_WAIT_H__
+#endif
diff -urN linux-2.4.1/net/korbit/include/syslog.h linux-2.4.1-korbit/net/korbit/include/syslog.h
--- linux-2.4.1/net/korbit/include/syslog.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/syslog.h Thu Feb 1 11:46:54 2001
@@ -0,0 +1,7 @@
+#ifndef __KORBIT_SYSLOG_H__
+#define __KORBIT_SYSLOG_H__
+
+#define LOG_NOTICE 5 /* normal but significant condition */
+#define LOG_INFO 6 /* informational */
+
+#endif
diff -urN linux-2.4.1/net/korbit/include/time.h linux-2.4.1-korbit/net/korbit/include/time.h
--- linux-2.4.1/net/korbit/include/time.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/time.h Thu Feb 1 11:46:54 2001
@@ -0,0 +1,4 @@
+#ifndef __KORBIT_TIME_H__
+#define __KORBIT_TIME_H__
+
+#endif
diff -urN linux-2.4.1/net/korbit/include/unistd.h linux-2.4.1-korbit/net/korbit/include/unistd.h
--- linux-2.4.1/net/korbit/include/unistd.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/unistd.h Thu Feb 1 11:46:54 2001
@@ -0,0 +1,19 @@
+#ifndef __KORBIT_UNISTD_H__
+#define __KORBIT_UNISTD_H__
+
+#include <linux/types.h>
+#include <linux/utsname.h>
+#include <asm/string.h>
+#include <asm/semaphore.h>
+/* extern char *getcwd(char * buf, size_t size); */
+
+static inline int gethostname(char *name, size_t len) {
+ down_read(&uts_sem);
+ strncpy(name, system_utsname.nodename, len);
+ up_read(&uts_sem);
+printk("gethostname() = %s\n", name);
+ return 0;
+}
+
+
+#endif
diff -urN linux-2.4.1/net/korbit/include/utime.h linux-2.4.1-korbit/net/korbit/include/utime.h
--- linux-2.4.1/net/korbit/include/utime.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/include/utime.h Thu Feb 1 11:46:54 2001
@@ -0,0 +1,4 @@
+#ifndef __KORBIT_UTIME_H__
+#define __KORBIT_UTIME_H__
+#include <linux/utime.h>
+#endif
diff -urN linux-2.4.1/net/korbit/kglib/CVS/Entries linux-2.4.1-korbit/net/korbit/kglib/CVS/Entries
--- linux-2.4.1/net/korbit/kglib/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/kglib/CVS/Entries Thu Feb 1 11:46:57 2001
@@ -0,0 +1,15 @@
+/Makefile/1.4/Thu Feb 1 09:46:56 2001//
+/garray.c/1.3/Thu Feb 1 09:46:56 2001//
+/ghash.c/1.2/Thu Feb 1 09:46:56 2001//
+/glib.h/1.3/Thu Feb 1 09:46:56 2001//
+/glibconfig.h/1.2/Thu Feb 1 09:46:56 2001//
+/glist.c/1.1.1.1/Thu Feb 1 09:46:57 2001//
+/gmem.c/1.2/Thu Feb 1 09:46:57 2001//
+/gprimes.c/1.1.1.1/Thu Feb 1 09:46:57 2001//
+/gslist.c/1.1.1.1/Thu Feb 1 09:46:57 2001//
+/gstrfuncs.c/1.2/Thu Feb 1 09:46:57 2001//
+/gstring.c/1.1.1.1/Thu Feb 1 09:46:57 2001//
+/gtree.c/1.1.1.1/Thu Feb 1 09:46:57 2001//
+/gutils.c/1.2/Thu Feb 1 09:46:57 2001//
+/korbit_errno.c/1.1/Thu Feb 1 09:46:57 2001//
+D
diff -urN linux-2.4.1/net/korbit/kglib/CVS/Repository linux-2.4.1-korbit/net/korbit/kglib/CVS/Repository
--- linux-2.4.1/net/korbit/kglib/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/kglib/CVS/Repository Thu Feb 1 11:46:56 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/kglib
diff -urN linux-2.4.1/net/korbit/kglib/CVS/Root linux-2.4.1-korbit/net/korbit/kglib/CVS/Root
--- linux-2.4.1/net/korbit/kglib/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/kglib/CVS/Root Thu Feb 1 11:46:56 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/kglib/Makefile linux-2.4.1-korbit/net/korbit/kglib/Makefile
--- linux-2.4.1/net/korbit/kglib/Makefile Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/kglib/Makefile Thu Feb 1 11:46:56 2001
@@ -0,0 +1,18 @@
+#
+# Makefile for KORBit/kglib
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
+# Note 2! The CFLAGS definition is now in the main makefile...
+
+O_TARGET := kglib.o
+
+#obj-m := $(O_TARGET)
+obj-y := garray.o glist.o gprimes.o gstrfuncs.o gtree.o \
+ ghash.o gmem.o gslist.o gstring.o gutils.o korbit_errno.o
+
+EXTRA_CFLAGS = -D__KORBIT__ -DHAVE_CONFIG_H -DHAVE_UNISTD_H -I. -I.. -I../include -nostdinc
+include $(TOPDIR)/Rules.make
+
diff -urN linux-2.4.1/net/korbit/kglib/garray.c linux-2.4.1-korbit/net/korbit/kglib/garray.c
--- linux-2.4.1/net/korbit/kglib/garray.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/kglib/garray.c Thu Feb 1 11:46:56 2001
@@ -0,0 +1,431 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Modified by the GLib Team and others 1997-1999. See the AUTHORS
+ * file for a list of people on the GLib Team. See the ChangeLog
+ * files for a list of changes. These files are distributed with
+ * GLib at ftp://ftp.gtk.org/pub/gtk/.
+ */
+
+#include <string.h>
+#include "glib.h"
+
+
+#define MIN_ARRAY_SIZE 16
+
+
+typedef struct _GRealArray GRealArray;
+
+struct _GRealArray
+{
+ guint8 *data;
+ guint len;
+ guint alloc;
+ guint elt_size;
+ guint zero_terminated : 1;
+ guint clear : 1;
+};
+
+
+static gint g_nearest_pow (gint num);
+static void g_array_maybe_expand (GRealArray *array,
+ gint len);
+
+static GMemChunk *array_mem_chunk = NULL;
+G_LOCK_DEFINE_STATIC (array_mem_chunk);
+
+GArray*
+g_array_new (gboolean zero_terminated,
+ gboolean clear,
+ guint elt_size)
+{
+ GRealArray *array;
+
+ G_LOCK (array_mem_chunk);
+ if (!array_mem_chunk)
+ array_mem_chunk = g_mem_chunk_new ("array mem chunk",
+ sizeof (GRealArray),
+ 1024, G_ALLOC_AND_FREE);
+
+ array = g_chunk_new (GRealArray, array_mem_chunk);
+ G_UNLOCK (array_mem_chunk);
+
+ array->data = NULL;
+ array->len = 0;
+ array->alloc = 0;
+ array->zero_terminated = (zero_terminated ? 1 : 0);
+ array->clear = (clear ? 1 : 0);
+ array->elt_size = elt_size;
+
+ return (GArray*) array;
+}
+
+void
+g_array_free (GArray *array,
+ gboolean free_segment)
+{
+ if (free_segment)
+ g_free (array->data);
+
+ G_LOCK (array_mem_chunk);
+ g_mem_chunk_free (array_mem_chunk, array);
+ G_UNLOCK (array_mem_chunk);
+}
+
+GArray*
+g_array_append_vals (GArray *farray,
+ gconstpointer data,
+ guint len)
+{
+ GRealArray *array = (GRealArray*) farray;
+
+ g_array_maybe_expand (array, len);
+
+ memcpy (array->data + array->elt_size * array->len, data, array->elt_size * len);
+
+ array->len += len;
+
+ return farray;
+}
+
+GArray*
+g_array_prepend_vals (GArray *farray,
+ gconstpointer data,
+ guint len)
+{
+ GRealArray *array = (GRealArray*) farray;
+
+ g_array_maybe_expand (array, len);
+
+ g_memmove (array->data + array->elt_size * len, array->data, array->elt_size * array->len);
+
+ memcpy (array->data, data, len * array->elt_size);
+
+ array->len += len;
+
+ return farray;
+}
+
+GArray*
+g_array_insert_vals (GArray *farray,
+ guint index,
+ gconstpointer data,
+ guint len)
+{
+ GRealArray *array = (GRealArray*) farray;
+
+ g_array_maybe_expand (array, len);
+
+ g_memmove (array->data + array->elt_size * (len + index),
+ array->data + array->elt_size * index,
+ array->elt_size * (array->len - index));
+
+ memcpy (array->data + array->elt_size * index, data, len * array->elt_size);
+
+ array->len += len;
+
+ return farray;
+}
+
+GArray*
+g_array_set_size (GArray *farray,
+ guint length)
+{
+ GRealArray *array = (GRealArray*) farray;
+
+ if (array->len < length)
+ g_array_maybe_expand (array, length - array->len);
+
+ array->len = length;
+
+ return farray;
+}
+
+GArray*
+g_array_remove_index (GArray* farray,
+ guint index)
+{
+ GRealArray* array = (GRealArray*) farray;
+
+ g_return_val_if_fail (array, NULL);
+
+ g_return_val_if_fail (index < array->len, NULL);
+
+ if (index != array->len - 1)
+ g_memmove (array->data + array->elt_size * index,
+ array->data + array->elt_size * (index + 1),
+ array->elt_size * (array->len - index - 1));
+
+ if (array->zero_terminated)
+ memset (array->data + array->elt_size * (array->len - 1), 0,
+ array->elt_size);
+
+ array->len -= 1;
+
+ return farray;
+}
+
+GArray*
+g_array_remove_index_fast (GArray* farray,
+ guint index)
+{
+ GRealArray* array = (GRealArray*) farray;
+
+ g_return_val_if_fail (array, NULL);
+
+ g_return_val_if_fail (index < array->len, NULL);
+
+ if (index != array->len - 1)
+ g_memmove (array->data + array->elt_size * index,
+ array->data + array->elt_size * (array->len - 1),
+ array->elt_size);
+
+ if (array->zero_terminated)
+ memset (array->data + array->elt_size * (array->len - 1), 0,
+ array->elt_size);
+
+ array->len -= 1;
+
+ return farray;
+}
+
+static gint
+g_nearest_pow (gint num)
+{
+ gint n = 1;
+
+ while (n < num)
+ n <<= 1;
+
+ return n;
+}
+
+static void
+g_array_maybe_expand (GRealArray *array,
+ gint len)
+{
+ guint want_alloc = (array->len + len + array->zero_terminated) * array->elt_size;
+
+ if (want_alloc > array->alloc)
+ {
+ guint old_alloc = array->alloc;
+
+ array->alloc = g_nearest_pow (want_alloc);
+ array->alloc = MAX (array->alloc, MIN_ARRAY_SIZE);
+
+ array->data = g_realloc (array->data, array->alloc);
+
+ if (array->clear || array->zero_terminated)
+ memset (array->data + old_alloc, 0, array->alloc - old_alloc);
+ }
+}
+
+/* Pointer Array
+ */
+
+typedef struct _GRealPtrArray GRealPtrArray;
+
+struct _GRealPtrArray
+{
+ gpointer *pdata;
+ guint len;
+ guint alloc;
+};
+
+static void g_ptr_array_maybe_expand (GRealPtrArray *array,
+ gint len);
+
+static GMemChunk *ptr_array_mem_chunk = NULL;
+G_LOCK_DEFINE_STATIC (ptr_array_mem_chunk);
+
+
+GPtrArray*
+g_ptr_array_new (void)
+{
+ GRealPtrArray *array;
+
+ G_LOCK (ptr_array_mem_chunk);
+ if (!ptr_array_mem_chunk)
+ ptr_array_mem_chunk = g_mem_chunk_new ("array mem chunk",
+ sizeof (GRealPtrArray),
+ 1024, G_ALLOC_AND_FREE);
+
+ array = g_chunk_new (GRealPtrArray, ptr_array_mem_chunk);
+ G_UNLOCK (ptr_array_mem_chunk);
+
+ array->pdata = NULL;
+ array->len = 0;
+ array->alloc = 0;
+
+ return (GPtrArray*) array;
+}
+
+void
+g_ptr_array_free (GPtrArray *array,
+ gboolean free_segment)
+{
+ g_return_if_fail (array);
+
+ if (free_segment)
+ g_free (array->pdata);
+
+ G_LOCK (ptr_array_mem_chunk);
+ g_mem_chunk_free (ptr_array_mem_chunk, array);
+ G_UNLOCK (ptr_array_mem_chunk);
+}
+
+static void
+g_ptr_array_maybe_expand (GRealPtrArray *array,
+ gint len)
+{
+ guint old_alloc;
+
+ if ((array->len + len) > array->alloc)
+ {
+ old_alloc = array->alloc;
+
+ array->alloc = g_nearest_pow (array->len + len);
+ array->alloc = MAX (array->alloc, MIN_ARRAY_SIZE);
+ if (array->pdata)
+ array->pdata = g_realloc (array->pdata, sizeof(gpointer) * array->alloc);
+ else
+ array->pdata = g_new0 (gpointer, array->alloc);
+
+ memset (array->pdata + old_alloc, 0,
+ sizeof (gpointer) * (array->alloc - old_alloc));
+ }
+}
+
+void
+g_ptr_array_set_size (GPtrArray *farray,
+ gint length)
+{
+ GRealPtrArray* array = (GRealPtrArray*) farray;
+
+ g_return_if_fail (array);
+
+ if (length > array->len)
+ g_ptr_array_maybe_expand (array, (length - array->len));
+
+ array->len = length;
+}
+
+gpointer
+g_ptr_array_remove_index (GPtrArray* farray,
+ guint index)
+{
+ GRealPtrArray* array = (GRealPtrArray*) farray;
+ gpointer result;
+
+ g_return_val_if_fail (array, NULL);
+
+ g_return_val_if_fail (index < array->len, NULL);
+
+ result = array->pdata[index];
+
+ if (index != array->len - 1)
+ g_memmove (array->pdata + index, array->pdata + index + 1,
+ sizeof (gpointer) * (array->len - index - 1));
+
+ array->pdata[array->len - 1] = NULL;
+
+ array->len -= 1;
+
+ return result;
+}
+
+gpointer
+g_ptr_array_remove_index_fast (GPtrArray* farray,
+ guint index)
+{
+ GRealPtrArray* array = (GRealPtrArray*) farray;
+ gpointer result;
+
+ g_return_val_if_fail (array, NULL);
+
+ g_return_val_if_fail (index < array->len, NULL);
+
+ result = array->pdata[index];
+
+ if (index != array->len - 1)
+ array->pdata[index] = array->pdata[array->len - 1];
+
+ array->pdata[array->len - 1] = NULL;
+
+ array->len -= 1;
+
+ return result;
+}
+
+gboolean
+g_ptr_array_remove (GPtrArray* farray,
+ gpointer data)
+{
+ GRealPtrArray* array = (GRealPtrArray*) farray;
+ int i;
+
+ g_return_val_if_fail (array, FALSE);
+
+ for (i = 0; i < array->len; i += 1)
+ {
+ if (array->pdata[i] == data)
+ {
+ g_ptr_array_remove_index (farray, i);
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+gboolean
+g_ptr_array_remove_fast (GPtrArray* farray,
+ gpointer data)
+{
+ GRealPtrArray* array = (GRealPtrArray*) farray;
+ int i;
+
+ g_return_val_if_fail (array, FALSE);
+
+ for (i = 0; i < array->len; i += 1)
+ {
+ if (array->pdata[i] == data)
+ {
+ g_ptr_array_remove_index_fast (farray, i);
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+void
+g_ptr_array_add (GPtrArray* farray,
+ gpointer data)
+{
+ GRealPtrArray* array = (GRealPtrArray*) farray;
+
+ g_return_if_fail (array);
+
+ g_ptr_array_maybe_expand (array, 1);
+
+ array->pdata[array->len++] = data;
+}
+
diff -urN linux-2.4.1/net/korbit/kglib/ghash.c linux-2.4.1-korbit/net/korbit/kglib/ghash.c
--- linux-2.4.1/net/korbit/kglib/ghash.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/kglib/ghash.c Thu Feb 1 11:46:56 2001
@@ -0,0 +1,404 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Modified by the GLib Team and others 1997-1999. See the AUTHORS
+ * file for a list of people on the GLib Team. See the ChangeLog
+ * files for a list of changes. These files are distributed with
+ * GLib at ftp://ftp.gtk.org/pub/gtk/.
+ */
+
+#include "glib.h"
+
+
+#define HASH_TABLE_MIN_SIZE 11
+#define HASH_TABLE_MAX_SIZE 13845163
+
+
+typedef struct _GHashNode GHashNode;
+
+struct _GHashNode
+{
+ gpointer key;
+ gpointer value;
+ GHashNode *next;
+};
+
+struct _GHashTable
+{
+ gint size;
+ gint nnodes;
+ guint frozen;
+ GHashNode **nodes;
+ GHashFunc hash_func;
+ GCompareFunc key_compare_func;
+};
+
+
+static void g_hash_table_resize (GHashTable *hash_table);
+static GHashNode** g_hash_table_lookup_node (GHashTable *hash_table,
+ gconstpointer key);
+static GHashNode* g_hash_node_new (gpointer key,
+ gpointer value);
+static void g_hash_node_destroy (GHashNode *hash_node);
+static void g_hash_nodes_destroy (GHashNode *hash_node);
+
+
+G_LOCK_DEFINE_STATIC (g_hash_global);
+
+static GMemChunk *node_mem_chunk = NULL;
+static GHashNode *node_free_list = NULL;
+
+
+GHashTable*
+g_hash_table_new (GHashFunc hash_func,
+ GCompareFunc key_compare_func)
+{
+ GHashTable *hash_table;
+ guint i;
+
+ hash_table = g_new (GHashTable, 1);
+ hash_table->size = HASH_TABLE_MIN_SIZE;
+ hash_table->nnodes = 0;
+ hash_table->frozen = FALSE;
+ hash_table->hash_func = hash_func ? hash_func : g_direct_hash;
+ hash_table->key_compare_func = key_compare_func;
+ hash_table->nodes = g_new (GHashNode*, hash_table->size);
+
+ for (i = 0; i < hash_table->size; i++)
+ hash_table->nodes[i] = NULL;
+
+ return hash_table;
+}
+
+void
+g_hash_table_destroy (GHashTable *hash_table)
+{
+ guint i;
+
+ g_return_if_fail (hash_table != NULL);
+
+ for (i = 0; i < hash_table->size; i++)
+ g_hash_nodes_destroy (hash_table->nodes[i]);
+
+ g_free (hash_table->nodes);
+ g_free (hash_table);
+}
+
+static inline GHashNode**
+g_hash_table_lookup_node (GHashTable *hash_table,
+ gconstpointer key)
+{
+ GHashNode **node;
+
+ node = &hash_table->nodes
+ [(* hash_table->hash_func) (key) % hash_table->size];
+
+ /* Hash table lookup needs to be fast.
+ * We therefore remove the extra conditional of testing
+ * whether to call the key_compare_func or not from
+ * the inner loop.
+ */
+ if (hash_table->key_compare_func)
+ while (*node && !(*hash_table->key_compare_func) ((*node)->key, key))
+ node = &(*node)->next;
+ else
+ while (*node && (*node)->key != key)
+ node = &(*node)->next;
+
+ return node;
+}
+
+gpointer
+g_hash_table_lookup (GHashTable *hash_table,
+ gconstpointer key)
+{
+ GHashNode *node;
+
+ g_return_val_if_fail (hash_table != NULL, NULL);
+
+ node = *g_hash_table_lookup_node (hash_table, key);
+
+ return node ? node->value : NULL;
+}
+
+void
+g_hash_table_insert (GHashTable *hash_table,
+ gpointer key,
+ gpointer value)
+{
+ GHashNode **node;
+
+ g_return_if_fail (hash_table != NULL);
+
+ node = g_hash_table_lookup_node (hash_table, key);
+
+ if (*node)
+ {
+ /* do not reset node->key in this place, keeping
+ * the old key might be intended.
+ * a g_hash_table_remove/g_hash_table_insert pair
+ * can be used otherwise.
+ *
+ * node->key = key; */
+ (*node)->value = value;
+ }
+ else
+ {
+ *node = g_hash_node_new (key, value);
+ hash_table->nnodes++;
+ if (!hash_table->frozen)
+ g_hash_table_resize (hash_table);
+ }
+}
+
+void
+g_hash_table_remove (GHashTable *hash_table,
+ gconstpointer key)
+{
+ GHashNode **node, *dest;
+
+ g_return_if_fail (hash_table != NULL);
+
+ node = g_hash_table_lookup_node (hash_table, key);
+
+ if (*node)
+ {
+ dest = *node;
+ (*node) = dest->next;
+ g_hash_node_destroy (dest);
+ hash_table->nnodes--;
+
+ if (!hash_table->frozen)
+ g_hash_table_resize (hash_table);
+ }
+}
+
+gboolean
+g_hash_table_lookup_extended (GHashTable *hash_table,
+ gconstpointer lookup_key,
+ gpointer *orig_key,
+ gpointer *value)
+{
+ GHashNode *node;
+
+ g_return_val_if_fail (hash_table != NULL, FALSE);
+
+ node = *g_hash_table_lookup_node (hash_table, lookup_key);
+
+ if (node)
+ {
+ if (orig_key)
+ *orig_key = node->key;
+ if (value)
+ *value = node->value;
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+void
+g_hash_table_freeze (GHashTable *hash_table)
+{
+ g_return_if_fail (hash_table != NULL);
+
+ hash_table->frozen++;
+}
+
+void
+g_hash_table_thaw (GHashTable *hash_table)
+{
+ g_return_if_fail (hash_table != NULL);
+
+ if (hash_table->frozen)
+ if (!(--hash_table->frozen))
+ g_hash_table_resize (hash_table);
+}
+
+guint
+g_hash_table_foreach_remove (GHashTable *hash_table,
+ GHRFunc func,
+ gpointer user_data)
+{
+ GHashNode *node, *prev;
+ guint i;
+ guint deleted = 0;
+
+ g_return_val_if_fail (hash_table != NULL, 0);
+ g_return_val_if_fail (func != NULL, 0);
+
+ for (i = 0; i < hash_table->size; i++)
+ {
+ restart:
+
+ prev = NULL;
+
+ for (node = hash_table->nodes[i]; node; prev = node, node = node->next)
+ {
+ if ((* func) (node->key, node->value, user_data))
+ {
+ deleted += 1;
+
+ hash_table->nnodes -= 1;
+
+ if (prev)
+ {
+ prev->next = node->next;
+ g_hash_node_destroy (node);
+ node = prev;
+ }
+ else
+ {
+ hash_table->nodes[i] = node->next;
+ g_hash_node_destroy (node);
+ goto restart;
+ }
+ }
+ }
+ }
+
+ if (!hash_table->frozen)
+ g_hash_table_resize (hash_table);
+
+ return deleted;
+}
+
+void
+g_hash_table_foreach (GHashTable *hash_table,
+ GHFunc func,
+ gpointer user_data)
+{
+ GHashNode *node;
+ gint i;
+
+ g_return_if_fail (hash_table != NULL);
+ g_return_if_fail (func != NULL);
+
+ for (i = 0; i < hash_table->size; i++)
+ for (node = hash_table->nodes[i]; node; node = node->next)
+ (* func) (node->key, node->value, user_data);
+}
+
+/* Returns the number of elements contained in the hash table. */
+guint
+g_hash_table_size (GHashTable *hash_table)
+{
+ g_return_val_if_fail (hash_table != NULL, 0);
+
+ return hash_table->nnodes;
+}
+
+static void
+g_hash_table_resize (GHashTable *hash_table)
+{
+ GHashNode **new_nodes;
+ GHashNode *node;
+ GHashNode *next;
+#ifdef __KORBIT__
+ guint nodes_per_list;
+#else
+ gfloat nodes_per_list;
+#endif
+ guint hash_val;
+ gint new_size;
+ gint i;
+
+ nodes_per_list = (hash_table->nnodes * 10) / hash_table->size;
+
+ if ((nodes_per_list > 3 || hash_table->size <= HASH_TABLE_MIN_SIZE) &&
+ (nodes_per_list < 30 || hash_table->size >= HASH_TABLE_MAX_SIZE))
+ return;
+
+ new_size = CLAMP(g_spaced_primes_closest (hash_table->nnodes),
+ HASH_TABLE_MIN_SIZE,
+ HASH_TABLE_MAX_SIZE);
+ new_nodes = g_new0 (GHashNode*, new_size);
+
+ for (i = 0; i < hash_table->size; i++)
+ for (node = hash_table->nodes[i]; node; node = next)
+ {
+ next = node->next;
+
+ hash_val = (* hash_table->hash_func) (node->key) % new_size;
+
+ node->next = new_nodes[hash_val];
+ new_nodes[hash_val] = node;
+ }
+
+ g_free (hash_table->nodes);
+ hash_table->nodes = new_nodes;
+ hash_table->size = new_size;
+}
+
+static GHashNode*
+g_hash_node_new (gpointer key,
+ gpointer value)
+{
+ GHashNode *hash_node;
+
+ G_LOCK (g_hash_global);
+ if (node_free_list)
+ {
+ hash_node = node_free_list;
+ node_free_list = node_free_list->next;
+ }
+ else
+ {
+ if (!node_mem_chunk)
+ node_mem_chunk = g_mem_chunk_new ("hash node mem chunk",
+ sizeof (GHashNode),
+ 1024, G_ALLOC_ONLY);
+
+ hash_node = g_chunk_new (GHashNode, node_mem_chunk);
+ }
+ G_UNLOCK (g_hash_global);
+
+ hash_node->key = key;
+ hash_node->value = value;
+ hash_node->next = NULL;
+
+ return hash_node;
+}
+
+static void
+g_hash_node_destroy (GHashNode *hash_node)
+{
+ G_LOCK (g_hash_global);
+ hash_node->next = node_free_list;
+ node_free_list = hash_node;
+ G_UNLOCK (g_hash_global);
+}
+
+static void
+g_hash_nodes_destroy (GHashNode *hash_node)
+{
+ if (hash_node)
+ {
+ GHashNode *node = hash_node;
+
+ while (node->next)
+ node = node->next;
+
+ G_LOCK (g_hash_global);
+ node->next = node_free_list;
+ node_free_list = hash_node;
+ G_UNLOCK (g_hash_global);
+ }
+}
diff -urN linux-2.4.1/net/korbit/kglib/glib.h linux-2.4.1-korbit/net/korbit/kglib/glib.h
--- linux-2.4.1/net/korbit/kglib/glib.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/kglib/glib.h Thu Feb 1 11:46:56 2001
@@ -0,0 +1,1671 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __G_LIB_H__
+#define __G_LIB_H__
+
+#ifdef __KORBIT__
+#define G_DISABLE_ASSERT 1
+#include <stdio.h>
+#endif
+
+#include "config.h"
+
+/* system specific config file glibconfig.h provides definitions for
+ * the extrema of many of the standard types. These are:
+ *
+ * G_MINSHORT, G_MAXSHORT
+ * G_MININT, G_MAXINT
+ * G_MINLONG, G_MAXLONG
+ * G_MINFLOAT, G_MAXFLOAT
+ * G_MINDOUBLE, G_MAXDOUBLE
+ *
+ * It also provides the following typedefs:
+ *
+ * gint8, guint8
+ * gint16, guint16
+ * gint32, guint32
+ * gint64, guint64
+ *
+ * It defines the G_BYTE_ORDER symbol to one of G_*_ENDIAN (see later in
+ * this file).
+ *
+ * And it provides a way to store and retrieve a `gint' in/from a `gpointer'.
+ * This is useful to pass an integer instead of a pointer to a callback.
+ *
+ * GINT_TO_POINTER(i), GUINT_TO_POINTER(i)
+ * GPOINTER_TO_INT(p), GPOINTER_TO_UINT(p)
+ *
+ * Finally, it provide the following wrappers to STDC functions:
+ *
+ * g_ATEXIT
+ * To register hooks which are executed on exit().
+ * Usually a wrapper for STDC atexit.
+ *
+ * void *g_memmove(void *dest, const void *src, guint count);
+ * A wrapper for STDC memmove, or an implementation, if memmove doesn't
+ * exist. The prototype looks like the above, give or take a const,
+ * or size_t.
+ */
+#include <glibconfig.h>
+
+/* include varargs functions for assertment macros
+ */
+#include <stdarg.h>
+
+#define G_DIR_SEPARATOR '/'
+#define G_DIR_SEPARATOR_S "/"
+#define G_SEARCHPATH_SEPARATOR ':'
+#define G_SEARCHPATH_SEPARATOR_S ":"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/* Provide definitions for some commonly used macros.
+ * Some of them are only provided if they haven't already
+ * been defined. It is assumed that if they are already
+ * defined then the current definition is correct.
+ */
+#ifndef NULL
+#define NULL ((void*) 0)
+#endif
+
+#ifndef FALSE
+#define FALSE (0)
+#endif
+
+#ifndef TRUE
+#define TRUE (!FALSE)
+#endif
+
+#undef MAX
+#define MAX(a, b) (((a) > (b)) ? (a) : (b))
+
+#undef MIN
+#define MIN(a, b) (((a) < (b)) ? (a) : (b))
+
+#undef ABS
+#define ABS(a) (((a) < 0) ? -(a) : (a))
+
+#undef CLAMP
+#define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x)))
+
+
+/* Define G_VA_COPY() to do the right thing for copying va_list variables.
+ * glibconfig.h may have already defined G_VA_COPY as va_copy or __va_copy.
+ */
+#if !defined (G_VA_COPY)
+# if defined (__GNUC__) && defined (__PPC__) && (defined (_CALL_SYSV) || defined (_WIN32))
+# define G_VA_COPY(ap1, ap2) (*(ap1) = *(ap2))
+# elif defined (G_VA_COPY_AS_ARRAY)
+# define G_VA_COPY(ap1, ap2) g_memmove ((ap1), (ap2), sizeof (va_list))
+# else /* va_list is a pointer */
+# define G_VA_COPY(ap1, ap2) ((ap1) = (ap2))
+# endif /* va_list is a pointer */
+#endif /* !G_VA_COPY */
+
+
+/* Provide convenience macros for handling structure
+ * fields through their offsets.
+ */
+#define G_STRUCT_OFFSET(struct_type, member) \
+ ((gulong) ((gchar*) &((struct_type*) 0)->member))
+#define G_STRUCT_MEMBER_P(struct_p, struct_offset) \
+ ((gpointer) ((gchar*) (struct_p) + (gulong) (struct_offset)))
+#define G_STRUCT_MEMBER(member_type, struct_p, struct_offset) \
+ (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
+
+
+/* inlining hassle. for compilers that don't allow the `inline' keyword,
+ * mostly because of strict ANSI C compliance or dumbness, we try to fall
+ * back to either `__inline__' or `__inline'.
+ * we define G_CAN_INLINE, if the compiler seems to be actually
+ * *capable* to do function inlining, in which case inline function bodys
+ * do make sense. we also define G_INLINE_FUNC to properly export the
+ * function prototypes if no inlining can be performed.
+ * we special case most of the stuff, so inline functions can have a normal
+ * implementation by defining G_INLINE_FUNC to extern and G_CAN_INLINE to 1.
+ */
+#ifndef G_INLINE_FUNC
+# define G_CAN_INLINE 1
+#endif
+#ifdef G_HAVE_INLINE
+# if defined (__GNUC__) && defined (__STRICT_ANSI__)
+# undef inline
+# define inline __inline__
+# endif
+#else /* !G_HAVE_INLINE */
+# undef inline
+# if defined (G_HAVE___INLINE__)
+# define inline __inline__
+# else /* !inline && !__inline__ */
+# if defined (G_HAVE___INLINE)
+# define inline __inline
+# else /* !inline && !__inline__ && !__inline */
+# define inline /* don't inline, then */
+# ifndef G_INLINE_FUNC
+# undef G_CAN_INLINE
+# endif
+# endif
+# endif
+#endif
+#ifndef G_INLINE_FUNC
+# ifdef __GNUC__
+# ifdef __OPTIMIZE__
+# define G_INLINE_FUNC extern inline
+# else
+# undef G_CAN_INLINE
+# define G_INLINE_FUNC extern
+# endif
+# else /* !__GNUC__ */
+# ifdef G_CAN_INLINE
+# define G_INLINE_FUNC static inline
+# else
+# define G_INLINE_FUNC extern
+# endif
+# endif /* !__GNUC__ */
+#endif /* !G_INLINE_FUNC */
+
+
+/* Provide simple macro statement wrappers (adapted from Perl):
+ * G_STMT_START { statements; } G_STMT_END;
+ * can be used as a single statement, as in
+ * if (x) G_STMT_START { ... } G_STMT_END; else ...
+ *
+ * For gcc we will wrap the statements within `({' and `})' braces.
+ * For SunOS they will be wrapped within `if (1)' and `else (void) 0',
+ * and otherwise within `do' and `while (0)'.
+ */
+#if !(defined (G_STMT_START) && defined (G_STMT_END))
+# if defined (__GNUC__) && !defined (__STRICT_ANSI__) && !defined (__cplusplus)
+# define G_STMT_START (void)(
+# define G_STMT_END )
+# else
+# if (defined (sun) || defined (__sun__))
+# define G_STMT_START if (1)
+# define G_STMT_END else (void)0
+# else
+# define G_STMT_START do
+# define G_STMT_END while (0)
+# endif
+# endif
+#endif
+
+
+/* Provide macros to feature the GCC function attribute.
+ */
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
+#define G_GNUC_PRINTF( format_idx, arg_idx ) \
+ __attribute__((format (printf, format_idx, arg_idx)))
+#define G_GNUC_SCANF( format_idx, arg_idx ) \
+ __attribute__((format (scanf, format_idx, arg_idx)))
+#define G_GNUC_FORMAT( arg_idx ) \
+ __attribute__((format_arg (arg_idx)))
+#define G_GNUC_NORETURN \
+ __attribute__((noreturn))
+#define G_GNUC_CONST \
+ __attribute__((const))
+#define G_GNUC_UNUSED \
+ __attribute__((unused))
+#else /* !__GNUC__ */
+#define G_GNUC_PRINTF( format_idx, arg_idx )
+#define G_GNUC_SCANF( format_idx, arg_idx )
+#define G_GNUC_FORMAT( arg_idx )
+#define G_GNUC_NORETURN
+#define G_GNUC_CONST
+#define G_GNUC_UNUSED
+#endif /* !__GNUC__ */
+
+
+/* Wrap the gcc __PRETTY_FUNCTION__ and __FUNCTION__ variables with
+ * macros, so we can refer to them as strings unconditionally.
+ */
+#ifdef __GNUC__
+#define G_GNUC_FUNCTION __FUNCTION__
+#define G_GNUC_PRETTY_FUNCTION __PRETTY_FUNCTION__
+#else /* !__GNUC__ */
+#define G_GNUC_FUNCTION ""
+#define G_GNUC_PRETTY_FUNCTION ""
+#endif /* !__GNUC__ */
+
+/* we try to provide a usefull equivalent for ATEXIT if it is
+ * not defined, but use is actually abandoned. people should
+ * use g_atexit() instead.
+ */
+#ifndef ATEXIT
+# define ATEXIT(proc) g_ATEXIT(proc)
+#else
+# define G_NATIVE_ATEXIT
+#endif /* ATEXIT */
+
+/* Hacker macro to place breakpoints for elected machines.
+ * Actual use is strongly deprecated of course ;)
+ */
+#if defined (__i386__) && defined (__GNUC__) && __GNUC__ >= 2
+#define G_BREAKPOINT() G_STMT_START{ __asm__ __volatile__ ("int $03"); }G_STMT_END
+#elif defined (__alpha__) && defined (__GNUC__) && __GNUC__ >= 2
+#define G_BREAKPOINT() G_STMT_START{ __asm__ __volatile__ ("bpt"); }G_STMT_END
+#else /* !__i386__ && !__alpha__ */
+#define G_BREAKPOINT()
+#endif /* __i386__ */
+
+
+/* Provide macros for easily allocating memory. The macros
+ * will cast the allocated memory to the specified type
+ * in order to avoid compiler warnings. (Makes the code neater).
+ */
+
+#ifdef __DMALLOC_H__
+# define g_new(type, count) (ALLOC (type, count))
+# define g_new0(type, count) (CALLOC (type, count))
+# define g_renew(type, mem, count) (REALLOC (mem, type, count))
+#else /* __DMALLOC_H__ */
+# define g_new(type, count) \
+ ((type *) g_malloc ((unsigned) sizeof (type) * (count)))
+# define g_new0(type, count) \
+ ((type *) g_malloc0 ((unsigned) sizeof (type) * (count)))
+# define g_renew(type, mem, count) \
+ ((type *) g_realloc (mem, (unsigned) sizeof (type) * (count)))
+#endif /* __DMALLOC_H__ */
+
+#define g_mem_chunk_create(type, pre_alloc, alloc_type) ( \
+ g_mem_chunk_new (#type " mem chunks (" #pre_alloc ")", \
+ sizeof (type), \
+ sizeof (type) * (pre_alloc), \
+ (alloc_type)) \
+)
+#define g_chunk_new(type, chunk) ( \
+ (type *) g_mem_chunk_alloc (chunk) \
+)
+#define g_chunk_new0(type, chunk) ( \
+ (type *) g_mem_chunk_alloc0 (chunk) \
+)
+#define g_chunk_free(mem, mem_chunk) G_STMT_START { \
+ g_mem_chunk_free ((mem_chunk), (mem)); \
+} G_STMT_END
+
+
+#define g_string(x) #x
+
+
+/* Provide macros for error handling. The "assert" macros will
+ * exit on failure. The "return" macros will exit the current
+ * function. Two different definitions are given for the macros
+ * if G_DISABLE_ASSERT is not defined, in order to support gcc's
+ * __PRETTY_FUNCTION__ capability.
+ */
+
+#ifdef G_DISABLE_ASSERT
+
+#define g_assert(expr)
+#define g_assert_not_reached()
+
+#else /* !G_DISABLE_ASSERT */
+
+#ifdef __GNUC__
+
+#define g_assert(expr) G_STMT_START{ \
+ if (!(expr)) \
+ g_log (G_LOG_DOMAIN, \
+ G_LOG_LEVEL_ERROR, \
+ "file %s: line %d (%s): assertion failed: (%s)", \
+ __FILE__, \
+ __LINE__, \
+ __PRETTY_FUNCTION__, \
+ #expr); }G_STMT_END
+
+#define g_assert_not_reached() G_STMT_START{ \
+ g_log (G_LOG_DOMAIN, \
+ G_LOG_LEVEL_ERROR, \
+ "file %s: line %d (%s): should not be reached", \
+ __FILE__, \
+ __LINE__, \
+ __PRETTY_FUNCTION__); }G_STMT_END
+
+#else /* !__GNUC__ */
+
+#define g_assert(expr) G_STMT_START{ \
+ if (!(expr)) \
+ g_log (G_LOG_DOMAIN, \
+ G_LOG_LEVEL_ERROR, \
+ "file %s: line %d: assertion failed: (%s)", \
+ __FILE__, \
+ __LINE__, \
+ #expr); }G_STMT_END
+
+#define g_assert_not_reached() G_STMT_START{ \
+ g_log (G_LOG_DOMAIN, \
+ G_LOG_LEVEL_ERROR, \
+ "file %s: line %d: should not be reached", \
+ __FILE__, \
+ __LINE__); }G_STMT_END
+
+#endif /* __GNUC__ */
+
+#endif /* !G_DISABLE_ASSERT */
+
+
+#ifdef __KORBIT__
+
+#define g_return_if_fail(expr) G_STMT_START{ \
+ if (!(expr)) \
+ { \
+ return; \
+ }; }G_STMT_END
+
+#define g_return_val_if_fail(expr,val) G_STMT_START{ \
+ if (!(expr)) \
+ { \
+ return val; \
+ }; }G_STMT_END
+
+#else /* !__KORBIT__ */
+
+#ifdef G_DISABLE_CHECKS
+
+#define g_return_if_fail(expr)
+#define g_return_val_if_fail(expr,val)
+
+#else /* !G_DISABLE_CHECKS */
+
+#ifdef __GNUC__
+
+#define g_return_if_fail(expr) G_STMT_START{ \
+ if (!(expr)) \
+ { \
+ g_log (G_LOG_DOMAIN, \
+ G_LOG_LEVEL_CRITICAL, \
+ "file %s: line %d (%s): assertion `%s' failed.", \
+ __FILE__, \
+ __LINE__, \
+ __PRETTY_FUNCTION__, \
+ #expr); \
+ return; \
+ }; }G_STMT_END
+
+#define g_return_val_if_fail(expr,val) G_STMT_START{ \
+ if (!(expr)) \
+ { \
+ g_log (G_LOG_DOMAIN, \
+ G_LOG_LEVEL_CRITICAL, \
+ "file %s: line %d (%s): assertion `%s' failed.", \
+ __FILE__, \
+ __LINE__, \
+ __PRETTY_FUNCTION__, \
+ #expr); \
+ return val; \
+ }; }G_STMT_END
+
+#else /* !__GNUC__ */
+
+#define g_return_if_fail(expr) G_STMT_START{ \
+ if (!(expr)) \
+ { \
+ g_log (G_LOG_DOMAIN, \
+ G_LOG_LEVEL_CRITICAL, \
+ "file %s: line %d: assertion `%s' failed.", \
+ __FILE__, \
+ __LINE__, \
+ #expr); \
+ return; \
+ }; }G_STMT_END
+
+#define g_return_val_if_fail(expr, val) G_STMT_START{ \
+ if (!(expr)) \
+ { \
+ g_log (G_LOG_DOMAIN, \
+ G_LOG_LEVEL_CRITICAL, \
+ "file %s: line %d: assertion `%s' failed.", \
+ __FILE__, \
+ __LINE__, \
+ #expr); \
+ return val; \
+ }; }G_STMT_END
+
+#endif /* !__GNUC__ */
+
+#endif /* !G_DISABLE_CHECKS */
+
+#endif /* !__KORBIT__ */
+
+
+/* Provide type definitions for commonly used types.
+ * These are useful because a "gint8" can be adjusted
+ * to be 1 byte (8 bits) on all platforms. Similarly and
+ * more importantly, "gint32" can be adjusted to be
+ * 4 bytes (32 bits) on all platforms.
+ */
+
+typedef char gchar;
+typedef short gshort;
+typedef long glong;
+typedef int gint;
+typedef gint gboolean;
+
+typedef unsigned char guchar;
+typedef unsigned short gushort;
+typedef unsigned long gulong;
+typedef unsigned int guint;
+
+typedef float gfloat;
+typedef double gdouble;
+
+/* HAVE_LONG_DOUBLE doesn't work correctly on all platforms.
+ * Since gldouble isn't used anywhere, just disable it for now */
+
+#if 0
+#ifdef HAVE_LONG_DOUBLE
+typedef long double gldouble;
+#else /* HAVE_LONG_DOUBLE */
+typedef double gldouble;
+#endif /* HAVE_LONG_DOUBLE */
+#endif /* 0 */
+
+typedef void* gpointer;
+typedef const void *gconstpointer;
+
+
+typedef gint32 gssize;
+typedef guint32 gsize;
+typedef guint32 GQuark;
+typedef gint32 GTime;
+
+
+/* Portable endian checks and conversions
+ *
+ * glibconfig.h defines G_BYTE_ORDER which expands to one of
+ * the below macros.
+ */
+#define G_LITTLE_ENDIAN 1234
+#define G_BIG_ENDIAN 4321
+#define G_PDP_ENDIAN 3412 /* unused, need specific PDP check */
+
+
+/* Basic bit swapping functions
+ */
+#define GUINT16_SWAP_LE_BE_CONSTANT(val) ((guint16) ( \
+ (((guint16) (val) & (guint16) 0x00ffU) << 8) | \
+ (((guint16) (val) & (guint16) 0xff00U) >> 8)))
+#define GUINT32_SWAP_LE_BE_CONSTANT(val) ((guint32) ( \
+ (((guint32) (val) & (guint32) 0x000000ffU) << 24) | \
+ (((guint32) (val) & (guint32) 0x0000ff00U) << 8) | \
+ (((guint32) (val) & (guint32) 0x00ff0000U) >> 8) | \
+ (((guint32) (val) & (guint32) 0xff000000U) >> 24)))
+
+/* Intel specific stuff for speed
+ */
+#if defined (__i386__) && defined (__GNUC__) && __GNUC__ >= 2
+# define GUINT16_SWAP_LE_BE_X86(val) \
+ (__extension__ \
+ ({ register guint16 __v; \
+ if (__builtin_constant_p (val)) \
+ __v = GUINT16_SWAP_LE_BE_CONSTANT (val); \
+ else \
+ __asm__ __const__ ("rorw $8, %w0" \
+ : "=r" (__v) \
+ : "0" ((guint16) (val))); \
+ __v; }))
+# define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_X86 (val))
+# if !defined(__i486__) && !defined(__i586__) \
+ && !defined(__pentium__) && !defined(__i686__) && !defined(__pentiumpro__)
+# define GUINT32_SWAP_LE_BE_X86(val) \
+ (__extension__ \
+ ({ register guint32 __v; \
+ if (__builtin_constant_p (val)) \
+ __v = GUINT32_SWAP_LE_BE_CONSTANT (val); \
+ else \
+ __asm__ __const__ ("rorw $8, %w0\n\t" \
+ "rorl $16, %0\n\t" \
+ "rorw $8, %w0" \
+ : "=r" (__v) \
+ : "0" ((guint32) (val))); \
+ __v; }))
+# else /* 486 and higher has bswap */
+# define GUINT32_SWAP_LE_BE_X86(val) \
+ (__extension__ \
+ ({ register guint32 __v; \
+ if (__builtin_constant_p (val)) \
+ __v = GUINT32_SWAP_LE_BE_CONSTANT (val); \
+ else \
+ __asm__ __const__ ("bswap %0" \
+ : "=r" (__v) \
+ : "0" ((guint32) (val))); \
+ __v; }))
+# endif /* processor specific 32-bit stuff */
+# define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_X86 (val))
+#else /* !__i386__ */
+# define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_CONSTANT (val))
+# define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_CONSTANT (val))
+#endif /* __i386__ */
+
+#ifdef G_HAVE_GINT64
+# define GUINT64_SWAP_LE_BE_CONSTANT(val) ((guint64) ( \
+ (((guint64) (val) & \
+ (guint64) G_GINT64_CONSTANT(0x00000000000000ffU)) << 56) | \
+ (((guint64) (val) & \
+ (guint64) G_GINT64_CONSTANT(0x000000000000ff00U)) << 40) | \
+ (((guint64) (val) & \
+ (guint64) G_GINT64_CONSTANT(0x0000000000ff0000U)) << 24) | \
+ (((guint64) (val) & \
+ (guint64) G_GINT64_CONSTANT(0x00000000ff000000U)) << 8) | \
+ (((guint64) (val) & \
+ (guint64) G_GINT64_CONSTANT(0x000000ff00000000U)) >> 8) | \
+ (((guint64) (val) & \
+ (guint64) G_GINT64_CONSTANT(0x0000ff0000000000U)) >> 24) | \
+ (((guint64) (val) & \
+ (guint64) G_GINT64_CONSTANT(0x00ff000000000000U)) >> 40) | \
+ (((guint64) (val) & \
+ (guint64) G_GINT64_CONSTANT(0xff00000000000000U)) >> 56)))
+# if defined (__i386__) && defined (__GNUC__) && __GNUC__ >= 2
+# define GUINT64_SWAP_LE_BE_X86(val) \
+ (__extension__ \
+ ({ union { guint64 __ll; \
+ guint32 __l[2]; } __r; \
+ if (__builtin_constant_p (val)) \
+ __r.__ll = GUINT64_SWAP_LE_BE_CONSTANT (val); \
+ else \
+ { \
+ union { guint64 __ll; \
+ guint32 __l[2]; } __w; \
+ __w.__ll = ((guint64) val); \
+ __r.__l[0] = GUINT32_SWAP_LE_BE (__w.__l[1]); \
+ __r.__l[1] = GUINT32_SWAP_LE_BE (__w.__l[0]); \
+ } \
+ __r.__ll; }))
+# define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_X86 (val))
+# else /* !__i386__ */
+# define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_CONSTANT(val))
+# endif
+#endif
+
+#define GUINT16_SWAP_LE_PDP(val) ((guint16) (val))
+#define GUINT16_SWAP_BE_PDP(val) (GUINT16_SWAP_LE_BE (val))
+#define GUINT32_SWAP_LE_PDP(val) ((guint32) ( \
+ (((guint32) (val) & (guint32) 0x0000ffffU) << 16) | \
+ (((guint32) (val) & (guint32) 0xffff0000U) >> 16)))
+#define GUINT32_SWAP_BE_PDP(val) ((guint32) ( \
+ (((guint32) (val) & (guint32) 0x00ff00ffU) << 8) | \
+ (((guint32) (val) & (guint32) 0xff00ff00U) >> 8)))
+
+/* The G*_TO_?E() macros are defined in glibconfig.h.
+ * The transformation is symmetric, so the FROM just maps to the TO.
+ */
+#define GINT16_FROM_LE(val) (GINT16_TO_LE (val))
+#define GUINT16_FROM_LE(val) (GUINT16_TO_LE (val))
+#define GINT16_FROM_BE(val) (GINT16_TO_BE (val))
+#define GUINT16_FROM_BE(val) (GUINT16_TO_BE (val))
+#define GINT32_FROM_LE(val) (GINT32_TO_LE (val))
+#define GUINT32_FROM_LE(val) (GUINT32_TO_LE (val))
+#define GINT32_FROM_BE(val) (GINT32_TO_BE (val))
+#define GUINT32_FROM_BE(val) (GUINT32_TO_BE (val))
+
+#ifdef G_HAVE_GINT64
+#define GINT64_FROM_LE(val) (GINT64_TO_LE (val))
+#define GUINT64_FROM_LE(val) (GUINT64_TO_LE (val))
+#define GINT64_FROM_BE(val) (GINT64_TO_BE (val))
+#define GUINT64_FROM_BE(val) (GUINT64_TO_BE (val))
+#endif
+
+#define GLONG_FROM_LE(val) (GLONG_TO_LE (val))
+#define GULONG_FROM_LE(val) (GULONG_TO_LE (val))
+#define GLONG_FROM_BE(val) (GLONG_TO_BE (val))
+#define GULONG_FROM_BE(val) (GULONG_TO_BE (val))
+
+#define GINT_FROM_LE(val) (GINT_TO_LE (val))
+#define GUINT_FROM_LE(val) (GUINT_TO_LE (val))
+#define GINT_FROM_BE(val) (GINT_TO_BE (val))
+#define GUINT_FROM_BE(val) (GUINT_TO_BE (val))
+
+
+/* Portable versions of host-network order stuff
+ */
+#define g_ntohl(val) (GUINT32_FROM_BE (val))
+#define g_ntohs(val) (GUINT16_FROM_BE (val))
+#define g_htonl(val) (GUINT32_TO_BE (val))
+#define g_htons(val) (GUINT16_TO_BE (val))
+
+
+/* Glib version.
+ * we prefix variable declarations so they can
+ * properly get exported in windows dlls.
+ */
+#define GUTILS_C_VAR extern
+
+
+GUTILS_C_VAR const guint glib_major_version;
+GUTILS_C_VAR const guint glib_minor_version;
+GUTILS_C_VAR const guint glib_micro_version;
+GUTILS_C_VAR const guint glib_interface_age;
+GUTILS_C_VAR const guint glib_binary_age;
+
+#define GLIB_CHECK_VERSION(major,minor,micro) \
+ (GLIB_MAJOR_VERSION > (major) || \
+ (GLIB_MAJOR_VERSION == (major) && GLIB_MINOR_VERSION > (minor)) || \
+ (GLIB_MAJOR_VERSION == (major) && GLIB_MINOR_VERSION == (minor) && \
+ GLIB_MICRO_VERSION >= (micro)))
+
+/* Forward declarations of glib types.
+ */
+typedef struct _GAllocator GAllocator;
+typedef struct _GArray GArray;
+typedef struct _GByteArray GByteArray;
+typedef struct _GDebugKey GDebugKey;
+typedef struct _GHashTable GHashTable;
+typedef struct _GList GList;
+typedef struct _GMemChunk GMemChunk;
+typedef struct _GNode GNode;
+typedef struct _GPtrArray GPtrArray;
+typedef struct _GSList GSList;
+typedef struct _GString GString;
+typedef struct _GStringChunk GStringChunk;
+typedef struct _GTree GTree;
+typedef struct _GTuples GTuples;
+
+/* Tree traverse flags */
+typedef enum
+{
+ G_TRAVERSE_LEAFS = 1 << 0,
+ G_TRAVERSE_NON_LEAFS = 1 << 1,
+ G_TRAVERSE_ALL = G_TRAVERSE_LEAFS | G_TRAVERSE_NON_LEAFS,
+ G_TRAVERSE_MASK = 0x03
+} GTraverseFlags;
+
+/* Tree traverse orders */
+typedef enum
+{
+ G_IN_ORDER,
+ G_PRE_ORDER,
+ G_POST_ORDER,
+ G_LEVEL_ORDER
+} GTraverseType;
+
+/* Log level shift offset for user defined
+ * log levels (0-7 are used by GLib).
+ */
+#define G_LOG_LEVEL_USER_SHIFT (8)
+
+/* Glib log levels and flags.
+ */
+typedef enum
+{
+ /* log flags */
+ G_LOG_FLAG_RECURSION = 1 << 0,
+ G_LOG_FLAG_FATAL = 1 << 1,
+
+ /* GLib log levels */
+ G_LOG_LEVEL_ERROR = 1 << 2, /* always fatal */
+ G_LOG_LEVEL_CRITICAL = 1 << 3,
+ G_LOG_LEVEL_WARNING = 1 << 4,
+ G_LOG_LEVEL_MESSAGE = 1 << 5,
+ G_LOG_LEVEL_INFO = 1 << 6,
+ G_LOG_LEVEL_DEBUG = 1 << 7,
+
+ G_LOG_LEVEL_MASK = ~(G_LOG_FLAG_RECURSION | G_LOG_FLAG_FATAL)
+} GLogLevelFlags;
+
+/* GLib log levels that are considered fatal by default */
+#define G_LOG_FATAL_MASK (G_LOG_FLAG_RECURSION | G_LOG_LEVEL_ERROR)
+
+
+typedef gint (*GCompareFunc) (gconstpointer a,
+ gconstpointer b);
+typedef gchar* (*GCompletionFunc) (gpointer);
+typedef void (*GDestroyNotify) (gpointer data);
+typedef void (*GDataForeachFunc) (GQuark key_id,
+ gpointer data,
+ gpointer user_data);
+typedef void (*GFunc) (gpointer data,
+ gpointer user_data);
+typedef guint (*GHashFunc) (gconstpointer key);
+typedef void (*GFreeFunc) (gpointer data);
+typedef void (*GHFunc) (gpointer key,
+ gpointer value,
+ gpointer user_data);
+typedef gboolean (*GHRFunc) (gpointer key,
+ gpointer value,
+ gpointer user_data);
+typedef void (*GLogFunc) (const gchar *log_domain,
+ GLogLevelFlags log_level,
+ const gchar *message,
+ gpointer user_data);
+typedef gboolean (*GNodeTraverseFunc) (GNode *node,
+ gpointer data);
+typedef void (*GNodeForeachFunc) (GNode *node,
+ gpointer data);
+typedef gint (*GSearchFunc) (gpointer key,
+ gpointer data);
+typedef gint (*GTraverseFunc) (gpointer key,
+ gpointer value,
+ gpointer data);
+typedef void (*GVoidFunc) (void);
+
+
+struct _GList
+{
+ gpointer data;
+ GList *next;
+ GList *prev;
+};
+
+struct _GSList
+{
+ gpointer data;
+ GSList *next;
+};
+
+struct _GString
+{
+ gchar *str;
+ gint len;
+};
+
+struct _GArray
+{
+ gchar *data;
+ guint len;
+};
+
+struct _GByteArray
+{
+ guint8 *data;
+ guint len;
+};
+
+struct _GPtrArray
+{
+ gpointer *pdata;
+ guint len;
+};
+
+struct _GTuples
+{
+ guint len;
+};
+
+struct _GDebugKey
+{
+ gchar *key;
+ guint value;
+};
+
+
+/* Doubly linked lists
+ */
+void g_list_push_allocator (GAllocator *allocator);
+void g_list_pop_allocator (void);
+GList* g_list_alloc (void);
+void g_list_free (GList *list);
+void g_list_free_1 (GList *list);
+GList* g_list_append (GList *list,
+ gpointer data);
+GList* g_list_prepend (GList *list,
+ gpointer data);
+GList* g_list_insert (GList *list,
+ gpointer data,
+ gint position);
+GList* g_list_insert_sorted (GList *list,
+ gpointer data,
+ GCompareFunc func);
+GList* g_list_concat (GList *list1,
+ GList *list2);
+GList* g_list_remove (GList *list,
+ gpointer data);
+GList* g_list_remove_link (GList *list,
+ GList *llink);
+GList* g_list_reverse (GList *list);
+GList* g_list_copy (GList *list);
+GList* g_list_nth (GList *list,
+ guint n);
+GList* g_list_find (GList *list,
+ gpointer data);
+GList* g_list_find_custom (GList *list,
+ gpointer data,
+ GCompareFunc func);
+gint g_list_position (GList *list,
+ GList *llink);
+gint g_list_index (GList *list,
+ gpointer data);
+GList* g_list_last (GList *list);
+GList* g_list_first (GList *list);
+guint g_list_length (GList *list);
+void g_list_foreach (GList *list,
+ GFunc func,
+ gpointer user_data);
+GList* g_list_sort (GList *list,
+ GCompareFunc compare_func);
+gpointer g_list_nth_data (GList *list,
+ guint n);
+#define g_list_previous(list) ((list) ? (((GList *)(list))->prev) : NULL)
+#define g_list_next(list) ((list) ? (((GList *)(list))->next) : NULL)
+
+
+/* Singly linked lists
+ */
+void g_slist_push_allocator (GAllocator *allocator);
+void g_slist_pop_allocator (void);
+GSList* g_slist_alloc (void);
+void g_slist_free (GSList *list);
+void g_slist_free_1 (GSList *list);
+GSList* g_slist_append (GSList *list,
+ gpointer data);
+GSList* g_slist_prepend (GSList *list,
+ gpointer data);
+GSList* g_slist_insert (GSList *list,
+ gpointer data,
+ gint position);
+GSList* g_slist_insert_sorted (GSList *list,
+ gpointer data,
+ GCompareFunc func);
+GSList* g_slist_concat (GSList *list1,
+ GSList *list2);
+GSList* g_slist_remove (GSList *list,
+ gpointer data);
+GSList* g_slist_remove_link (GSList *list,
+ GSList *llink);
+GSList* g_slist_reverse (GSList *list);
+GSList* g_slist_copy (GSList *list);
+GSList* g_slist_nth (GSList *list,
+ guint n);
+GSList* g_slist_find (GSList *list,
+ gpointer data);
+GSList* g_slist_find_custom (GSList *list,
+ gpointer data,
+ GCompareFunc func);
+gint g_slist_position (GSList *list,
+ GSList *llink);
+gint g_slist_index (GSList *list,
+ gpointer data);
+GSList* g_slist_last (GSList *list);
+guint g_slist_length (GSList *list);
+void g_slist_foreach (GSList *list,
+ GFunc func,
+ gpointer user_data);
+GSList* g_slist_sort (GSList *list,
+ GCompareFunc compare_func);
+gpointer g_slist_nth_data (GSList *list,
+ guint n);
+#define g_slist_next(slist) ((slist) ? (((GSList *)(slist))->next) : NULL)
+
+
+/* Hash tables
+ */
+GHashTable* g_hash_table_new (GHashFunc hash_func,
+ GCompareFunc key_compare_func);
+void g_hash_table_destroy (GHashTable *hash_table);
+void g_hash_table_insert (GHashTable *hash_table,
+ gpointer key,
+ gpointer value);
+void g_hash_table_remove (GHashTable *hash_table,
+ gconstpointer key);
+gpointer g_hash_table_lookup (GHashTable *hash_table,
+ gconstpointer key);
+gboolean g_hash_table_lookup_extended(GHashTable *hash_table,
+ gconstpointer lookup_key,
+ gpointer *orig_key,
+ gpointer *value);
+void g_hash_table_freeze (GHashTable *hash_table);
+void g_hash_table_thaw (GHashTable *hash_table);
+void g_hash_table_foreach (GHashTable *hash_table,
+ GHFunc func,
+ gpointer user_data);
+guint g_hash_table_foreach_remove (GHashTable *hash_table,
+ GHRFunc func,
+ gpointer user_data);
+guint g_hash_table_size (GHashTable *hash_table);
+
+
+
+
+/* Balanced binary trees
+ */
+GTree* g_tree_new (GCompareFunc key_compare_func);
+void g_tree_destroy (GTree *tree);
+void g_tree_insert (GTree *tree,
+ gpointer key,
+ gpointer value);
+void g_tree_remove (GTree *tree,
+ gpointer key);
+gpointer g_tree_lookup (GTree *tree,
+ gpointer key);
+void g_tree_traverse (GTree *tree,
+ GTraverseFunc traverse_func,
+ GTraverseType traverse_type,
+ gpointer data);
+gpointer g_tree_search (GTree *tree,
+ GSearchFunc search_func,
+ gpointer data);
+gint g_tree_height (GTree *tree);
+gint g_tree_nnodes (GTree *tree);
+
+
+
+/* N-way tree implementation
+ */
+struct _GNode
+{
+ gpointer data;
+ GNode *next;
+ GNode *prev;
+ GNode *parent;
+ GNode *children;
+};
+
+#define G_NODE_IS_ROOT(node) (((GNode*) (node))->parent == NULL && \
+ ((GNode*) (node))->prev == NULL && \
+ ((GNode*) (node))->next == NULL)
+#define G_NODE_IS_LEAF(node) (((GNode*) (node))->children == NULL)
+
+void g_node_push_allocator (GAllocator *allocator);
+void g_node_pop_allocator (void);
+GNode* g_node_new (gpointer data);
+void g_node_destroy (GNode *root);
+void g_node_unlink (GNode *node);
+GNode* g_node_insert (GNode *parent,
+ gint position,
+ GNode *node);
+GNode* g_node_insert_before (GNode *parent,
+ GNode *sibling,
+ GNode *node);
+GNode* g_node_prepend (GNode *parent,
+ GNode *node);
+guint g_node_n_nodes (GNode *root,
+ GTraverseFlags flags);
+GNode* g_node_get_root (GNode *node);
+gboolean g_node_is_ancestor (GNode *node,
+ GNode *descendant);
+guint g_node_depth (GNode *node);
+GNode* g_node_find (GNode *root,
+ GTraverseType order,
+ GTraverseFlags flags,
+ gpointer data);
+
+/* convenience macros */
+#define g_node_append(parent, node) \
+ g_node_insert_before ((parent), NULL, (node))
+#define g_node_insert_data(parent, position, data) \
+ g_node_insert ((parent), (position), g_node_new (data))
+#define g_node_insert_data_before(parent, sibling, data) \
+ g_node_insert_before ((parent), (sibling), g_node_new (data))
+#define g_node_prepend_data(parent, data) \
+ g_node_prepend ((parent), g_node_new (data))
+#define g_node_append_data(parent, data) \
+ g_node_insert_before ((parent), NULL, g_node_new (data))
+
+/* traversal function, assumes that `node' is root
+ * (only traverses `node' and its subtree).
+ * this function is just a high level interface to
+ * low level traversal functions, optimized for speed.
+ */
+void g_node_traverse (GNode *root,
+ GTraverseType order,
+ GTraverseFlags flags,
+ gint max_depth,
+ GNodeTraverseFunc func,
+ gpointer data);
+
+/* return the maximum tree height starting with `node', this is an expensive
+ * operation, since we need to visit all nodes. this could be shortened by
+ * adding `guint height' to struct _GNode, but then again, this is not very
+ * often needed, and would make g_node_insert() more time consuming.
+ */
+guint g_node_max_height (GNode *root);
+
+void g_node_children_foreach (GNode *node,
+ GTraverseFlags flags,
+ GNodeForeachFunc func,
+ gpointer data);
+void g_node_reverse_children (GNode *node);
+guint g_node_n_children (GNode *node);
+GNode* g_node_nth_child (GNode *node,
+ guint n);
+GNode* g_node_last_child (GNode *node);
+GNode* g_node_find_child (GNode *node,
+ GTraverseFlags flags,
+ gpointer data);
+gint g_node_child_position (GNode *node,
+ GNode *child);
+gint g_node_child_index (GNode *node,
+ gpointer data);
+
+GNode* g_node_first_sibling (GNode *node);
+GNode* g_node_last_sibling (GNode *node);
+
+#define g_node_prev_sibling(node) ((node) ? \
+ ((GNode*) (node))->prev : NULL)
+#define g_node_next_sibling(node) ((node) ? \
+ ((GNode*) (node))->next : NULL)
+#define g_node_first_child(node) ((node) ? \
+ ((GNode*) (node))->children : NULL)
+
+
+
+/* Fatal error handlers.
+ * g_on_error_query() will prompt the user to either
+ * [E]xit, [H]alt, [P]roceed or show [S]tack trace.
+ * g_on_error_stack_trace() invokes gdb, which attaches to the current
+ * process and shows a stack trace.
+ * These function may cause different actions on non-unix platforms.
+ * The prg_name arg is required by gdb to find the executable, if it is
+ * passed as NULL, g_on_error_query() will try g_get_prgname().
+ */
+void g_on_error_query (const gchar *prg_name);
+void g_on_error_stack_trace (const gchar *prg_name);
+
+
+/* Logging mechanism
+ */
+extern const gchar *g_log_domain_glib;
+guint g_log_set_handler (const gchar *log_domain,
+ GLogLevelFlags log_levels,
+ GLogFunc log_func,
+ gpointer user_data);
+void g_log_remove_handler (const gchar *log_domain,
+ guint handler_id);
+void g_log_default_handler (const gchar *log_domain,
+ GLogLevelFlags log_level,
+ const gchar *message,
+ gpointer unused_data);
+#ifdef __KORBIT__
+#define g_log(log_domain, log_level, format, args...) \
+G_STMT_START { printf(format, ##args); printf("\n"); } G_STMT_END
+#define g_logv(log_domain, log_level, format, args...)
+#else /* !__KORBIT__ */
+void g_log (const gchar *log_domain,
+ GLogLevelFlags log_level,
+ const gchar *format,
+ ...) G_GNUC_PRINTF (3, 4);
+void g_logv (const gchar *log_domain,
+ GLogLevelFlags log_level,
+ const gchar *format,
+ va_list args);
+#endif /* !__KORBIT__ */
+GLogLevelFlags g_log_set_fatal_mask (const gchar *log_domain,
+ GLogLevelFlags fatal_mask);
+GLogLevelFlags g_log_set_always_fatal (GLogLevelFlags fatal_mask);
+#ifndef G_LOG_DOMAIN
+#define G_LOG_DOMAIN ((gchar*) 0)
+#endif /* G_LOG_DOMAIN */
+#ifdef __GNUC__
+#define g_error(format, args...) g_log (G_LOG_DOMAIN, \
+ G_LOG_LEVEL_ERROR, \
+ format, ##args)
+#define g_message(format, args...) g_log (G_LOG_DOMAIN, \
+ G_LOG_LEVEL_MESSAGE, \
+ format, ##args)
+#define g_warning(format, args...) g_log (G_LOG_DOMAIN, \
+ G_LOG_LEVEL_WARNING, \
+ format, ##args)
+#else /* !__GNUC__ */
+static void
+g_error (const gchar *format,
+ ...)
+{
+ va_list args;
+ va_start (args, format);
+ g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_ERROR, format, args);
+ va_end (args);
+}
+static void
+g_message (const gchar *format,
+ ...)
+{
+ va_list args;
+ va_start (args, format);
+ g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE, format, args);
+ va_end (args);
+}
+static void
+g_warning (const gchar *format,
+ ...)
+{
+ va_list args;
+ va_start (args, format);
+ g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, format, args);
+ va_end (args);
+}
+#endif /* !__GNUC__ */
+
+typedef void (*GPrintFunc) (const gchar *string);
+#ifdef __KORBIT__
+#define g_print(format, args...) printf(format, ##args)
+#else
+void g_print (const gchar *format,
+ ...) G_GNUC_PRINTF (1, 2);
+#endif
+GPrintFunc g_set_print_handler (GPrintFunc func);
+void g_printerr (const gchar *format,
+ ...) G_GNUC_PRINTF (1, 2);
+GPrintFunc g_set_printerr_handler (GPrintFunc func);
+
+/* deprecated compatibility functions, use g_log_set_handler() instead */
+typedef void (*GErrorFunc) (const gchar *str);
+typedef void (*GWarningFunc) (const gchar *str);
+GErrorFunc g_set_error_handler (GErrorFunc func);
+GWarningFunc g_set_warning_handler (GWarningFunc func);
+GPrintFunc g_set_message_handler (GPrintFunc func);
+
+
+gpointer g_malloc (gulong size);
+gpointer g_malloc0 (gulong size);
+gpointer g_realloc (gpointer mem,
+ gulong size);
+void g_free (gpointer mem);
+
+/* Generic allocators
+ */
+GAllocator* g_allocator_new (const gchar *name,
+ guint n_preallocs);
+void g_allocator_free (GAllocator *allocator);
+
+#define G_ALLOCATOR_LIST (1)
+#define G_ALLOCATOR_SLIST (2)
+#define G_ALLOCATOR_NODE (3)
+
+
+/* "g_mem_chunk_new" creates a new memory chunk.
+ * Memory chunks are used to allocate pieces of memory which are
+ * always the same size. Lists are a good example of such a data type.
+ * The memory chunk allocates and frees blocks of memory as needed.
+ * Just be sure to call "g_mem_chunk_free" and not "g_free" on data
+ * allocated in a mem chunk. ("g_free" will most likely cause a seg
+ * fault...somewhere).
+ *
+ * Oh yeah, GMemChunk is an opaque data type. (You don't really
+ * want to know what's going on inside do you?)
+ */
+
+/* ALLOC_ONLY MemChunk's can only allocate memory. The free operation
+ * is interpreted as a no op. ALLOC_ONLY MemChunk's save 4 bytes per
+ * atom. (They are also useful for lists which use MemChunk to allocate
+ * memory but are also part of the MemChunk implementation).
+ * ALLOC_AND_FREE MemChunk's can allocate and free memory.
+ */
+
+#define G_ALLOC_ONLY 1
+#define G_ALLOC_AND_FREE 2
+
+GMemChunk* g_mem_chunk_new (gchar *name,
+ gint atom_size,
+ gulong area_size,
+ gint type);
+void g_mem_chunk_destroy (GMemChunk *mem_chunk);
+gpointer g_mem_chunk_alloc (GMemChunk *mem_chunk);
+gpointer g_mem_chunk_alloc0 (GMemChunk *mem_chunk);
+void g_mem_chunk_free (GMemChunk *mem_chunk,
+ gpointer mem);
+void g_mem_chunk_clean (GMemChunk *mem_chunk);
+void g_mem_chunk_reset (GMemChunk *mem_chunk);
+void g_mem_chunk_print (GMemChunk *mem_chunk);
+void g_mem_chunk_info (void);
+
+/* Ah yes...we have a "g_blow_chunks" function.
+ * "g_blow_chunks" simply compresses all the chunks. This operation
+ * consists of freeing every memory area that should be freed (but
+ * which we haven't gotten around to doing yet). And, no,
+ * "g_blow_chunks" doesn't follow the naming scheme, but it is a
+ * much better name than "g_mem_chunk_clean_all" or something
+ * similar.
+ */
+void g_blow_chunks (void);
+
+
+/* String utility functions that modify a string argument or
+ * return a constant string that must not be freed.
+ */
+#define G_STR_DELIMITERS "_-|> <."
+gchar* g_strdelimit (gchar *string,
+ const gchar *delimiters,
+ gchar new_delimiter);
+#ifndef __KORBIT__
+gdouble g_strtod (const gchar *nptr,
+ gchar **endptr);
+#endif /* !__KORBIT__ */
+gchar* g_strerror (gint errnum);
+gchar* g_strsignal (gint signum);
+gint g_strcasecmp (const gchar *s1,
+ const gchar *s2);
+gint g_strncasecmp (const gchar *s1,
+ const gchar *s2,
+ guint n);
+void g_strdown (gchar *string);
+void g_strup (gchar *string);
+void g_strreverse (gchar *string);
+/* removes leading spaces */
+gchar* g_strchug (gchar *string);
+/* removes trailing spaces */
+gchar* g_strchomp (gchar *string);
+/* removes leading & trailing spaces */
+#define g_strstrip( string ) g_strchomp (g_strchug (string))
+
+/* String utility functions that return a newly allocated string which
+ * ought to be freed from the caller at some point.
+ */
+gchar* g_strdup (const gchar *str);
+gchar* g_strdup_printf (const gchar *format,
+ ...) G_GNUC_PRINTF (1, 2);
+gchar* g_strdup_vprintf (const gchar *format,
+ va_list args);
+gchar* g_strndup (const gchar *str,
+ guint n);
+gchar* g_strnfill (guint length,
+ gchar fill_char);
+gchar* g_strconcat (const gchar *string1,
+ ...); /* NULL terminated */
+gchar* g_strjoin (const gchar *separator,
+ ...); /* NULL terminated */
+gchar* g_strescape (gchar *string);
+gpointer g_memdup (gconstpointer mem,
+ guint byte_size);
+
+/* NULL terminated string arrays.
+ * g_strsplit() splits up string into max_tokens tokens at delim and
+ * returns a newly allocated string array.
+ * g_strjoinv() concatenates all of str_array's strings, sliding in an
+ * optional separator, the returned string is newly allocated.
+ * g_strfreev() frees the array itself and all of its strings.
+ */
+gchar** g_strsplit (const gchar *string,
+ const gchar *delimiter,
+ gint max_tokens);
+gchar* g_strjoinv (const gchar *separator,
+ gchar **str_array);
+void g_strfreev (gchar **str_array);
+
+
+
+/* calculate a string size, guarranteed to fit format + args.
+ */
+guint g_printf_string_upper_bound (const gchar* format,
+ va_list args);
+
+
+/* Retrive static string info
+ */
+gchar* g_get_user_name (void);
+gchar* g_get_real_name (void);
+gchar* g_get_home_dir (void);
+gchar* g_get_tmp_dir (void);
+gchar* g_get_prgname (void);
+void g_set_prgname (const gchar *prgname);
+
+
+/* Miscellaneous utility functions
+ */
+guint g_parse_debug_string (const gchar *string,
+ GDebugKey *keys,
+ guint nkeys);
+gint g_snprintf (gchar *string,
+ gulong n,
+ gchar const *format,
+ ...) G_GNUC_PRINTF (3, 4);
+gint g_vsnprintf (gchar *string,
+ gulong n,
+ gchar const *format,
+ va_list args);
+gchar* g_basename (const gchar *file_name);
+/* Check if a file name is an absolute path */
+gboolean g_path_is_absolute (const gchar *file_name);
+/* In case of absolute paths, skip the root part */
+gchar* g_path_skip_root (gchar *file_name);
+
+/* strings are newly allocated with g_malloc() */
+gchar* g_dirname (const gchar *file_name);
+gchar* g_get_current_dir (void);
+gchar* g_getenv (const gchar *variable);
+
+
+/* we use a GLib function as a replacement for ATEXIT, so
+ * the programmer is not required to check the return value
+ * (if there is any in the implementation) and doesn't encounter
+ * missing include files.
+ */
+void g_atexit (GVoidFunc func);
+
+
+/* Bit tests
+ */
+G_INLINE_FUNC gint g_bit_nth_lsf (guint32 mask,
+ gint nth_bit);
+#ifdef G_CAN_INLINE
+G_INLINE_FUNC gint
+g_bit_nth_lsf (guint32 mask,
+ gint nth_bit)
+{
+ do
+ {
+ nth_bit++;
+ if (mask & (1 << (guint) nth_bit))
+ return nth_bit;
+ }
+ while (nth_bit < 32);
+ return -1;
+}
+#endif /* G_CAN_INLINE */
+
+G_INLINE_FUNC gint g_bit_nth_msf (guint32 mask,
+ gint nth_bit);
+#ifdef G_CAN_INLINE
+G_INLINE_FUNC gint
+g_bit_nth_msf (guint32 mask,
+ gint nth_bit)
+{
+ if (nth_bit < 0)
+ nth_bit = 32;
+ do
+ {
+ nth_bit--;
+ if (mask & (1 << (guint) nth_bit))
+ return nth_bit;
+ }
+ while (nth_bit > 0);
+ return -1;
+}
+#endif /* G_CAN_INLINE */
+
+G_INLINE_FUNC guint g_bit_storage (guint number);
+#ifdef G_CAN_INLINE
+G_INLINE_FUNC guint
+g_bit_storage (guint number)
+{
+ register guint n_bits = 0;
+
+ do
+ {
+ n_bits++;
+ number >>= 1;
+ }
+ while (number);
+ return n_bits;
+}
+#endif /* G_CAN_INLINE */
+
+/* String Chunks
+ */
+GStringChunk* g_string_chunk_new (gint size);
+void g_string_chunk_free (GStringChunk *chunk);
+gchar* g_string_chunk_insert (GStringChunk *chunk,
+ const gchar *string);
+gchar* g_string_chunk_insert_const (GStringChunk *chunk,
+ const gchar *string);
+
+
+/* Strings
+ */
+GString* g_string_new (const gchar *init);
+GString* g_string_sized_new (guint dfl_size);
+void g_string_free (GString *string,
+ gint free_segment);
+GString* g_string_assign (GString *lval,
+ const gchar *rval);
+GString* g_string_truncate (GString *string,
+ gint len);
+GString* g_string_append (GString *string,
+ const gchar *val);
+GString* g_string_append_c (GString *string,
+ gchar c);
+GString* g_string_prepend (GString *string,
+ const gchar *val);
+GString* g_string_prepend_c (GString *string,
+ gchar c);
+GString* g_string_insert (GString *string,
+ gint pos,
+ const gchar *val);
+GString* g_string_insert_c (GString *string,
+ gint pos,
+ gchar c);
+GString* g_string_erase (GString *string,
+ gint pos,
+ gint len);
+GString* g_string_down (GString *string);
+GString* g_string_up (GString *string);
+void g_string_sprintf (GString *string,
+ const gchar *format,
+ ...) G_GNUC_PRINTF (2, 3);
+void g_string_sprintfa (GString *string,
+ const gchar *format,
+ ...) G_GNUC_PRINTF (2, 3);
+
+
+/* Resizable arrays, remove fills any cleared spot and shortens the
+ * array, while preserving the order. remove_fast will distort the
+ * order by moving the last element to the position of the removed
+ */
+
+#define g_array_append_val(a,v) g_array_append_vals (a, &v, 1)
+#define g_array_prepend_val(a,v) g_array_prepend_vals (a, &v, 1)
+#define g_array_insert_val(a,i,v) g_array_insert_vals (a, i, &v, 1)
+#define g_array_index(a,t,i) (((t*) (a)->data) [(i)])
+
+GArray* g_array_new (gboolean zero_terminated,
+ gboolean clear,
+ guint element_size);
+void g_array_free (GArray *array,
+ gboolean free_segment);
+GArray* g_array_append_vals (GArray *array,
+ gconstpointer data,
+ guint len);
+GArray* g_array_prepend_vals (GArray *array,
+ gconstpointer data,
+ guint len);
+GArray* g_array_insert_vals (GArray *array,
+ guint index,
+ gconstpointer data,
+ guint len);
+GArray* g_array_set_size (GArray *array,
+ guint length);
+GArray* g_array_remove_index (GArray *array,
+ guint index);
+GArray* g_array_remove_index_fast (GArray *array,
+ guint index);
+
+/* Resizable pointer array. This interface is much less complicated
+ * than the above. Add appends appends a pointer. Remove fills any
+ * cleared spot and shortens the array. remove_fast will again distort
+ * order.
+ */
+#define g_ptr_array_index(array,index) (array->pdata)[index]
+GPtrArray* g_ptr_array_new (void);
+void g_ptr_array_free (GPtrArray *array,
+ gboolean free_seg);
+void g_ptr_array_set_size (GPtrArray *array,
+ gint length);
+gpointer g_ptr_array_remove_index (GPtrArray *array,
+ guint index);
+gpointer g_ptr_array_remove_index_fast (GPtrArray *array,
+ guint index);
+gboolean g_ptr_array_remove (GPtrArray *array,
+ gpointer data);
+gboolean g_ptr_array_remove_fast (GPtrArray *array,
+ gpointer data);
+void g_ptr_array_add (GPtrArray *array,
+ gpointer data);
+
+/* Hash Functions
+ */
+gint g_str_equal (gconstpointer v,
+ gconstpointer v2);
+guint g_str_hash (gconstpointer v);
+
+gint g_int_equal (gconstpointer v,
+ gconstpointer v2);
+guint g_int_hash (gconstpointer v);
+
+/* This "hash" function will just return the key's adress as an
+ * unsigned integer. Useful for hashing on plain adresses or
+ * simple integer values.
+ * passing NULL into g_hash_table_new() as GHashFunc has the
+ * same effect as passing g_direct_hash().
+ */
+guint g_direct_hash (gconstpointer v);
+gint g_direct_equal (gconstpointer v,
+ gconstpointer v2);
+
+
+
+/* Prime numbers.
+ */
+
+/* This function returns prime numbers spaced by approximately 1.5-2.0
+ * and is for use in resizing data structures which prefer
+ * prime-valued sizes. The closest spaced prime function returns the
+ * next largest prime, or the highest it knows about which is about
+ * MAXINT/4.
+ */
+guint g_spaced_primes_closest (guint num);
+
+
+
+#ifndef __KORBIT__
+/* GLib Thread support
+ */
+typedef struct _GMutex GMutex;
+typedef struct _GCond GCond;
+typedef struct _GPrivate GPrivate;
+typedef struct _GStaticPrivate GStaticPrivate;
+typedef struct _GThreadFunctions GThreadFunctions;
+struct _GThreadFunctions
+{
+ GMutex* (*mutex_new) (void);
+ void (*mutex_lock) (GMutex *mutex);
+ gboolean (*mutex_trylock) (GMutex *mutex);
+ void (*mutex_unlock) (GMutex *mutex);
+ void (*mutex_free) (GMutex *mutex);
+ GCond* (*cond_new) (void);
+ void (*cond_signal) (GCond *cond);
+ void (*cond_broadcast) (GCond *cond);
+ void (*cond_wait) (GCond *cond,
+ GMutex *mutex);
+ gboolean (*cond_timed_wait) (GCond *cond,
+ GMutex *mutex,
+ GTimeVal *end_time);
+ void (*cond_free) (GCond *cond);
+ GPrivate* (*private_new) (GDestroyNotify destructor);
+ gpointer (*private_get) (GPrivate *private_key);
+ void (*private_set) (GPrivate *private_key,
+ gpointer data);
+};
+
+GUTILS_C_VAR GThreadFunctions g_thread_functions_for_glib_use;
+GUTILS_C_VAR gboolean g_thread_use_default_impl;
+GUTILS_C_VAR gboolean g_threads_got_initialized;
+
+/* initializes the mutex/cond/private implementation for glib, might
+ * only be called once, and must not be called directly or indirectly
+ * from another glib-function, e.g. as a callback.
+ */
+void g_thread_init (GThreadFunctions *vtable);
+
+/* internal function for fallback static mutex implementation */
+GMutex* g_static_mutex_get_mutex_impl (GMutex **mutex);
+
+/* shorthands for conditional and unconditional function calls */
+#define G_THREAD_UF(name, arglist) \
+ (*g_thread_functions_for_glib_use . name) arglist
+#define G_THREAD_CF(name, fail, arg) \
+ (g_thread_supported () ? G_THREAD_UF (name, arg) : (fail))
+/* keep in mind, all those mutexes and static mutexes are not
+ * recursive in general, don't rely on that
+ */
+#define g_thread_supported() (g_threads_got_initialized)
+#define g_mutex_new() G_THREAD_UF (mutex_new, ())
+#define g_mutex_lock(mutex) G_THREAD_CF (mutex_lock, (void)0, (mutex))
+#define g_mutex_trylock(mutex) G_THREAD_CF (mutex_trylock, TRUE, (mutex))
+#define g_mutex_unlock(mutex) G_THREAD_CF (mutex_unlock, (void)0, (mutex))
+#define g_mutex_free(mutex) G_THREAD_CF (mutex_free, (void)0, (mutex))
+#define g_cond_new() G_THREAD_UF (cond_new, ())
+#define g_cond_signal(cond) G_THREAD_CF (cond_signal, (void)0, (cond))
+#define g_cond_broadcast(cond) G_THREAD_CF (cond_broadcast, (void)0, (cond))
+#define g_cond_wait(cond, mutex) G_THREAD_CF (cond_wait, (void)0, (cond, \
+ mutex))
+#define g_cond_free(cond) G_THREAD_CF (cond_free, (void)0, (cond))
+#define g_cond_timed_wait(cond, mutex, abs_time) G_THREAD_CF (cond_timed_wait, \
+ TRUE, \
+ (cond, mutex, \
+ abs_time))
+#define g_private_new(destructor) G_THREAD_UF (private_new, (destructor))
+#define g_private_get(private_key) G_THREAD_CF (private_get, \
+ ((gpointer)private_key), \
+ (private_key))
+#define g_private_set(private_key, value) G_THREAD_CF (private_set, \
+ (void) (private_key = \
+ (GPrivate*) (value)), \
+ (private_key, value))
+/* GStaticMutexes can be statically initialized with the value
+ * G_STATIC_MUTEX_INIT, and then they can directly be used, that is
+ * much easier, than having to explicitly allocate the mutex before
+ * use
+ */
+#define g_static_mutex_lock(mutex) \
+ g_mutex_lock (g_static_mutex_get_mutex (mutex))
+#define g_static_mutex_trylock(mutex) \
+ g_mutex_trylock (g_static_mutex_get_mutex (mutex))
+#define g_static_mutex_unlock(mutex) \
+ g_mutex_unlock (g_static_mutex_get_mutex (mutex))
+struct _GStaticPrivate
+{
+ guint index;
+};
+#define G_STATIC_PRIVATE_INIT { 0 }
+gpointer g_static_private_get (GStaticPrivate *private_key);
+void g_static_private_set (GStaticPrivate *private_key,
+ gpointer data,
+ GDestroyNotify notify);
+#endif /* __KORBIT__ */
+
+/* these are some convenience macros that expand to nothing if GLib
+ * was configured with --disable-threads. for using StaticMutexes,
+ * you define them with G_LOCK_DEFINE_STATIC (name) or G_LOCK_DEFINE (name)
+ * if you need to export the mutex. With G_LOCK_EXTERN (name) you can
+ * declare such an globally defined lock. name is a unique identifier
+ * for the protected varibale or code portion. locking, testing and
+ * unlocking of such mutexes can be done with G_LOCK(), G_UNLOCK() and
+ * G_TRYLOCK() respectively.
+ */
+#ifdef __KORBIT__
+#undef G_THREADS_ENABLED
+#endif
+
+extern void glib_dummy_decl (void);
+#define G_LOCK_NAME(name) (g__ ## name ## _lock)
+#ifdef G_THREADS_ENABLED
+# define G_LOCK_DEFINE_STATIC(name) static G_LOCK_DEFINE (name)
+# define G_LOCK_DEFINE(name) \
+ GStaticMutex G_LOCK_NAME (name) = G_STATIC_MUTEX_INIT
+# define G_LOCK_EXTERN(name) extern GStaticMutex G_LOCK_NAME (name)
+
+# define G_LOCK(name) g_static_mutex_lock (&G_LOCK_NAME (name))
+# define G_UNLOCK(name) g_static_mutex_unlock (&G_LOCK_NAME (name))
+# define G_TRYLOCK(name) g_static_mutex_trylock (&G_LOCK_NAME (name))
+#else /* !G_THREADS_ENABLED */
+# define G_LOCK_DEFINE_STATIC(name) extern void glib_dummy_decl (void)
+# define G_LOCK_DEFINE(name) extern void glib_dummy_decl (void)
+# define G_LOCK_EXTERN(name) extern void glib_dummy_decl (void)
+# define G_LOCK(name)
+# define G_UNLOCK(name)
+# define G_TRYLOCK(name) (FALSE)
+#endif /* !G_THREADS_ENABLED */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+#endif /* __G_LIB_H__ */
diff -urN linux-2.4.1/net/korbit/kglib/glibconfig.h linux-2.4.1-korbit/net/korbit/kglib/glibconfig.h
--- linux-2.4.1/net/korbit/kglib/glibconfig.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/kglib/glibconfig.h Thu Feb 1 11:46:56 2001
@@ -0,0 +1,131 @@
+/* glibconfig.h
+ *
+ * This is a generated file. Please modify `configure.in'
+ */
+
+#ifndef GLIBCONFIG_H
+#define GLIBCONFIG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include <limits.h>
+/*#include <float.h>*/
+#define GLIB_HAVE_SYS_POLL_H
+
+#define G_MINFLOAT FLT_MIN
+#define G_MAXFLOAT FLT_MAX
+#define G_MINDOUBLE DBL_MIN
+#define G_MAXDOUBLE DBL_MAX
+#define G_MINSHORT SHRT_MIN
+#define G_MAXSHORT SHRT_MAX
+#define G_MININT INT_MIN
+#define G_MAXINT INT_MAX
+#define G_MINLONG LONG_MIN
+#define G_MAXLONG LONG_MAX
+
+typedef signed char gint8;
+typedef unsigned char guint8;
+typedef signed short gint16;
+typedef unsigned short guint16;
+typedef signed int gint32;
+typedef unsigned int guint32;
+
+#if defined (__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8))
+# define G_GNUC_EXTENSION __extension__
+#else
+# define G_GNUC_EXTENSION
+#endif
+
+#define G_HAVE_GINT64 1
+
+G_GNUC_EXTENSION typedef signed long long gint64;
+G_GNUC_EXTENSION typedef unsigned long long guint64;
+
+#define G_GINT64_CONSTANT(val) (G_GNUC_EXTENSION (val##LL))
+
+#define GPOINTER_TO_INT(p) ((gint) (p))
+#define GPOINTER_TO_UINT(p) ((guint) (p))
+
+#define GINT_TO_POINTER(i) ((gpointer) (i))
+#define GUINT_TO_POINTER(u) ((gpointer) (u))
+
+#ifdef NeXT /* @#%@! NeXTStep */
+# define g_ATEXIT(proc) (!atexit (proc))
+#else
+# define g_ATEXIT(proc) (atexit (proc))
+#endif
+
+#define g_memmove(d,s,n) G_STMT_START { memmove ((d), (s), (n)); } G_STMT_END
+
+#define GLIB_MAJOR_VERSION 1
+#define GLIB_MINOR_VERSION 2
+#define GLIB_MICRO_VERSION 8
+
+
+#define G_VA_COPY __va_copy
+
+#ifdef __cplusplus
+#define G_HAVE_INLINE 1
+#else /* !__cplusplus */
+#define G_HAVE_INLINE 1
+#define G_HAVE___INLINE 1
+#define G_HAVE___INLINE__ 1
+#endif /* !__cplusplus */
+
+#define G_THREADS_ENABLED
+#define G_THREADS_IMPL_POSIX
+typedef struct _GStaticMutex GStaticMutex;
+struct _GStaticMutex
+{
+ struct _GMutex *runtime_mutex;
+ union {
+ char pad[24];
+ double dummy_double;
+ void *dummy_pointer;
+ long dummy_long;
+ } aligned_pad_u;
+};
+#define G_STATIC_MUTEX_INIT { NULL, { { 0,0,0,0,0,0,77,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} } }
+#define g_static_mutex_get_mutex(mutex) (g_thread_use_default_impl ? ((GMutex*) &((mutex)->aligned_pad_u)) : g_static_mutex_get_mutex_impl (&((mutex)->runtime_mutex)))
+
+#define GINT16_TO_BE(val) ((gint16) (val))
+#define GUINT16_TO_BE(val) ((guint16) (val))
+#define GINT16_TO_LE(val) ((gint16) GUINT16_SWAP_LE_BE (val))
+#define GUINT16_TO_LE(val) (GUINT16_SWAP_LE_BE (val))
+#define GINT32_TO_BE(val) ((gint32) (val))
+#define GUINT32_TO_BE(val) ((guint32) (val))
+#define GINT32_TO_LE(val) ((gint32) GUINT32_SWAP_LE_BE (val))
+#define GUINT32_TO_LE(val) (GUINT32_SWAP_LE_BE (val))
+#define GINT64_TO_BE(val) ((gint64) (val))
+#define GUINT64_TO_BE(val) ((guint64) (val))
+#define GINT64_TO_LE(val) ((gint64) GUINT64_SWAP_LE_BE (val))
+#define GUINT64_TO_LE(val) (GUINT64_SWAP_LE_BE (val))
+#define GLONG_TO_LE(val) ((glong) GINT32_TO_LE (val))
+#define GULONG_TO_LE(val) ((gulong) GUINT32_TO_LE (val))
+#define GLONG_TO_BE(val) ((glong) GINT32_TO_BE (val))
+#define GULONG_TO_BE(val) ((gulong) GUINT32_TO_BE (val))
+#define GINT_TO_LE(val) ((gint) GINT32_TO_LE (val))
+#define GUINT_TO_LE(val) ((guint) GUINT32_TO_LE (val))
+#define GINT_TO_BE(val) ((gint) GINT32_TO_BE (val))
+#define GUINT_TO_BE(val) ((guint) GUINT32_TO_BE (val))
+#define G_BYTE_ORDER G_LITTLE_ENDIAN
+
+#define GLIB_SYSDEF_POLLIN =1
+#define GLIB_SYSDEF_POLLOUT =4
+#define GLIB_SYSDEF_POLLPRI =2
+#define GLIB_SYSDEF_POLLERR =8
+#define GLIB_SYSDEF_POLLHUP =16
+#define GLIB_SYSDEF_POLLNVAL =32
+
+
+#define G_HAVE_WCHAR_H 1
+#define G_HAVE_WCTYPE_H 1
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* GLIBCONFIG_H */
diff -urN linux-2.4.1/net/korbit/kglib/glist.c linux-2.4.1-korbit/net/korbit/kglib/glist.c
--- linux-2.4.1/net/korbit/kglib/glist.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/kglib/glist.c Thu Feb 1 11:46:57 2001
@@ -0,0 +1,666 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Modified by the GLib Team and others 1997-1999. See the AUTHORS
+ * file for a list of people on the GLib Team. See the ChangeLog
+ * files for a list of changes. These files are distributed with
+ * GLib at ftp://ftp.gtk.org/pub/gtk/.
+ */
+
+#include "glib.h"
+
+
+struct _GAllocator /* from gmem.c */
+{
+ gchar *name;
+ guint16 n_preallocs;
+ guint is_unused : 1;
+ guint type : 4;
+ GAllocator *last;
+ GMemChunk *mem_chunk;
+ GList *free_lists; /* implementation specific */
+};
+
+static GAllocator *current_allocator = NULL;
+G_LOCK_DEFINE_STATIC (current_allocator);
+
+/* HOLDS: current_allocator_lock */
+static void
+g_list_validate_allocator (GAllocator *allocator)
+{
+ g_return_if_fail (allocator != NULL);
+ g_return_if_fail (allocator->is_unused == TRUE);
+
+ if (allocator->type != G_ALLOCATOR_LIST)
+ {
+ allocator->type = G_ALLOCATOR_LIST;
+ if (allocator->mem_chunk)
+ {
+ g_mem_chunk_destroy (allocator->mem_chunk);
+ allocator->mem_chunk = NULL;
+ }
+ }
+
+ if (!allocator->mem_chunk)
+ {
+ allocator->mem_chunk = g_mem_chunk_new (allocator->name,
+ sizeof (GList),
+ sizeof (GList) * allocator->n_preallocs,
+ G_ALLOC_ONLY);
+ allocator->free_lists = NULL;
+ }
+
+ allocator->is_unused = FALSE;
+}
+
+void
+g_list_push_allocator(GAllocator *allocator)
+{
+ G_LOCK (current_allocator);
+ g_list_validate_allocator ( allocator );
+ allocator->last = current_allocator;
+ current_allocator = allocator;
+ G_UNLOCK (current_allocator);
+}
+
+void
+g_list_pop_allocator (void)
+{
+ G_LOCK (current_allocator);
+ if (current_allocator)
+ {
+ GAllocator *allocator;
+
+ allocator = current_allocator;
+ current_allocator = allocator->last;
+ allocator->last = NULL;
+ allocator->is_unused = TRUE;
+ }
+ G_UNLOCK (current_allocator);
+}
+
+GList*
+g_list_alloc (void)
+{
+ GList *list;
+
+ G_LOCK (current_allocator);
+ if (!current_allocator)
+ {
+ GAllocator *allocator = g_allocator_new ("GLib default GList allocator",
+ 128);
+ g_list_validate_allocator (allocator);
+ allocator->last = NULL;
+ current_allocator = allocator;
+ }
+ if (!current_allocator->free_lists)
+ {
+ list = g_chunk_new (GList, current_allocator->mem_chunk);
+ list->data = NULL;
+ }
+ else
+ {
+ if (current_allocator->free_lists->data)
+ {
+ list = current_allocator->free_lists->data;
+ current_allocator->free_lists->data = list->next;
+ list->data = NULL;
+ }
+ else
+ {
+ list = current_allocator->free_lists;
+ current_allocator->free_lists = list->next;
+ }
+ }
+ G_UNLOCK (current_allocator);
+ list->next = NULL;
+ list->prev = NULL;
+
+ return list;
+}
+
+void
+g_list_free (GList *list)
+{
+ if (list)
+ {
+ list->data = list->next;
+ G_LOCK (current_allocator);
+ list->next = current_allocator->free_lists;
+ current_allocator->free_lists = list;
+ G_UNLOCK (current_allocator);
+ }
+}
+
+void
+g_list_free_1 (GList *list)
+{
+ if (list)
+ {
+ list->data = NULL;
+ G_LOCK (current_allocator);
+ list->next = current_allocator->free_lists;
+ current_allocator->free_lists = list;
+ G_UNLOCK (current_allocator);
+ }
+}
+
+GList*
+g_list_append (GList *list,
+ gpointer data)
+{
+ GList *new_list;
+ GList *last;
+
+ new_list = g_list_alloc ();
+ new_list->data = data;
+
+ if (list)
+ {
+ last = g_list_last (list);
+ /* g_assert (last != NULL); */
+ last->next = new_list;
+ new_list->prev = last;
+
+ return list;
+ }
+ else
+ return new_list;
+}
+
+GList*
+g_list_prepend (GList *list,
+ gpointer data)
+{
+ GList *new_list;
+
+ new_list = g_list_alloc ();
+ new_list->data = data;
+
+ if (list)
+ {
+ if (list->prev)
+ {
+ list->prev->next = new_list;
+ new_list->prev = list->prev;
+ }
+ list->prev = new_list;
+ new_list->next = list;
+ }
+
+ return new_list;
+}
+
+GList*
+g_list_insert (GList *list,
+ gpointer data,
+ gint position)
+{
+ GList *new_list;
+ GList *tmp_list;
+
+ if (position < 0)
+ return g_list_append (list, data);
+ else if (position == 0)
+ return g_list_prepend (list, data);
+
+ tmp_list = g_list_nth (list, position);
+ if (!tmp_list)
+ return g_list_append (list, data);
+
+ new_list = g_list_alloc ();
+ new_list->data = data;
+
+ if (tmp_list->prev)
+ {
+ tmp_list->prev->next = new_list;
+ new_list->prev = tmp_list->prev;
+ }
+ new_list->next = tmp_list;
+ tmp_list->prev = new_list;
+
+ if (tmp_list == list)
+ return new_list;
+ else
+ return list;
+}
+
+GList *
+g_list_concat (GList *list1, GList *list2)
+{
+ GList *tmp_list;
+
+ if (list2)
+ {
+ tmp_list = g_list_last (list1);
+ if (tmp_list)
+ tmp_list->next = list2;
+ else
+ list1 = list2;
+ list2->prev = tmp_list;
+ }
+
+ return list1;
+}
+
+GList*
+g_list_remove (GList *list,
+ gpointer data)
+{
+ GList *tmp;
+
+ tmp = list;
+ while (tmp)
+ {
+ if (tmp->data != data)
+ tmp = tmp->next;
+ else
+ {
+ if (tmp->prev)
+ tmp->prev->next = tmp->next;
+ if (tmp->next)
+ tmp->next->prev = tmp->prev;
+
+ if (list == tmp)
+ list = list->next;
+
+ g_list_free_1 (tmp);
+
+ break;
+ }
+ }
+ return list;
+}
+
+GList*
+g_list_remove_link (GList *list,
+ GList *link)
+{
+ if (link)
+ {
+ if (link->prev)
+ link->prev->next = link->next;
+ if (link->next)
+ link->next->prev = link->prev;
+
+ if (link == list)
+ list = list->next;
+
+ link->next = NULL;
+ link->prev = NULL;
+ }
+
+ return list;
+}
+
+GList*
+g_list_copy (GList *list)
+{
+ GList *new_list = NULL;
+
+ if (list)
+ {
+ GList *last;
+
+ new_list = g_list_alloc ();
+ new_list->data = list->data;
+ last = new_list;
+ list = list->next;
+ while (list)
+ {
+ last->next = g_list_alloc ();
+ last->next->prev = last;
+ last = last->next;
+ last->data = list->data;
+ list = list->next;
+ }
+ }
+
+ return new_list;
+}
+
+GList*
+g_list_reverse (GList *list)
+{
+ GList *last;
+
+ last = NULL;
+ while (list)
+ {
+ last = list;
+ list = last->next;
+ last->next = last->prev;
+ last->prev = list;
+ }
+
+ return last;
+}
+
+GList*
+g_list_nth (GList *list,
+ guint n)
+{
+ while ((n-- > 0) && list)
+ list = list->next;
+
+ return list;
+}
+
+gpointer
+g_list_nth_data (GList *list,
+ guint n)
+{
+ while ((n-- > 0) && list)
+ list = list->next;
+
+ return list ? list->data : NULL;
+}
+
+GList*
+g_list_find (GList *list,
+ gpointer data)
+{
+ while (list)
+ {
+ if (list->data == data)
+ break;
+ list = list->next;
+ }
+
+ return list;
+}
+
+GList*
+g_list_find_custom (GList *list,
+ gpointer data,
+ GCompareFunc func)
+{
+ g_return_val_if_fail (func != NULL, list);
+
+ while (list)
+ {
+ if (! func (list->data, data))
+ return list;
+ list = list->next;
+ }
+
+ return NULL;
+}
+
+
+gint
+g_list_position (GList *list,
+ GList *link)
+{
+ gint i;
+
+ i = 0;
+ while (list)
+ {
+ if (list == link)
+ return i;
+ i++;
+ list = list->next;
+ }
+
+ return -1;
+}
+
+gint
+g_list_index (GList *list,
+ gpointer data)
+{
+ gint i;
+
+ i = 0;
+ while (list)
+ {
+ if (list->data == data)
+ return i;
+ i++;
+ list = list->next;
+ }
+
+ return -1;
+}
+
+GList*
+g_list_last (GList *list)
+{
+ if (list)
+ {
+ while (list->next)
+ list = list->next;
+ }
+
+ return list;
+}
+
+GList*
+g_list_first (GList *list)
+{
+ if (list)
+ {
+ while (list->prev)
+ list = list->prev;
+ }
+
+ return list;
+}
+
+guint
+g_list_length (GList *list)
+{
+ guint length;
+
+ length = 0;
+ while (list)
+ {
+ length++;
+ list = list->next;
+ }
+
+ return length;
+}
+
+void
+g_list_foreach (GList *list,
+ GFunc func,
+ gpointer user_data)
+{
+ while (list)
+ {
+ (*func) (list->data, user_data);
+ list = list->next;
+ }
+}
+
+
+GList*
+g_list_insert_sorted (GList *list,
+ gpointer data,
+ GCompareFunc func)
+{
+ GList *tmp_list = list;
+ GList *new_list;
+ gint cmp;
+
+ g_return_val_if_fail (func != NULL, list);
+
+ if (!list)
+ {
+ new_list = g_list_alloc();
+ new_list->data = data;
+ return new_list;
+ }
+
+ cmp = (*func) (data, tmp_list->data);
+
+ while ((tmp_list->next) && (cmp > 0))
+ {
+ tmp_list = tmp_list->next;
+ cmp = (*func) (data, tmp_list->data);
+ }
+
+ new_list = g_list_alloc();
+ new_list->data = data;
+
+ if ((!tmp_list->next) && (cmp > 0))
+ {
+ tmp_list->next = new_list;
+ new_list->prev = tmp_list;
+ return list;
+ }
+
+ if (tmp_list->prev)
+ {
+ tmp_list->prev->next = new_list;
+ new_list->prev = tmp_list->prev;
+ }
+ new_list->next = tmp_list;
+ tmp_list->prev = new_list;
+
+ if (tmp_list == list)
+ return new_list;
+ else
+ return list;
+}
+
+static GList *
+g_list_sort_merge (GList *l1,
+ GList *l2,
+ GCompareFunc compare_func)
+{
+ GList list, *l, *lprev;
+
+ l = &list;
+ lprev = NULL;
+
+ while (l1 && l2)
+ {
+ if (compare_func (l1->data, l2->data) < 0)
+ {
+ l->next = l1;
+ l = l->next;
+ l->prev = lprev;
+ lprev = l;
+ l1 = l1->next;
+ }
+ else
+ {
+ l->next = l2;
+ l = l->next;
+ l->prev = lprev;
+ lprev = l;
+ l2 = l2->next;
+ }
+ }
+ l->next = l1 ? l1 : l2;
+ l->next->prev = l;
+
+ return list.next;
+}
+
+GList*
+g_list_sort (GList *list,
+ GCompareFunc compare_func)
+{
+ GList *l1, *l2;
+
+ if (!list)
+ return NULL;
+ if (!list->next)
+ return list;
+
+ l1 = list;
+ l2 = list->next;
+
+ while ((l2 = l2->next) != NULL)
+ {
+ if ((l2 = l2->next) == NULL)
+ break;
+ l1 = l1->next;
+ }
+ l2 = l1->next;
+ l1->next = NULL;
+
+ return g_list_sort_merge (g_list_sort (list, compare_func),
+ g_list_sort (l2, compare_func),
+ compare_func);
+}
+
+GList*
+g_list_sort2 (GList *list,
+ GCompareFunc compare_func)
+{
+ GSList *runs = NULL;
+ GList *tmp;
+
+ /* Degenerate case. */
+ if (!list) return NULL;
+
+ /* Assume: list = [12,2,4,11,2,4,6,1,1,12]. */
+ for (tmp = list; tmp; )
+ {
+ GList *tmp2;
+ for (tmp2 = tmp;
+ tmp2->next && compare_func (tmp2->data, tmp2->next->data) <= 0;
+ tmp2 = tmp2->next)
+ /* Nothing */;
+ runs = g_slist_append (runs, tmp);
+ tmp = tmp2->next;
+ tmp2->next = NULL;
+ }
+ /* Now: runs = [[12],[2,4,11],[2,4,6],[1,1,12]]. */
+
+ while (runs->next)
+ {
+ /* We have more than one run. Merge pairwise. */
+ GSList *dst, *src, *dstprev = NULL;
+ dst = src = runs;
+ while (src && src->next)
+ {
+ dst->data = g_list_sort_merge (src->data,
+ src->next->data,
+ compare_func);
+ dstprev = dst;
+ dst = dst->next;
+ src = src->next->next;
+ }
+
+ /* If number of runs was odd, just keep the last. */
+ if (src)
+ {
+ dst->data = src->data;
+ dstprev = dst;
+ dst = dst->next;
+ }
+
+ dstprev->next = NULL;
+ g_slist_free (dst);
+ }
+
+ /* After 1st loop: runs = [[2,4,11,12],[1,1,2,4,6,12]]. */
+ /* After 2nd loop: runs = [[1,1,2,2,4,4,6,11,12,12]]. */
+
+ list = runs->data;
+ g_slist_free (runs);
+ return list;
+}
diff -urN linux-2.4.1/net/korbit/kglib/gmem.c linux-2.4.1-korbit/net/korbit/kglib/gmem.c
--- linux-2.4.1/net/korbit/kglib/gmem.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/kglib/gmem.c Thu Feb 1 11:46:57 2001
@@ -0,0 +1,767 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Modified by the GLib Team and others 1997-1999. See the AUTHORS
+ * file for a list of people on the GLib Team. See the ChangeLog
+ * files for a list of changes. These files are distributed with
+ * GLib at ftp://ftp.gtk.org/pub/gtk/.
+ *
+ * Mutilated on 10/22/00 by Fredrik and Chris
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include "glib.h"
+
+#define MEM_PROFILE_TABLE_SIZE 8192
+#define ENTER_MEM_CHUNK_ROUTINE()
+#define LEAVE_MEM_CHUNK_ROUTINE()
+
+/*
+ * This library can check for some attempts to do illegal things to
+ * memory (ENABLE_MEM_CHECK), and can do profiling
+ * (ENABLE_MEM_PROFILE). Both features are implemented by storing
+ * words before the start of the memory chunk.
+ *
+ * The first, at offset -2*SIZEOF_LONG, is used only if
+ * ENABLE_MEM_CHECK is set, and stores 0 after the memory has been
+ * allocated and 1 when it has been freed. The second, at offset
+ * -SIZEOF_LONG, is used if either flag is set and stores the size of
+ * the block.
+ *
+ * The MEM_CHECK flag is checked when memory is realloc'd and free'd,
+ * and it can be explicitly checked before using a block by calling
+ * g_mem_check().
+ */
+
+#define MEM_AREA_SIZE 4L
+
+#define MEM_ALIGN sizeof(long)
+
+
+typedef struct _GFreeAtom GFreeAtom;
+typedef struct _GMemArea GMemArea;
+typedef struct _GRealMemChunk GRealMemChunk;
+
+struct _GFreeAtom
+{
+ GFreeAtom *next;
+};
+
+struct _GMemArea
+{
+ GMemArea *next; /* the next mem area */
+ GMemArea *prev; /* the previous mem area */
+ gulong index; /* the current index into the "mem" array */
+ gulong free; /* the number of free bytes in this mem area */
+ gulong allocated; /* the number of atoms allocated from this area */
+ gulong mark; /* is this mem area marked for deletion */
+ gchar mem[MEM_AREA_SIZE]; /* the mem array from which atoms get allocated
+ * the actual size of this array is determined by
+ * the mem chunk "area_size". ANSI says that it
+ * must be declared to be the maximum size it
+ * can possibly be (even though the actual size
+ * may be less).
+ */
+};
+
+struct _GRealMemChunk
+{
+ gchar *name; /* name of this MemChunk...used for debugging output */
+ gint type; /* the type of MemChunk: ALLOC_ONLY or ALLOC_AND_FREE */
+ gint num_mem_areas; /* the number of memory areas */
+ gint num_marked_areas; /* the number of areas marked for deletion */
+ guint atom_size; /* the size of an atom */
+ gulong area_size; /* the size of a memory area */
+ GMemArea *mem_area; /* the current memory area */
+ GMemArea *mem_areas; /* a list of all the mem areas owned by this chunk */
+ GMemArea *free_mem_area; /* the free area...which is about to be destroyed */
+ GFreeAtom *free_atoms; /* the free atoms list */
+ GTree *mem_tree; /* tree of mem areas sorted by memory address */
+ GRealMemChunk *next; /* pointer to the next chunk */
+ GRealMemChunk *prev; /* pointer to the previous chunk */
+};
+
+
+static gulong g_mem_chunk_compute_size (gulong size,
+ gulong min_size);
+static gint g_mem_chunk_area_compare (GMemArea *a,
+ GMemArea *b);
+static gint g_mem_chunk_area_search (GMemArea *a,
+ gchar *addr);
+
+
+/* here we can't use StaticMutexes, as they depend upon a working
+ * g_malloc, the same holds true for StaticPrivate */
+#ifndef __KORBIT__
+static GMutex* mem_chunks_lock = NULL;
+#endif /* !__KORBIT__ */
+static GRealMemChunk *mem_chunks = NULL;
+
+
+gpointer
+g_malloc (gulong size)
+{
+ gpointer p;
+
+ if (size == 0)
+ return NULL;
+
+ p = (gpointer) malloc (size);
+ if (!p)
+ g_error ("could not allocate %ld bytes", size);
+
+ return p;
+}
+
+gpointer
+g_malloc0 (gulong size)
+{
+ gpointer p;
+
+ if (size == 0)
+ return NULL;
+
+ p = (gpointer) calloc (size, 1);
+ if (!p)
+ g_error ("could not allocate %ld bytes", size);
+
+ return p;
+}
+
+gpointer
+g_realloc (gpointer mem,
+ gulong size)
+{
+ gpointer p;
+
+ if (size == 0)
+ {
+ g_free (mem);
+
+ return NULL;
+ }
+
+ if (!mem)
+ {
+#ifdef REALLOC_0_WORKS
+ p = (gpointer) realloc (NULL, size);
+#else /* !REALLOC_0_WORKS */
+ p = (gpointer) malloc (size);
+#endif /* !REALLOC_0_WORKS */
+ }
+ else
+ {
+ p = (gpointer) realloc (mem, size);
+ }
+
+ if (!p)
+ g_error ("could not reallocate %lu bytes", (gulong) size);
+
+ return p;
+}
+
+void
+g_free (gpointer mem)
+{
+ if (mem)
+ {
+ free (mem);
+ }
+}
+
+
+void
+g_mem_profile (void)
+{
+}
+
+void
+g_mem_check (gpointer mem)
+{
+}
+
+GMemChunk*
+g_mem_chunk_new (gchar *name,
+ gint atom_size,
+ gulong area_size,
+ gint type)
+{
+ GRealMemChunk *mem_chunk;
+ gulong rarea_size;
+
+ g_return_val_if_fail (atom_size > 0, NULL);
+ g_return_val_if_fail (area_size >= atom_size, NULL);
+
+ ENTER_MEM_CHUNK_ROUTINE();
+
+ area_size = (area_size + atom_size - 1) / atom_size;
+ area_size *= atom_size;
+
+ mem_chunk = g_new (struct _GRealMemChunk, 1);
+ mem_chunk->name = name;
+ mem_chunk->type = type;
+ mem_chunk->num_mem_areas = 0;
+ mem_chunk->num_marked_areas = 0;
+ mem_chunk->mem_area = NULL;
+ mem_chunk->free_mem_area = NULL;
+ mem_chunk->free_atoms = NULL;
+ mem_chunk->mem_tree = NULL;
+ mem_chunk->mem_areas = NULL;
+ mem_chunk->atom_size = atom_size;
+
+ if (mem_chunk->type == G_ALLOC_AND_FREE)
+ mem_chunk->mem_tree = g_tree_new ((GCompareFunc) g_mem_chunk_area_compare);
+
+ if (mem_chunk->atom_size % MEM_ALIGN)
+ mem_chunk->atom_size += MEM_ALIGN - (mem_chunk->atom_size % MEM_ALIGN);
+
+ rarea_size = area_size + sizeof (GMemArea) - MEM_AREA_SIZE;
+ rarea_size = g_mem_chunk_compute_size (rarea_size, atom_size + sizeof (GMemArea) - MEM_AREA_SIZE);
+ mem_chunk->area_size = rarea_size - (sizeof (GMemArea) - MEM_AREA_SIZE);
+
+#ifndef __KORBIT__
+ g_mutex_lock (mem_chunks_lock);
+#endif /* !__KORBIT__ */
+ mem_chunk->next = mem_chunks;
+ mem_chunk->prev = NULL;
+ if (mem_chunks)
+ mem_chunks->prev = mem_chunk;
+ mem_chunks = mem_chunk;
+#ifndef __KORBIT__
+ g_mutex_unlock (mem_chunks_lock);
+#endif /* !__KORBIT__ */
+
+ LEAVE_MEM_CHUNK_ROUTINE();
+
+ return ((GMemChunk*) mem_chunk);
+}
+
+void
+g_mem_chunk_destroy (GMemChunk *mem_chunk)
+{
+ GRealMemChunk *rmem_chunk;
+ GMemArea *mem_areas;
+ GMemArea *temp_area;
+
+ g_return_if_fail (mem_chunk != NULL);
+
+ ENTER_MEM_CHUNK_ROUTINE();
+
+ rmem_chunk = (GRealMemChunk*) mem_chunk;
+
+ mem_areas = rmem_chunk->mem_areas;
+ while (mem_areas)
+ {
+ temp_area = mem_areas;
+ mem_areas = mem_areas->next;
+ g_free (temp_area);
+ }
+
+ if (rmem_chunk->next)
+ rmem_chunk->next->prev = rmem_chunk->prev;
+ if (rmem_chunk->prev)
+ rmem_chunk->prev->next = rmem_chunk->next;
+
+#ifndef __KORBIT__
+ g_mutex_lock (mem_chunks_lock);
+#endif /* !__KORBIT__ */
+ if (rmem_chunk == mem_chunks)
+ mem_chunks = mem_chunks->next;
+#ifndef __KORBIT__
+ g_mutex_unlock (mem_chunks_lock);
+#endif /* !__KORBIT__ */
+
+ if (rmem_chunk->type == G_ALLOC_AND_FREE)
+ g_tree_destroy (rmem_chunk->mem_tree);
+
+ g_free (rmem_chunk);
+
+ LEAVE_MEM_CHUNK_ROUTINE();
+}
+
+gpointer
+g_mem_chunk_alloc (GMemChunk *mem_chunk)
+{
+ GRealMemChunk *rmem_chunk;
+ GMemArea *temp_area;
+ gpointer mem;
+
+ ENTER_MEM_CHUNK_ROUTINE();
+
+ g_return_val_if_fail (mem_chunk != NULL, NULL);
+
+ rmem_chunk = (GRealMemChunk*) mem_chunk;
+
+ while (rmem_chunk->free_atoms)
+ {
+ /* Get the first piece of memory on the "free_atoms" list.
+ * We can go ahead and destroy the list node we used to keep
+ * track of it with and to update the "free_atoms" list to
+ * point to its next element.
+ */
+ mem = rmem_chunk->free_atoms;
+ rmem_chunk->free_atoms = rmem_chunk->free_atoms->next;
+
+ /* Determine which area this piece of memory is allocated from */
+ temp_area = g_tree_search (rmem_chunk->mem_tree,
+ (GSearchFunc) g_mem_chunk_area_search,
+ mem);
+
+ /* If the area has been marked, then it is being destroyed.
+ * (ie marked to be destroyed).
+ * We check to see if all of the segments on the free list that
+ * reference this area have been removed. This occurs when
+ * the ammount of free memory is less than the allocatable size.
+ * If the chunk should be freed, then we place it in the "free_mem_area".
+ * This is so we make sure not to free the mem area here and then
+ * allocate it again a few lines down.
+ * If we don't allocate a chunk a few lines down then the "free_mem_area"
+ * will be freed.
+ * If there is already a "free_mem_area" then we'll just free this mem area.
+ */
+ if (temp_area->mark)
+ {
+ /* Update the "free" memory available in that area */
+ temp_area->free += rmem_chunk->atom_size;
+
+ if (temp_area->free == rmem_chunk->area_size)
+ {
+ if (temp_area == rmem_chunk->mem_area)
+ rmem_chunk->mem_area = NULL;
+
+ if (rmem_chunk->free_mem_area)
+ {
+ rmem_chunk->num_mem_areas -= 1;
+
+ if (temp_area->next)
+ temp_area->next->prev = temp_area->prev;
+ if (temp_area->prev)
+ temp_area->prev->next = temp_area->next;
+ if (temp_area == rmem_chunk->mem_areas)
+ rmem_chunk->mem_areas = rmem_chunk->mem_areas->next;
+
+ if (rmem_chunk->type == G_ALLOC_AND_FREE)
+ g_tree_remove (rmem_chunk->mem_tree, temp_area);
+ g_free (temp_area);
+ }
+ else
+ rmem_chunk->free_mem_area = temp_area;
+
+ rmem_chunk->num_marked_areas -= 1;
+ }
+ }
+ else
+ {
+ /* Update the number of allocated atoms count.
+ */
+ temp_area->allocated += 1;
+
+ /* The area wasn't marked...return the memory
+ */
+ goto outa_here;
+ }
+ }
+
+ /* If there isn't a current mem area or the current mem area is out of space
+ * then allocate a new mem area. We'll first check and see if we can use
+ * the "free_mem_area". Otherwise we'll just malloc the mem area.
+ */
+ if ((!rmem_chunk->mem_area) ||
+ ((rmem_chunk->mem_area->index + rmem_chunk->atom_size) > rmem_chunk->area_size))
+ {
+ if (rmem_chunk->free_mem_area)
+ {
+ rmem_chunk->mem_area = rmem_chunk->free_mem_area;
+ rmem_chunk->free_mem_area = NULL;
+ }
+ else
+ {
+ rmem_chunk->mem_area = (GMemArea*) g_malloc (sizeof (GMemArea) -
+ MEM_AREA_SIZE +
+ rmem_chunk->area_size);
+
+ rmem_chunk->num_mem_areas += 1;
+ rmem_chunk->mem_area->next = rmem_chunk->mem_areas;
+ rmem_chunk->mem_area->prev = NULL;
+
+ if (rmem_chunk->mem_areas)
+ rmem_chunk->mem_areas->prev = rmem_chunk->mem_area;
+ rmem_chunk->mem_areas = rmem_chunk->mem_area;
+
+ if (rmem_chunk->type == G_ALLOC_AND_FREE)
+ g_tree_insert (rmem_chunk->mem_tree, rmem_chunk->mem_area, rmem_chunk->mem_area);
+ }
+
+ rmem_chunk->mem_area->index = 0;
+ rmem_chunk->mem_area->free = rmem_chunk->area_size;
+ rmem_chunk->mem_area->allocated = 0;
+ rmem_chunk->mem_area->mark = 0;
+ }
+
+ /* Get the memory and modify the state variables appropriately.
+ */
+ mem = (gpointer) &rmem_chunk->mem_area->mem[rmem_chunk->mem_area->index];
+ rmem_chunk->mem_area->index += rmem_chunk->atom_size;
+ rmem_chunk->mem_area->free -= rmem_chunk->atom_size;
+ rmem_chunk->mem_area->allocated += 1;
+
+outa_here:
+
+ LEAVE_MEM_CHUNK_ROUTINE();
+
+ return mem;
+}
+
+gpointer
+g_mem_chunk_alloc0 (GMemChunk *mem_chunk)
+{
+ gpointer mem;
+
+ mem = g_mem_chunk_alloc (mem_chunk);
+ if (mem)
+ {
+ GRealMemChunk *rmem_chunk = (GRealMemChunk*) mem_chunk;
+
+ memset (mem, 0, rmem_chunk->atom_size);
+ }
+
+ return mem;
+}
+
+void
+g_mem_chunk_free (GMemChunk *mem_chunk,
+ gpointer mem)
+{
+ GRealMemChunk *rmem_chunk;
+ GMemArea *temp_area;
+ GFreeAtom *free_atom;
+
+ g_return_if_fail (mem_chunk != NULL);
+ g_return_if_fail (mem != NULL);
+
+ ENTER_MEM_CHUNK_ROUTINE();
+
+ rmem_chunk = (GRealMemChunk*) mem_chunk;
+
+ /* Don't do anything if this is an ALLOC_ONLY chunk
+ */
+ if (rmem_chunk->type == G_ALLOC_AND_FREE)
+ {
+ /* Place the memory on the "free_atoms" list
+ */
+ free_atom = (GFreeAtom*) mem;
+ free_atom->next = rmem_chunk->free_atoms;
+ rmem_chunk->free_atoms = free_atom;
+
+ temp_area = g_tree_search (rmem_chunk->mem_tree,
+ (GSearchFunc) g_mem_chunk_area_search,
+ mem);
+
+ temp_area->allocated -= 1;
+
+ if (temp_area->allocated == 0)
+ {
+ temp_area->mark = 1;
+ rmem_chunk->num_marked_areas += 1;
+ }
+ }
+
+ LEAVE_MEM_CHUNK_ROUTINE();
+}
+
+/* This doesn't free the free_area if there is one */
+void
+g_mem_chunk_clean (GMemChunk *mem_chunk)
+{
+ GRealMemChunk *rmem_chunk;
+ GMemArea *mem_area;
+ GFreeAtom *prev_free_atom;
+ GFreeAtom *temp_free_atom;
+ gpointer mem;
+
+ g_return_if_fail (mem_chunk != NULL);
+
+ rmem_chunk = (GRealMemChunk*) mem_chunk;
+
+ if (rmem_chunk->type == G_ALLOC_AND_FREE)
+ {
+ prev_free_atom = NULL;
+ temp_free_atom = rmem_chunk->free_atoms;
+
+ while (temp_free_atom)
+ {
+ mem = (gpointer) temp_free_atom;
+
+ mem_area = g_tree_search (rmem_chunk->mem_tree,
+ (GSearchFunc) g_mem_chunk_area_search,
+ mem);
+
+ /* If this mem area is marked for destruction then delete the
+ * area and list node and decrement the free mem.
+ */
+ if (mem_area->mark)
+ {
+ if (prev_free_atom)
+ prev_free_atom->next = temp_free_atom->next;
+ else
+ rmem_chunk->free_atoms = temp_free_atom->next;
+ temp_free_atom = temp_free_atom->next;
+
+ mem_area->free += rmem_chunk->atom_size;
+ if (mem_area->free == rmem_chunk->area_size)
+ {
+ rmem_chunk->num_mem_areas -= 1;
+ rmem_chunk->num_marked_areas -= 1;
+
+ if (mem_area->next)
+ mem_area->next->prev = mem_area->prev;
+ if (mem_area->prev)
+ mem_area->prev->next = mem_area->next;
+ if (mem_area == rmem_chunk->mem_areas)
+ rmem_chunk->mem_areas = rmem_chunk->mem_areas->next;
+ if (mem_area == rmem_chunk->mem_area)
+ rmem_chunk->mem_area = NULL;
+
+ if (rmem_chunk->type == G_ALLOC_AND_FREE)
+ g_tree_remove (rmem_chunk->mem_tree, mem_area);
+ g_free (mem_area);
+ }
+ }
+ else
+ {
+ prev_free_atom = temp_free_atom;
+ temp_free_atom = temp_free_atom->next;
+ }
+ }
+ }
+}
+
+void
+g_mem_chunk_reset (GMemChunk *mem_chunk)
+{
+ GRealMemChunk *rmem_chunk;
+ GMemArea *mem_areas;
+ GMemArea *temp_area;
+
+ g_return_if_fail (mem_chunk != NULL);
+
+ rmem_chunk = (GRealMemChunk*) mem_chunk;
+
+ mem_areas = rmem_chunk->mem_areas;
+ rmem_chunk->num_mem_areas = 0;
+ rmem_chunk->mem_areas = NULL;
+ rmem_chunk->mem_area = NULL;
+
+ while (mem_areas)
+ {
+ temp_area = mem_areas;
+ mem_areas = mem_areas->next;
+ g_free (temp_area);
+ }
+
+ rmem_chunk->free_atoms = NULL;
+
+ if (rmem_chunk->mem_tree)
+ g_tree_destroy (rmem_chunk->mem_tree);
+ rmem_chunk->mem_tree = g_tree_new ((GCompareFunc) g_mem_chunk_area_compare);
+}
+
+void
+g_mem_chunk_print (GMemChunk *mem_chunk)
+{
+ GRealMemChunk *rmem_chunk;
+ GMemArea *mem_areas;
+ gulong mem;
+
+ g_return_if_fail (mem_chunk != NULL);
+
+ rmem_chunk = (GRealMemChunk*) mem_chunk;
+ mem_areas = rmem_chunk->mem_areas;
+ mem = 0;
+
+ while (mem_areas)
+ {
+ mem += rmem_chunk->area_size - mem_areas->free;
+ mem_areas = mem_areas->next;
+ }
+
+ g_log (g_log_domain_glib, G_LOG_LEVEL_INFO,
+ "%s: %ld bytes using %d mem areas",
+ rmem_chunk->name, mem, rmem_chunk->num_mem_areas);
+}
+
+void
+g_mem_chunk_info (void)
+{
+ GRealMemChunk *mem_chunk;
+ gint count;
+
+ count = 0;
+#ifndef __KORBIT__
+ g_mutex_lock (mem_chunks_lock);
+#endif /* !__KORBIT__ */
+ mem_chunk = mem_chunks;
+ while (mem_chunk)
+ {
+ count += 1;
+ mem_chunk = mem_chunk->next;
+ }
+#ifndef __KORBIT__
+ g_mutex_unlock (mem_chunks_lock);
+#endif /* !__KORBIT__ */
+ g_log (g_log_domain_glib, G_LOG_LEVEL_INFO, "%d mem chunks", count);
+
+#ifndef __KORBIT__
+ g_mutex_lock (mem_chunks_lock);
+#endif /* !__KORBIT__ */
+ mem_chunk = mem_chunks;
+#ifndef __KORBIT__
+ g_mutex_unlock (mem_chunks_lock);
+#endif /* !__KORBIT__ */
+
+ while (mem_chunk)
+ {
+ g_mem_chunk_print ((GMemChunk*) mem_chunk);
+ mem_chunk = mem_chunk->next;
+ }
+}
+
+void
+g_blow_chunks (void)
+{
+ GRealMemChunk *mem_chunk;
+
+#ifndef __KORBIT__
+ g_mutex_lock (mem_chunks_lock);
+#endif /* !__KORBIT__ */
+ mem_chunk = mem_chunks;
+#ifndef __KORBIT__
+ g_mutex_unlock (mem_chunks_lock);
+#endif /* !__KORBIT__ */
+ while (mem_chunk)
+ {
+ g_mem_chunk_clean ((GMemChunk*) mem_chunk);
+ mem_chunk = mem_chunk->next;
+ }
+}
+
+
+static gulong
+g_mem_chunk_compute_size (gulong size,
+ gulong min_size)
+{
+ gulong power_of_2;
+ gulong lower, upper;
+
+ power_of_2 = 16;
+ while (power_of_2 < size)
+ power_of_2 <<= 1;
+
+ lower = power_of_2 >> 1;
+ upper = power_of_2;
+
+ if (size - lower < upper - size && lower >= min_size)
+ return lower;
+ else
+ return upper;
+}
+
+static gint
+g_mem_chunk_area_compare (GMemArea *a,
+ GMemArea *b)
+{
+ if (a->mem > b->mem)
+ return 1;
+ else if (a->mem < b->mem)
+ return -1;
+ return 0;
+}
+
+static gint
+g_mem_chunk_area_search (GMemArea *a,
+ gchar *addr)
+{
+ if (a->mem <= addr)
+ {
+ if (addr < &a->mem[a->index])
+ return 0;
+ return 1;
+ }
+ return -1;
+}
+
+/* generic allocators
+ */
+struct _GAllocator /* from gmem.c */
+{
+ gchar *name;
+ guint16 n_preallocs;
+ guint is_unused : 1;
+ guint type : 4;
+ GAllocator *last;
+ GMemChunk *mem_chunk;
+ gpointer dummy; /* implementation specific */
+};
+
+GAllocator*
+g_allocator_new (const gchar *name,
+ guint n_preallocs)
+{
+ GAllocator *allocator;
+
+ g_return_val_if_fail (name != NULL, NULL);
+
+ allocator = g_new0 (GAllocator, 1);
+ allocator->name = g_strdup (name);
+ allocator->n_preallocs = CLAMP (n_preallocs, 1, 65535);
+ allocator->is_unused = TRUE;
+ allocator->type = 0;
+ allocator->last = NULL;
+ allocator->mem_chunk = NULL;
+ allocator->dummy = NULL;
+
+ return allocator;
+}
+
+void
+g_allocator_free (GAllocator *allocator)
+{
+ g_return_if_fail (allocator != NULL);
+ g_return_if_fail (allocator->is_unused == TRUE);
+
+ g_free (allocator->name);
+ if (allocator->mem_chunk)
+ g_mem_chunk_destroy (allocator->mem_chunk);
+
+ g_free (allocator);
+}
+
+void
+g_mem_init (void)
+{
+#ifndef __KORBIT__
+ mem_chunks_lock = g_mutex_new();
+#endif /* !__KORBIT__ */
+}
diff -urN linux-2.4.1/net/korbit/kglib/gprimes.c linux-2.4.1-korbit/net/korbit/kglib/gprimes.c
--- linux-2.4.1/net/korbit/kglib/gprimes.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/kglib/gprimes.c Thu Feb 1 11:46:57 2001
@@ -0,0 +1,79 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Modified by the GLib Team and others 1997-1999. See the AUTHORS
+ * file for a list of people on the GLib Team. See the ChangeLog
+ * files for a list of changes. These files are distributed with
+ * GLib at ftp://ftp.gtk.org/pub/gtk/.
+ */
+
+#include "glib.h"
+
+static const guint g_primes[] =
+{
+ 11,
+ 19,
+ 37,
+ 73,
+ 109,
+ 163,
+ 251,
+ 367,
+ 557,
+ 823,
+ 1237,
+ 1861,
+ 2777,
+ 4177,
+ 6247,
+ 9371,
+ 14057,
+ 21089,
+ 31627,
+ 47431,
+ 71143,
+ 106721,
+ 160073,
+ 240101,
+ 360163,
+ 540217,
+ 810343,
+ 1215497,
+ 1823231,
+ 2734867,
+ 4102283,
+ 6153409,
+ 9230113,
+ 13845163,
+};
+
+static const guint g_nprimes = sizeof (g_primes) / sizeof (g_primes[0]);
+
+guint
+g_spaced_primes_closest (guint num)
+{
+ gint i;
+
+ for (i = 0; i < g_nprimes; i++)
+ if (g_primes[i] > num)
+ return g_primes[i];
+
+ return g_primes[g_nprimes - 1];
+}
diff -urN linux-2.4.1/net/korbit/kglib/gslist.c linux-2.4.1-korbit/net/korbit/kglib/gslist.c
--- linux-2.4.1/net/korbit/kglib/gslist.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/kglib/gslist.c Thu Feb 1 11:46:57 2001
@@ -0,0 +1,591 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Modified by the GLib Team and others 1997-1999. See the AUTHORS
+ * file for a list of people on the GLib Team. See the ChangeLog
+ * files for a list of changes. These files are distributed with
+ * GLib at ftp://ftp.gtk.org/pub/gtk/.
+ */
+
+#include "glib.h"
+
+
+struct _GAllocator /* from gmem.c */
+{
+ gchar *name;
+ guint16 n_preallocs;
+ guint is_unused : 1;
+ guint type : 4;
+ GAllocator *last;
+ GMemChunk *mem_chunk;
+ GSList *free_lists; /* implementation specific */
+};
+
+G_LOCK_DEFINE_STATIC (current_allocator);
+static GAllocator *current_allocator = NULL;
+
+/* HOLDS: current_allocator_lock */
+static void
+g_slist_validate_allocator (GAllocator *allocator)
+{
+ g_return_if_fail (allocator != NULL);
+ g_return_if_fail (allocator->is_unused == TRUE);
+
+ if (allocator->type != G_ALLOCATOR_SLIST)
+ {
+ allocator->type = G_ALLOCATOR_SLIST;
+ if (allocator->mem_chunk)
+ {
+ g_mem_chunk_destroy (allocator->mem_chunk);
+ allocator->mem_chunk = NULL;
+ }
+ }
+
+ if (!allocator->mem_chunk)
+ {
+ allocator->mem_chunk = g_mem_chunk_new (allocator->name,
+ sizeof (GSList),
+ sizeof (GSList) * allocator->n_preallocs,
+ G_ALLOC_ONLY);
+ allocator->free_lists = NULL;
+ }
+
+ allocator->is_unused = FALSE;
+}
+
+void
+g_slist_push_allocator (GAllocator *allocator)
+{
+ G_LOCK (current_allocator);
+ g_slist_validate_allocator (allocator);
+ allocator->last = current_allocator;
+ current_allocator = allocator;
+ G_UNLOCK (current_allocator);
+}
+
+void
+g_slist_pop_allocator (void)
+{
+ G_LOCK (current_allocator);
+ if (current_allocator)
+ {
+ GAllocator *allocator;
+
+ allocator = current_allocator;
+ current_allocator = allocator->last;
+ allocator->last = NULL;
+ allocator->is_unused = TRUE;
+ }
+ G_UNLOCK (current_allocator);
+}
+
+GSList*
+g_slist_alloc (void)
+{
+ GSList *list;
+
+ G_LOCK (current_allocator);
+ if (!current_allocator)
+ {
+ GAllocator *allocator = g_allocator_new ("GLib default GSList allocator",
+ 128);
+ g_slist_validate_allocator (allocator);
+ allocator->last = NULL;
+ current_allocator = allocator;
+ }
+ if (!current_allocator->free_lists)
+ {
+ list = g_chunk_new (GSList, current_allocator->mem_chunk);
+ list->data = NULL;
+ }
+ else
+ {
+ if (current_allocator->free_lists->data)
+ {
+ list = current_allocator->free_lists->data;
+ current_allocator->free_lists->data = list->next;
+ list->data = NULL;
+ }
+ else
+ {
+ list = current_allocator->free_lists;
+ current_allocator->free_lists = list->next;
+ }
+ }
+ G_UNLOCK (current_allocator);
+
+ list->next = NULL;
+
+ return list;
+}
+
+void
+g_slist_free (GSList *list)
+{
+ if (list)
+ {
+ list->data = list->next;
+ G_LOCK (current_allocator);
+ list->next = current_allocator->free_lists;
+ current_allocator->free_lists = list;
+ G_UNLOCK (current_allocator);
+ }
+}
+
+void
+g_slist_free_1 (GSList *list)
+{
+ if (list)
+ {
+ list->data = NULL;
+ G_LOCK (current_allocator);
+ list->next = current_allocator->free_lists;
+ current_allocator->free_lists = list;
+ G_UNLOCK (current_allocator);
+ }
+}
+
+GSList*
+g_slist_append (GSList *list,
+ gpointer data)
+{
+ GSList *new_list;
+ GSList *last;
+
+ new_list = g_slist_alloc ();
+ new_list->data = data;
+
+ if (list)
+ {
+ last = g_slist_last (list);
+ /* g_assert (last != NULL); */
+ last->next = new_list;
+
+ return list;
+ }
+ else
+ return new_list;
+}
+
+GSList*
+g_slist_prepend (GSList *list,
+ gpointer data)
+{
+ GSList *new_list;
+
+ new_list = g_slist_alloc ();
+ new_list->data = data;
+ new_list->next = list;
+
+ return new_list;
+}
+
+GSList*
+g_slist_insert (GSList *list,
+ gpointer data,
+ gint position)
+{
+ GSList *prev_list;
+ GSList *tmp_list;
+ GSList *new_list;
+
+ if (position < 0)
+ return g_slist_append (list, data);
+ else if (position == 0)
+ return g_slist_prepend (list, data);
+
+ new_list = g_slist_alloc ();
+ new_list->data = data;
+
+ if (!list)
+ return new_list;
+
+ prev_list = NULL;
+ tmp_list = list;
+
+ while ((position-- > 0) && tmp_list)
+ {
+ prev_list = tmp_list;
+ tmp_list = tmp_list->next;
+ }
+
+ if (prev_list)
+ {
+ new_list->next = prev_list->next;
+ prev_list->next = new_list;
+ }
+ else
+ {
+ new_list->next = list;
+ list = new_list;
+ }
+
+ return list;
+}
+
+GSList *
+g_slist_concat (GSList *list1, GSList *list2)
+{
+ if (list2)
+ {
+ if (list1)
+ g_slist_last (list1)->next = list2;
+ else
+ list1 = list2;
+ }
+
+ return list1;
+}
+
+GSList*
+g_slist_remove (GSList *list,
+ gpointer data)
+{
+ GSList *tmp;
+ GSList *prev;
+
+ prev = NULL;
+ tmp = list;
+
+ while (tmp)
+ {
+ if (tmp->data == data)
+ {
+ if (prev)
+ prev->next = tmp->next;
+ if (list == tmp)
+ list = list->next;
+
+ tmp->next = NULL;
+ g_slist_free (tmp);
+
+ break;
+ }
+
+ prev = tmp;
+ tmp = tmp->next;
+ }
+
+ return list;
+}
+
+GSList*
+g_slist_remove_link (GSList *list,
+ GSList *link)
+{
+ GSList *tmp;
+ GSList *prev;
+
+ prev = NULL;
+ tmp = list;
+
+ while (tmp)
+ {
+ if (tmp == link)
+ {
+ if (prev)
+ prev->next = tmp->next;
+ if (list == tmp)
+ list = list->next;
+
+ tmp->next = NULL;
+ break;
+ }
+
+ prev = tmp;
+ tmp = tmp->next;
+ }
+
+ return list;
+}
+
+GSList*
+g_slist_copy (GSList *list)
+{
+ GSList *new_list = NULL;
+
+ if (list)
+ {
+ GSList *last;
+
+ new_list = g_slist_alloc ();
+ new_list->data = list->data;
+ last = new_list;
+ list = list->next;
+ while (list)
+ {
+ last->next = g_slist_alloc ();
+ last = last->next;
+ last->data = list->data;
+ list = list->next;
+ }
+ }
+
+ return new_list;
+}
+
+GSList*
+g_slist_reverse (GSList *list)
+{
+ GSList *prev = NULL;
+
+ while (list)
+ {
+ GSList *next = list->next;
+
+ list->next = prev;
+
+ prev = list;
+ list = next;
+ }
+
+ return prev;
+}
+
+GSList*
+g_slist_nth (GSList *list,
+ guint n)
+{
+ while ((n-- > 0) && list)
+ list = list->next;
+
+ return list;
+}
+
+gpointer
+g_slist_nth_data (GSList *list,
+ guint n)
+{
+ while ((n-- > 0) && list)
+ list = list->next;
+
+ return list ? list->data : NULL;
+}
+
+GSList*
+g_slist_find (GSList *list,
+ gpointer data)
+{
+ while (list)
+ {
+ if (list->data == data)
+ break;
+ list = list->next;
+ }
+
+ return list;
+}
+
+GSList*
+g_slist_find_custom (GSList *list,
+ gpointer data,
+ GCompareFunc func)
+{
+ g_return_val_if_fail (func != NULL, list);
+
+ while (list)
+ {
+ if (! func (list->data, data))
+ return list;
+ list = list->next;
+ }
+
+ return NULL;
+}
+
+gint
+g_slist_position (GSList *list,
+ GSList *link)
+{
+ gint i;
+
+ i = 0;
+ while (list)
+ {
+ if (list == link)
+ return i;
+ i++;
+ list = list->next;
+ }
+
+ return -1;
+}
+
+gint
+g_slist_index (GSList *list,
+ gpointer data)
+{
+ gint i;
+
+ i = 0;
+ while (list)
+ {
+ if (list->data == data)
+ return i;
+ i++;
+ list = list->next;
+ }
+
+ return -1;
+}
+
+GSList*
+g_slist_last (GSList *list)
+{
+ if (list)
+ {
+ while (list->next)
+ list = list->next;
+ }
+
+ return list;
+}
+
+guint
+g_slist_length (GSList *list)
+{
+ guint length;
+
+ length = 0;
+ while (list)
+ {
+ length++;
+ list = list->next;
+ }
+
+ return length;
+}
+
+void
+g_slist_foreach (GSList *list,
+ GFunc func,
+ gpointer user_data)
+{
+ while (list)
+ {
+ (*func) (list->data, user_data);
+ list = list->next;
+ }
+}
+
+GSList*
+g_slist_insert_sorted (GSList *list,
+ gpointer data,
+ GCompareFunc func)
+{
+ GSList *tmp_list = list;
+ GSList *prev_list = NULL;
+ GSList *new_list;
+ gint cmp;
+
+ g_return_val_if_fail (func != NULL, list);
+
+ if (!list)
+ {
+ new_list = g_slist_alloc();
+ new_list->data = data;
+ return new_list;
+ }
+
+ cmp = (*func) (data, tmp_list->data);
+
+ while ((tmp_list->next) && (cmp > 0))
+ {
+ prev_list = tmp_list;
+ tmp_list = tmp_list->next;
+ cmp = (*func) (data, tmp_list->data);
+ }
+
+ new_list = g_slist_alloc();
+ new_list->data = data;
+
+ if ((!tmp_list->next) && (cmp > 0))
+ {
+ tmp_list->next = new_list;
+ return list;
+ }
+
+ if (prev_list)
+ {
+ prev_list->next = new_list;
+ new_list->next = tmp_list;
+ return list;
+ }
+ else
+ {
+ new_list->next = list;
+ return new_list;
+ }
+}
+
+static GSList*
+g_slist_sort_merge (GSList *l1,
+ GSList *l2,
+ GCompareFunc compare_func)
+{
+ GSList list, *l;
+
+ l=&list;
+
+ while (l1 && l2)
+ {
+ if (compare_func(l1->data,l2->data) < 0)
+ {
+ l=l->next=l1;
+ l1=l1->next;
+ }
+ else
+ {
+ l=l->next=l2;
+ l2=l2->next;
+ }
+ }
+ l->next= l1 ? l1 : l2;
+
+ return list.next;
+}
+
+GSList*
+g_slist_sort (GSList *list,
+ GCompareFunc compare_func)
+{
+ GSList *l1, *l2;
+
+ if (!list)
+ return NULL;
+ if (!list->next)
+ return list;
+
+ l1 = list;
+ l2 = list->next;
+
+ while ((l2 = l2->next) != NULL)
+ {
+ if ((l2 = l2->next) == NULL)
+ break;
+ l1=l1->next;
+ }
+ l2 = l1->next;
+ l1->next = NULL;
+
+ return g_slist_sort_merge (g_slist_sort (list, compare_func),
+ g_slist_sort (l2, compare_func),
+ compare_func);
+}
diff -urN linux-2.4.1/net/korbit/kglib/gstrfuncs.c linux-2.4.1-korbit/net/korbit/kglib/gstrfuncs.c
--- linux-2.4.1/net/korbit/kglib/gstrfuncs.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/kglib/gstrfuncs.c Thu Feb 1 11:46:57 2001
@@ -0,0 +1,1308 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Modified by the GLib Team and others 1997-1999. See the AUTHORS
+ * file for a list of people on the GLib Team. See the ChangeLog
+ * files for a list of changes. These files are distributed with
+ * GLib at ftp://ftp.gtk.org/pub/gtk/.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <locale.h>
+#include <ctype.h> /* For tolower() */
+#if !defined (HAVE_STRSIGNAL) || !defined(NO_SYS_SIGLIST_DECL)
+#include <signal.h>
+#endif
+#include "glib.h"
+/* do not include <unistd.h> in this place since it
+ * inteferes with g_strsignal() on some OSes
+ */
+
+gchar*
+g_strdup (const gchar *str) {
+ gchar *new_str;
+
+ if (str)
+ {
+ new_str = g_new (char, strlen (str) + 1);
+ strcpy (new_str, str);
+ }
+ else
+ new_str = NULL;
+
+ return new_str;
+}
+
+gpointer
+g_memdup (gconstpointer mem,
+ guint byte_size)
+{
+ gpointer new_mem;
+
+ if (mem)
+ {
+ new_mem = g_malloc (byte_size);
+ memcpy (new_mem, mem, byte_size);
+ }
+ else
+ new_mem = NULL;
+
+ return new_mem;
+}
+
+gchar*
+g_strndup (const gchar *str,
+ guint n)
+{
+ gchar *new_str;
+
+ if (str)
+ {
+ new_str = g_new (gchar, n + 1);
+ strncpy (new_str, str, n);
+ new_str[n] = '\0';
+ }
+ else
+ new_str = NULL;
+
+ return new_str;
+}
+
+gchar*
+g_strnfill (guint length,
+ gchar fill_char)
+{
+ register gchar *str, *s, *end;
+
+ str = g_new (gchar, length + 1);
+ s = str;
+ end = str + length;
+ while (s < end)
+ *(s++) = fill_char;
+ *s = 0;
+
+ return str;
+}
+
+gchar*
+g_strdup_vprintf (const gchar *format,
+ va_list args1)
+{
+ gchar *buffer;
+ va_list args2;
+
+ G_VA_COPY (args2, args1);
+
+ buffer = g_new (gchar, g_printf_string_upper_bound (format, args1));
+
+ vsprintf (buffer, format, args2);
+ va_end (args2);
+
+ return buffer;
+}
+
+gchar*
+g_strdup_printf (const gchar *format,
+ ...)
+{
+ gchar *buffer;
+ va_list args;
+
+ va_start (args, format);
+ buffer = g_strdup_vprintf (format, args);
+ va_end (args);
+
+ return buffer;
+}
+
+gchar*
+g_strconcat (const gchar *string1, ...)
+{
+ guint l;
+ va_list args;
+ gchar *s;
+ gchar *concat;
+
+ g_return_val_if_fail (string1 != NULL, NULL);
+
+ l = 1 + strlen (string1);
+ va_start (args, string1);
+ s = va_arg (args, gchar*);
+ while (s)
+ {
+ l += strlen (s);
+ s = va_arg (args, gchar*);
+ }
+ va_end (args);
+
+ concat = g_new (gchar, l);
+ concat[0] = 0;
+
+ strcat (concat, string1);
+ va_start (args, string1);
+ s = va_arg (args, gchar*);
+ while (s)
+ {
+ strcat (concat, s);
+ s = va_arg (args, gchar*);
+ }
+ va_end (args);
+
+ return concat;
+}
+
+#ifndef __KORBIT__
+gdouble
+g_strtod (const gchar *nptr,
+ gchar **endptr)
+{
+ gchar *fail_pos_1;
+ gchar *fail_pos_2;
+ gdouble val_1;
+ gdouble val_2 = 0;
+
+ g_return_val_if_fail (nptr != NULL, 0);
+
+ fail_pos_1 = NULL;
+ fail_pos_2 = NULL;
+
+ val_1 = strtod (nptr, &fail_pos_1);
+
+ if (fail_pos_1 && fail_pos_1[0] != 0)
+ {
+ gchar *old_locale;
+
+ old_locale = g_strdup (setlocale (LC_NUMERIC, NULL));
+ setlocale (LC_NUMERIC, "C");
+ val_2 = strtod (nptr, &fail_pos_2);
+ setlocale (LC_NUMERIC, old_locale);
+ g_free (old_locale);
+ }
+
+ if (!fail_pos_1 || fail_pos_1[0] == 0 || fail_pos_1 >= fail_pos_2)
+ {
+ if (endptr)
+ *endptr = fail_pos_1;
+ return val_1;
+ }
+ else
+ {
+ if (endptr)
+ *endptr = fail_pos_2;
+ return val_2;
+ }
+}
+#endif /* !__KORBIT__ */
+
+gchar*
+g_strerror (gint errnum)
+{
+#ifndef __KORBIT__
+ static GStaticPrivate msg_private = G_STATIC_PRIVATE_INIT;
+ char *msg;
+#endif
+
+#ifdef __KORBIT__
+#undef HAVE_STRERROR
+#define NO_SYS_ERRLIST 1
+#endif
+
+#if defined(HAVE_STRERROR)
+ return strerror (errnum);
+#elif NO_SYS_ERRLIST
+ switch (errnum)
+ {
+#ifdef E2BIG
+ case E2BIG: return "argument list too long";
+#endif
+#ifdef EACCES
+ case EACCES: return "permission denied";
+#endif
+#ifdef EADDRINUSE
+ case EADDRINUSE: return "address already in use";
+#endif
+#ifdef EADDRNOTAVAIL
+ case EADDRNOTAVAIL: return "can't assign requested address";
+#endif
+#ifdef EADV
+ case EADV: return "advertise error";
+#endif
+#ifdef EAFNOSUPPORT
+ case EAFNOSUPPORT: return "address family not supported by protocol family";
+#endif
+#ifdef EAGAIN
+ case EAGAIN: return "try again";
+#endif
+#ifdef EALIGN
+ case EALIGN: return "EALIGN";
+#endif
+#ifdef EALREADY
+ case EALREADY: return "operation already in progress";
+#endif
+#ifdef EBADE
+ case EBADE: return "bad exchange descriptor";
+#endif
+#ifdef EBADF
+ case EBADF: return "bad file number";
+#endif
+#ifdef EBADFD
+ case EBADFD: return "file descriptor in bad state";
+#endif
+#ifdef EBADMSG
+ case EBADMSG: return "not a data message";
+#endif
+#ifdef EBADR
+ case EBADR: return "bad request descriptor";
+#endif
+#ifdef EBADRPC
+ case EBADRPC: return "RPC structure is bad";
+#endif
+#ifdef EBADRQC
+ case EBADRQC: return "bad request code";
+#endif
+#ifdef EBADSLT
+ case EBADSLT: return "invalid slot";
+#endif
+#ifdef EBFONT
+ case EBFONT: return "bad font file format";
+#endif
+#ifdef EBUSY
+ case EBUSY: return "mount device busy";
+#endif
+#ifdef ECHILD
+ case ECHILD: return "no children";
+#endif
+#ifdef ECHRNG
+ case ECHRNG: return "channel number out of range";
+#endif
+#ifdef ECOMM
+ case ECOMM: return "communication error on send";
+#endif
+#ifdef ECONNABORTED
+ case ECONNABORTED: return "software caused connection abort";
+#endif
+#ifdef ECONNREFUSED
+ case ECONNREFUSED: return "connection refused";
+#endif
+#ifdef ECONNRESET
+ case ECONNRESET: return "connection reset by peer";
+#endif
+#if defined(EDEADLK) && (!defined(EWOULDBLOCK) || (EDEADLK != EWOULDBLOCK)) && (!defined(EDEADLOCK) || (EDEADLK != EDEADLOCK))
+ case EDEADLK: return "resource deadlock avoided";
+#endif
+#ifdef EDEADLOCK
+ case EDEADLOCK: return "resource deadlock avoided";
+#endif
+#ifdef EDESTADDRREQ
+ case EDESTADDRREQ: return "destination address required";
+#endif
+#ifdef EDIRTY
+ case EDIRTY: return "mounting a dirty fs w/o force";
+#endif
+#ifdef EDOM
+ case EDOM: return "math argument out of range";
+#endif
+#ifdef EDOTDOT
+ case EDOTDOT: return "cross mount point";
+#endif
+#ifdef EDQUOT
+ case EDQUOT: return "disk quota exceeded";
+#endif
+#ifdef EDUPPKG
+ case EDUPPKG: return "duplicate package name";
+#endif
+#ifdef EEXIST
+ case EEXIST: return "file already exists";
+#endif
+#ifdef EFAULT
+ case EFAULT: return "bad address in system call argument";
+#endif
+#ifdef EFBIG
+ case EFBIG: return "file too large";
+#endif
+#ifdef EHOSTDOWN
+ case EHOSTDOWN: return "host is down";
+#endif
+#ifdef EHOSTUNREACH
+ case EHOSTUNREACH: return "host is unreachable";
+#endif
+#ifdef EIDRM
+ case EIDRM: return "identifier removed";
+#endif
+#ifdef EINIT
+ case EINIT: return "initialization error";
+#endif
+#ifdef EINPROGRESS
+ case EINPROGRESS: return "operation now in progress";
+#endif
+#ifdef EINTR
+ case EINTR: return "interrupted system call";
+#endif
+#ifdef EINVAL
+ case EINVAL: return "invalid argument";
+#endif
+#ifdef EIO
+ case EIO: return "I/O error";
+#endif
+#ifdef EISCONN
+ case EISCONN: return "socket is already connected";
+#endif
+#ifdef EISDIR
+ case EISDIR: return "illegal operation on a directory";
+#endif
+#ifdef EISNAME
+ case EISNAM: return "is a name file";
+#endif
+#ifdef ELBIN
+ case ELBIN: return "ELBIN";
+#endif
+#ifdef EL2HLT
+ case EL2HLT: return "level 2 halted";
+#endif
+#ifdef EL2NSYNC
+ case EL2NSYNC: return "level 2 not synchronized";
+#endif
+#ifdef EL3HLT
+ case EL3HLT: return "level 3 halted";
+#endif
+#ifdef EL3RST
+ case EL3RST: return "level 3 reset";
+#endif
+#ifdef ELIBACC
+ case ELIBACC: return "can not access a needed shared library";
+#endif
+#ifdef ELIBBAD
+ case ELIBBAD: return "accessing a corrupted shared library";
+#endif
+#ifdef ELIBEXEC
+ case ELIBEXEC: return "can not exec a shared library directly";
+#endif
+#ifdef ELIBMAX
+ case ELIBMAX: return "attempting to link in more shared libraries than system limit";
+#endif
+#ifdef ELIBSCN
+ case ELIBSCN: return ".lib section in a.out corrupted";
+#endif
+#ifdef ELNRNG
+ case ELNRNG: return "link number out of range";
+#endif
+#ifdef ELOOP
+ case ELOOP: return "too many levels of symbolic links";
+#endif
+#ifdef EMFILE
+ case EMFILE: return "too many open files";
+#endif
+#ifdef EMLINK
+ case EMLINK: return "too many links";
+#endif
+#ifdef EMSGSIZE
+ case EMSGSIZE: return "message too long";
+#endif
+#ifdef EMULTIHOP
+ case EMULTIHOP: return "multihop attempted";
+#endif
+#ifdef ENAMETOOLONG
+ case ENAMETOOLONG: return "file name too long";
+#endif
+#ifdef ENAVAIL
+ case ENAVAIL: return "not available";
+#endif
+#ifdef ENET
+ case ENET: return "ENET";
+#endif
+#ifdef ENETDOWN
+ case ENETDOWN: return "network is down";
+#endif
+#ifdef ENETRESET
+ case ENETRESET: return "network dropped connection on reset";
+#endif
+#ifdef ENETUNREACH
+ case ENETUNREACH: return "network is unreachable";
+#endif
+#ifdef ENFILE
+ case ENFILE: return "file table overflow";
+#endif
+#ifdef ENOANO
+ case ENOANO: return "anode table overflow";
+#endif
+#if defined(ENOBUFS) && (!defined(ENOSR) || (ENOBUFS != ENOSR))
+ case ENOBUFS: return "no buffer space available";
+#endif
+#ifdef ENOCSI
+ case ENOCSI: return "no CSI structure available";
+#endif
+#ifdef ENODATA
+ case ENODATA: return "no data available";
+#endif
+#ifdef ENODEV
+ case ENODEV: return "no such device";
+#endif
+#ifdef ENOENT
+ case ENOENT: return "no such file or directory";
+#endif
+#ifdef ENOEXEC
+ case ENOEXEC: return "exec format error";
+#endif
+#ifdef ENOLCK
+ case ENOLCK: return "no locks available";
+#endif
+#ifdef ENOLINK
+ case ENOLINK: return "link has be severed";
+#endif
+#ifdef ENOMEM
+ case ENOMEM: return "not enough memory";
+#endif
+#ifdef ENOMSG
+ case ENOMSG: return "no message of desired type";
+#endif
+#ifdef ENONET
+ case ENONET: return "machine is not on the network";
+#endif
+#ifdef ENOPKG
+ case ENOPKG: return "package not installed";
+#endif
+#ifdef ENOPROTOOPT
+ case ENOPROTOOPT: return "bad proocol option";
+#endif
+#ifdef ENOSPC
+ case ENOSPC: return "no space left on device";
+#endif
+#ifdef ENOSR
+ case ENOSR: return "out of stream resources";
+#endif
+#ifdef ENOSTR
+ case ENOSTR: return "not a stream device";
+#endif
+#ifdef ENOSYM
+ case ENOSYM: return "unresolved symbol name";
+#endif
+#ifdef ENOSYS
+ case ENOSYS: return "function not implemented";
+#endif
+#ifdef ENOTBLK
+ case ENOTBLK: return "block device required";
+#endif
+#ifdef ENOTCONN
+ case ENOTCONN: return "socket is not connected";
+#endif
+#ifdef ENOTDIR
+ case ENOTDIR: return "not a directory";
+#endif
+#ifdef ENOTEMPTY
+ case ENOTEMPTY: return "directory not empty";
+#endif
+#ifdef ENOTNAM
+ case ENOTNAM: return "not a name file";
+#endif
+#ifdef ENOTSOCK
+ case ENOTSOCK: return "socket operation on non-socket";
+#endif
+#ifdef ENOTTY
+ case ENOTTY: return "inappropriate device for ioctl";
+#endif
+#ifdef ENOTUNIQ
+ case ENOTUNIQ: return "name not unique on network";
+#endif
+#ifdef ENXIO
+ case ENXIO: return "no such device or address";
+#endif
+#ifdef EOPNOTSUPP
+ case EOPNOTSUPP: return "operation not supported on socket";
+#endif
+#ifdef EPERM
+ case EPERM: return "not owner";
+#endif
+#ifdef EPFNOSUPPORT
+ case EPFNOSUPPORT: return "protocol family not supported";
+#endif
+#ifdef EPIPE
+ case EPIPE: return "broken pipe";
+#endif
+#ifdef EPROCLIM
+ case EPROCLIM: return "too many processes";
+#endif
+#ifdef EPROCUNAVAIL
+ case EPROCUNAVAIL: return "bad procedure for program";
+#endif
+#ifdef EPROGMISMATCH
+ case EPROGMISMATCH: return "program version wrong";
+#endif
+#ifdef EPROGUNAVAIL
+ case EPROGUNAVAIL: return "RPC program not available";
+#endif
+#ifdef EPROTO
+ case EPROTO: return "protocol error";
+#endif
+#ifdef EPROTONOSUPPORT
+ case EPROTONOSUPPORT: return "protocol not suppored";
+#endif
+#ifdef EPROTOTYPE
+ case EPROTOTYPE: return "protocol wrong type for socket";
+#endif
+#ifdef ERANGE
+ case ERANGE: return "math result unrepresentable";
+#endif
+#if defined(EREFUSED) && (!defined(ECONNREFUSED) || (EREFUSED != ECONNREFUSED))
+ case EREFUSED: return "EREFUSED";
+#endif
+#ifdef EREMCHG
+ case EREMCHG: return "remote address changed";
+#endif
+#ifdef EREMDEV
+ case EREMDEV: return "remote device";
+#endif
+#ifdef EREMOTE
+ case EREMOTE: return "pathname hit remote file system";
+#endif
+#ifdef EREMOTEIO
+ case EREMOTEIO: return "remote i/o error";
+#endif
+#ifdef EREMOTERELEASE
+ case EREMOTERELEASE: return "EREMOTERELEASE";
+#endif
+#ifdef EROFS
+ case EROFS: return "read-only file system";
+#endif
+#ifdef ERPCMISMATCH
+ case ERPCMISMATCH: return "RPC version is wrong";
+#endif
+#ifdef ERREMOTE
+ case ERREMOTE: return "object is remote";
+#endif
+#ifdef ESHUTDOWN
+ case ESHUTDOWN: return "can't send afer socket shutdown";
+#endif
+#ifdef ESOCKTNOSUPPORT
+ case ESOCKTNOSUPPORT: return "socket type not supported";
+#endif
+#ifdef ESPIPE
+ case ESPIPE: return "invalid seek";
+#endif
+#ifdef ESRCH
+ case ESRCH: return "no such process";
+#endif
+#ifdef ESRMNT
+ case ESRMNT: return "srmount error";
+#endif
+#ifdef ESTALE
+ case ESTALE: return "stale remote file handle";
+#endif
+#ifdef ESUCCESS
+ case ESUCCESS: return "Error 0";
+#endif
+#ifdef ETIME
+ case ETIME: return "timer expired";
+#endif
+#ifdef ETIMEDOUT
+ case ETIMEDOUT: return "connection timed out";
+#endif
+#ifdef ETOOMANYREFS
+ case ETOOMANYREFS: return "too many references: can't splice";
+#endif
+#ifdef ETXTBSY
+ case ETXTBSY: return "text file or pseudo-device busy";
+#endif
+#ifdef EUCLEAN
+ case EUCLEAN: return "structure needs cleaning";
+#endif
+#ifdef EUNATCH
+ case EUNATCH: return "protocol driver not attached";
+#endif
+#ifdef EUSERS
+ case EUSERS: return "too many users";
+#endif
+#ifdef EVERSION
+ case EVERSION: return "version mismatch";
+#endif
+#if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN))
+ case EWOULDBLOCK: return "operation would block";
+#endif
+#ifdef EXDEV
+ case EXDEV: return "cross-domain link";
+#endif
+#ifdef EXFULL
+ case EXFULL: return "message tables full";
+#endif
+ }
+#else /* NO_SYS_ERRLIST */
+ extern int sys_nerr;
+ extern char *sys_errlist[];
+
+ if ((errnum > 0) && (errnum <= sys_nerr))
+ return sys_errlist [errnum];
+#endif /* NO_SYS_ERRLIST */
+
+#ifndef __KORBIT__
+ msg = g_static_private_get (&msg_private);
+ if (!msg)
+ {
+ msg = g_new (gchar, 64);
+ g_static_private_set (&msg_private, msg, g_free);
+ }
+
+ sprintf (msg, "unknown error (%d)", errnum);
+
+ return msg;
+#else
+ return "unknown error";
+#endif /* !__KORBIT__ */
+}
+
+gchar*
+g_strsignal (gint signum)
+{
+#ifndef __KORBIT__
+ static GStaticPrivate msg_private = G_STATIC_PRIVATE_INIT;
+ char *msg;
+#endif
+
+#ifdef HAVE_STRSIGNAL
+ extern char *strsignal (int sig);
+ return strsignal (signum);
+#elif NO_SYS_SIGLIST
+ switch (signum)
+ {
+#ifdef SIGHUP
+ case SIGHUP: return "Hangup";
+#endif
+#ifdef SIGINT
+ case SIGINT: return "Interrupt";
+#endif
+#ifdef SIGQUIT
+ case SIGQUIT: return "Quit";
+#endif
+#ifdef SIGILL
+ case SIGILL: return "Illegal instruction";
+#endif
+#ifdef SIGTRAP
+ case SIGTRAP: return "Trace/breakpoint trap";
+#endif
+#ifdef SIGABRT
+ case SIGABRT: return "IOT trap/Abort";
+#endif
+#ifdef SIGBUS
+ case SIGBUS: return "Bus error";
+#endif
+#ifdef SIGFPE
+ case SIGFPE: return "Floating point exception";
+#endif
+#ifdef SIGKILL
+ case SIGKILL: return "Killed";
+#endif
+#ifdef SIGUSR1
+ case SIGUSR1: return "User defined signal 1";
+#endif
+#ifdef SIGSEGV
+ case SIGSEGV: return "Segmentation fault";
+#endif
+#ifdef SIGUSR2
+ case SIGUSR2: return "User defined signal 2";
+#endif
+#ifdef SIGPIPE
+ case SIGPIPE: return "Broken pipe";
+#endif
+#ifdef SIGALRM
+ case SIGALRM: return "Alarm clock";
+#endif
+#ifdef SIGTERM
+ case SIGTERM: return "Terminated";
+#endif
+#ifdef SIGSTKFLT
+ case SIGSTKFLT: return "Stack fault";
+#endif
+#ifdef SIGCHLD
+ case SIGCHLD: return "Child exited";
+#endif
+#ifdef SIGCONT
+ case SIGCONT: return "Continued";
+#endif
+#ifdef SIGSTOP
+ case SIGSTOP: return "Stopped (signal)";
+#endif
+#ifdef SIGTSTP
+ case SIGTSTP: return "Stopped";
+#endif
+#ifdef SIGTTIN
+ case SIGTTIN: return "Stopped (tty input)";
+#endif
+#ifdef SIGTTOU
+ case SIGTTOU: return "Stopped (tty output)";
+#endif
+#ifdef SIGURG
+ case SIGURG: return "Urgent condition";
+#endif
+#ifdef SIGXCPU
+ case SIGXCPU: return "CPU time limit exceeded";
+#endif
+#ifdef SIGXFSZ
+ case SIGXFSZ: return "File size limit exceeded";
+#endif
+#ifdef SIGVTALRM
+ case SIGVTALRM: return "Virtual time alarm";
+#endif
+#ifdef SIGPROF
+ case SIGPROF: return "Profile signal";
+#endif
+#ifdef SIGWINCH
+ case SIGWINCH: return "Window size changed";
+#endif
+#ifdef SIGIO
+ case SIGIO: return "Possible I/O";
+#endif
+#ifdef SIGPWR
+ case SIGPWR: return "Power failure";
+#endif
+#ifdef SIGUNUSED
+ case SIGUNUSED: return "Unused signal";
+#endif
+ }
+#else /* NO_SYS_SIGLIST */
+
+#ifdef NO_SYS_SIGLIST_DECL
+ extern char *sys_siglist[]; /*(see Tue Jan 19 00:44:24 1999 in changelog)*/
+#endif
+
+ return (char*) /* this function should return const --josh */ sys_siglist [signum];
+#endif /* NO_SYS_SIGLIST */
+
+#ifndef __KORBIT__
+ msg = g_static_private_get (&msg_private);
+ if (!msg)
+ {
+ msg = g_new (gchar, 64);
+ g_static_private_set (&msg_private, msg, g_free);
+ }
+
+ sprintf (msg, "unknown signal (%d)", signum);
+
+ return msg;
+#else
+ return "unknown error";
+#endif /* !__KORBIT__ */
+}
+
+guint
+g_printf_string_upper_bound (const gchar* format,
+ va_list args)
+{
+ guint len = 1;
+
+ while (*format)
+ {
+ gboolean long_int = FALSE;
+ gboolean extra_long = FALSE;
+ gchar c;
+
+ c = *format++;
+
+ if (c == '%')
+ {
+ gboolean done = FALSE;
+
+ while (*format && !done)
+ {
+ switch (*format++)
+ {
+ gchar *string_arg;
+
+ case '*':
+ len += va_arg (args, int);
+ break;
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ /* add specified format length, since it might exceed the
+ * size we assume it to have.
+ */
+ format -= 1;
+ len += strtol (format, (char**) &format, 10);
+ break;
+ case 'h':
+ /* ignore short int flag, since all args have at least the
+ * same size as an int
+ */
+ break;
+ case 'l':
+ if (long_int)
+ extra_long = TRUE; /* linux specific */
+ else
+ long_int = TRUE;
+ break;
+ case 'q':
+ case 'L':
+ long_int = TRUE;
+ extra_long = TRUE;
+ break;
+ case 's':
+ string_arg = va_arg (args, char *);
+ if (string_arg)
+ len += strlen (string_arg);
+ else
+ {
+ /* add enough padding to hold "(null)" identifier */
+ len += 16;
+ }
+ done = TRUE;
+ break;
+ case 'd':
+ case 'i':
+ case 'o':
+ case 'u':
+ case 'x':
+ case 'X':
+#ifdef G_HAVE_GINT64
+ if (extra_long)
+ (void) va_arg (args, gint64);
+ else
+#endif /* G_HAVE_GINT64 */
+ {
+ if (long_int)
+ (void) va_arg (args, long);
+ else
+ (void) va_arg (args, int);
+ }
+ len += extra_long ? 64 : 32;
+ done = TRUE;
+ break;
+ case 'D':
+ case 'O':
+ case 'U':
+ (void) va_arg (args, long);
+ len += 32;
+ done = TRUE;
+ break;
+ case 'e':
+ case 'E':
+ case 'f':
+ case 'g':
+#ifdef HAVE_LONG_DOUBLE
+ if (extra_long)
+ (void) va_arg (args, long double);
+ else
+#endif /* HAVE_LONG_DOUBLE */
+ (void) va_arg (args, double);
+ len += extra_long ? 128 : 64;
+ done = TRUE;
+ break;
+ case 'c':
+ (void) va_arg (args, int);
+ len += 1;
+ done = TRUE;
+ break;
+ case 'p':
+ case 'n':
+ (void) va_arg (args, void*);
+ len += 32;
+ done = TRUE;
+ break;
+ case '%':
+ len += 1;
+ done = TRUE;
+ break;
+ default:
+ /* ignore unknow/invalid flags */
+ break;
+ }
+ }
+ }
+ else
+ len += 1;
+ }
+
+ return len;
+}
+
+void
+g_strdown (gchar *string)
+{
+ register guchar *s;
+
+ g_return_if_fail (string != NULL);
+
+ s = string;
+
+ while (*s)
+ {
+ *s = tolower (*s);
+ s++;
+ }
+}
+
+void
+g_strup (gchar *string)
+{
+ register guchar *s;
+
+ g_return_if_fail (string != NULL);
+
+ s = string;
+
+ while (*s)
+ {
+ *s = toupper (*s);
+ s++;
+ }
+}
+
+void
+g_strreverse (gchar *string)
+{
+ g_return_if_fail (string != NULL);
+
+ if (*string)
+ {
+ register gchar *h, *t;
+
+ h = string;
+ t = string + strlen (string) - 1;
+
+ while (h < t)
+ {
+ register gchar c;
+
+ c = *h;
+ *h = *t;
+ h++;
+ *t = c;
+ t--;
+ }
+ }
+}
+
+gint
+g_strcasecmp (const gchar *s1,
+ const gchar *s2)
+{
+#ifdef HAVE_STRCASECMP
+ g_return_val_if_fail (s1 != NULL, 0);
+ g_return_val_if_fail (s2 != NULL, 0);
+
+ return strcasecmp (s1, s2);
+#else
+ gint c1, c2;
+
+ g_return_val_if_fail (s1 != NULL, 0);
+ g_return_val_if_fail (s2 != NULL, 0);
+
+ while (*s1 && *s2)
+ {
+ /* According to A. Cox, some platforms have islower's that
+ * don't work right on non-uppercase
+ */
+ c1 = isupper ((guchar)*s1) ? tolower ((guchar)*s1) : *s1;
+ c2 = isupper ((guchar)*s2) ? tolower ((guchar)*s2) : *s2;
+ if (c1 != c2)
+ return (c1 - c2);
+ s1++; s2++;
+ }
+
+ return (((gint)(guchar) *s1) - ((gint)(guchar) *s2));
+#endif
+}
+
+gint
+g_strncasecmp (const gchar *s1,
+ const gchar *s2,
+ guint n)
+{
+#ifdef HAVE_STRNCASECMP
+ return strncasecmp (s1, s2, n);
+#else
+ gint c1, c2;
+
+ g_return_val_if_fail (s1 != NULL, 0);
+ g_return_val_if_fail (s2 != NULL, 0);
+
+ while (n-- && *s1 && *s2)
+ {
+ /* According to A. Cox, some platforms have islower's that
+ * don't work right on non-uppercase
+ */
+ c1 = isupper ((guchar)*s1) ? tolower ((guchar)*s1) : *s1;
+ c2 = isupper ((guchar)*s2) ? tolower ((guchar)*s2) : *s2;
+ if (c1 != c2)
+ return (c1 - c2);
+ s1++; s2++;
+ }
+
+ if (n)
+ return (((gint)(guchar) *s1) - ((gint)(guchar) *s2));
+ else
+ return 0;
+#endif
+}
+
+gchar*
+g_strdelimit (gchar *string,
+ const gchar *delimiters,
+ gchar new_delim)
+{
+ register gchar *c;
+
+ g_return_val_if_fail (string != NULL, NULL);
+
+ if (!delimiters)
+ delimiters = G_STR_DELIMITERS;
+
+ for (c = string; *c; c++)
+ {
+ if (strchr (delimiters, *c))
+ *c = new_delim;
+ }
+
+ return string;
+}
+
+gchar*
+g_strescape (gchar *string)
+{
+ gchar *q;
+ gchar *escaped;
+ guint backslashes = 0;
+ gchar *p = string;
+
+ g_return_val_if_fail (string != NULL, NULL);
+
+ while (*p != '\000')
+ backslashes += (*p++ == '\\');
+
+ if (!backslashes)
+ return g_strdup (string);
+
+ escaped = g_new (gchar, strlen (string) + backslashes + 1);
+
+ p = string;
+ q = escaped;
+
+ while (*p != '\000')
+ {
+ if (*p == '\\')
+ *q++ = '\\';
+ *q++ = *p++;
+ }
+ *q = '\000';
+
+ return escaped;
+}
+
+/* blame Elliot for these next five routines */
+gchar*
+g_strchug (gchar *string)
+{
+ guchar *start;
+
+ g_return_val_if_fail (string != NULL, NULL);
+
+ for (start = string; *start && isspace (*start); start++)
+ ;
+
+ g_memmove(string, start, strlen(start) + 1);
+
+ return string;
+}
+
+gchar*
+g_strchomp (gchar *string)
+{
+ gchar *s;
+
+ g_return_val_if_fail (string != NULL, NULL);
+
+ if (!*string)
+ return string;
+
+ for (s = string + strlen (string) - 1; s >= string && isspace ((guchar)*s);
+ s--)
+ *s = '\0';
+
+ return string;
+}
+
+gchar**
+g_strsplit (const gchar *string,
+ const gchar *delimiter,
+ gint max_tokens)
+{
+ GSList *string_list = NULL, *slist;
+ gchar **str_array, *s;
+ guint i, n = 1;
+
+ g_return_val_if_fail (string != NULL, NULL);
+ g_return_val_if_fail (delimiter != NULL, NULL);
+
+ if (max_tokens < 1)
+ max_tokens = G_MAXINT;
+
+ s = strstr (string, delimiter);
+ if (s)
+ {
+ guint delimiter_len = strlen (delimiter);
+
+ do
+ {
+ guint len;
+ gchar *new_string;
+
+ len = s - string;
+ new_string = g_new (gchar, len + 1);
+ strncpy (new_string, string, len);
+ new_string[len] = 0;
+ string_list = g_slist_prepend (string_list, new_string);
+ n++;
+ string = s + delimiter_len;
+ s = strstr (string, delimiter);
+ }
+ while (--max_tokens && s);
+ }
+ if (*string)
+ {
+ n++;
+ string_list = g_slist_prepend (string_list, g_strdup (string));
+ }
+
+ str_array = g_new (gchar*, n);
+
+ i = n - 1;
+
+ str_array[i--] = NULL;
+ for (slist = string_list; slist; slist = slist->next)
+ str_array[i--] = slist->data;
+
+ g_slist_free (string_list);
+
+ return str_array;
+}
+
+void
+g_strfreev (gchar **str_array)
+{
+ if (str_array)
+ {
+ int i;
+
+ for(i = 0; str_array[i] != NULL; i++)
+ g_free(str_array[i]);
+
+ g_free (str_array);
+ }
+}
+
+gchar*
+g_strjoinv (const gchar *separator,
+ gchar **str_array)
+{
+ gchar *string;
+
+ g_return_val_if_fail (str_array != NULL, NULL);
+
+ if (separator == NULL)
+ separator = "";
+
+ if (*str_array)
+ {
+ guint i, len;
+ guint separator_len;
+
+ separator_len = strlen (separator);
+ len = 1 + strlen (str_array[0]);
+ for(i = 1; str_array[i] != NULL; i++)
+ len += separator_len + strlen(str_array[i]);
+
+ string = g_new (gchar, len);
+ *string = 0;
+ strcat (string, *str_array);
+ for (i = 1; str_array[i] != NULL; i++)
+ {
+ strcat (string, separator);
+ strcat (string, str_array[i]);
+ }
+ }
+ else
+ string = g_strdup ("");
+
+ return string;
+}
+
+gchar*
+g_strjoin (const gchar *separator,
+ ...)
+{
+ gchar *string, *s;
+ va_list args;
+ guint len;
+ guint separator_len;
+
+ if (separator == NULL)
+ separator = "";
+
+ separator_len = strlen (separator);
+
+ va_start (args, separator);
+
+ s = va_arg (args, gchar*);
+
+ if (s)
+ {
+ len = strlen (s);
+
+ s = va_arg (args, gchar*);
+ while (s)
+ {
+ len += separator_len + strlen (s);
+ s = va_arg (args, gchar*);
+ }
+ va_end (args);
+
+ string = g_new (gchar, len + 1);
+ *string = 0;
+
+ va_start (args, separator);
+
+ s = va_arg (args, gchar*);
+ strcat (string, s);
+
+ s = va_arg (args, gchar*);
+ while (s)
+ {
+ strcat (string, separator);
+ strcat (string, s);
+ s = va_arg (args, gchar*);
+ }
+ }
+ else
+ string = g_strdup ("");
+
+ va_end (args);
+
+ return string;
+}
diff -urN linux-2.4.1/net/korbit/kglib/gstring.c linux-2.4.1-korbit/net/korbit/kglib/gstring.c
--- linux-2.4.1/net/korbit/kglib/gstring.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/kglib/gstring.c Thu Feb 1 11:46:57 2001
@@ -0,0 +1,508 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Modified by the GLib Team and others 1997-1999. See the AUTHORS
+ * file for a list of people on the GLib Team. See the ChangeLog
+ * files for a list of changes. These files are distributed with
+ * GLib at ftp://ftp.gtk.org/pub/gtk/.
+ */
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include "glib.h"
+
+
+typedef struct _GRealStringChunk GRealStringChunk;
+typedef struct _GRealString GRealString;
+
+struct _GRealStringChunk
+{
+ GHashTable *const_table;
+ GSList *storage_list;
+ gint storage_next;
+ gint this_size;
+ gint default_size;
+};
+
+struct _GRealString
+{
+ gchar *str;
+ gint len;
+ gint alloc;
+};
+
+G_LOCK_DEFINE_STATIC (string_mem_chunk);
+static GMemChunk *string_mem_chunk = NULL;
+
+/* Hash Functions.
+ */
+
+gint
+g_str_equal (gconstpointer v, gconstpointer v2)
+{
+ return strcmp ((const gchar*) v, (const gchar*)v2) == 0;
+}
+
+/* 31 bit hash function */
+guint
+g_str_hash (gconstpointer key)
+{
+ const char *p = key;
+ guint h = *p;
+
+ if (h)
+ for (p += 1; *p != '\0'; p++)
+ h = (h << 5) - h + *p;
+
+ return h;
+}
+
+/* String Chunks.
+ */
+
+GStringChunk*
+g_string_chunk_new (gint default_size)
+{
+ GRealStringChunk *new_chunk = g_new (GRealStringChunk, 1);
+ gint size = 1;
+
+ while (size < default_size)
+ size <<= 1;
+
+ new_chunk->const_table = NULL;
+ new_chunk->storage_list = NULL;
+ new_chunk->storage_next = size;
+ new_chunk->default_size = size;
+ new_chunk->this_size = size;
+
+ return (GStringChunk*) new_chunk;
+}
+
+void
+g_string_chunk_free (GStringChunk *fchunk)
+{
+ GRealStringChunk *chunk = (GRealStringChunk*) fchunk;
+ GSList *tmp_list;
+
+ g_return_if_fail (chunk != NULL);
+
+ if (chunk->storage_list)
+ {
+ for (tmp_list = chunk->storage_list; tmp_list; tmp_list = tmp_list->next)
+ g_free (tmp_list->data);
+
+ g_slist_free (chunk->storage_list);
+ }
+
+ if (chunk->const_table)
+ g_hash_table_destroy (chunk->const_table);
+
+ g_free (chunk);
+}
+
+gchar*
+g_string_chunk_insert (GStringChunk *fchunk,
+ const gchar *string)
+{
+ GRealStringChunk *chunk = (GRealStringChunk*) fchunk;
+ gint len = strlen (string);
+ char* pos;
+
+ g_return_val_if_fail (chunk != NULL, NULL);
+
+ if ((chunk->storage_next + len + 1) > chunk->this_size)
+ {
+ gint new_size = chunk->default_size;
+
+ while (new_size < len+1)
+ new_size <<= 1;
+
+ chunk->storage_list = g_slist_prepend (chunk->storage_list,
+ g_new (char, new_size));
+
+ chunk->this_size = new_size;
+ chunk->storage_next = 0;
+ }
+
+ pos = ((char*)chunk->storage_list->data) + chunk->storage_next;
+
+ strcpy (pos, string);
+
+ chunk->storage_next += len + 1;
+
+ return pos;
+}
+
+gchar*
+g_string_chunk_insert_const (GStringChunk *fchunk,
+ const gchar *string)
+{
+ GRealStringChunk *chunk = (GRealStringChunk*) fchunk;
+ char* lookup;
+
+ g_return_val_if_fail (chunk != NULL, NULL);
+
+ if (!chunk->const_table)
+ chunk->const_table = g_hash_table_new (g_str_hash, g_str_equal);
+
+ lookup = (char*) g_hash_table_lookup (chunk->const_table, (gchar *)string);
+
+ if (!lookup)
+ {
+ lookup = g_string_chunk_insert (fchunk, string);
+ g_hash_table_insert (chunk->const_table, lookup, lookup);
+ }
+
+ return lookup;
+}
+
+/* Strings.
+ */
+static gint
+nearest_pow (gint num)
+{
+ gint n = 1;
+
+ while (n < num)
+ n <<= 1;
+
+ return n;
+}
+
+static void
+g_string_maybe_expand (GRealString* string, gint len)
+{
+ if (string->len + len >= string->alloc)
+ {
+ string->alloc = nearest_pow (string->len + len + 1);
+ string->str = g_realloc (string->str, string->alloc);
+ }
+}
+
+GString*
+g_string_sized_new (guint dfl_size)
+{
+ GRealString *string;
+
+ G_LOCK (string_mem_chunk);
+ if (!string_mem_chunk)
+ string_mem_chunk = g_mem_chunk_new ("string mem chunk",
+ sizeof (GRealString),
+ 1024, G_ALLOC_AND_FREE);
+
+ string = g_chunk_new (GRealString, string_mem_chunk);
+ G_UNLOCK (string_mem_chunk);
+
+ string->alloc = 0;
+ string->len = 0;
+ string->str = NULL;
+
+ g_string_maybe_expand (string, MAX (dfl_size, 2));
+ string->str[0] = 0;
+
+ return (GString*) string;
+}
+
+GString*
+g_string_new (const gchar *init)
+{
+ GString *string;
+
+ string = g_string_sized_new (2);
+
+ if (init)
+ g_string_append (string, init);
+
+ return string;
+}
+
+void
+g_string_free (GString *string,
+ gint free_segment)
+{
+ g_return_if_fail (string != NULL);
+
+ if (free_segment)
+ g_free (string->str);
+
+ G_LOCK (string_mem_chunk);
+ g_mem_chunk_free (string_mem_chunk, string);
+ G_UNLOCK (string_mem_chunk);
+}
+
+GString*
+g_string_assign (GString *lval,
+ const gchar *rval)
+{
+ g_return_val_if_fail (lval != NULL, NULL);
+ g_return_val_if_fail (rval != NULL, NULL);
+
+ g_string_truncate (lval, 0);
+ g_string_append (lval, rval);
+
+ return lval;
+}
+
+GString*
+g_string_truncate (GString* fstring,
+ gint len)
+{
+ GRealString *string = (GRealString*)fstring;
+
+ g_return_val_if_fail (string != NULL, NULL);
+ g_return_val_if_fail (len >= 0, NULL);
+
+ string->len = len;
+
+ string->str[len] = 0;
+
+ return fstring;
+}
+
+GString*
+g_string_append (GString *fstring,
+ const gchar *val)
+{
+ GRealString *string = (GRealString*)fstring;
+ int len;
+
+ g_return_val_if_fail (string != NULL, NULL);
+ g_return_val_if_fail (val != NULL, fstring);
+
+ len = strlen (val);
+ g_string_maybe_expand (string, len);
+
+ strcpy (string->str + string->len, val);
+
+ string->len += len;
+
+ return fstring;
+}
+
+GString*
+g_string_append_c (GString *fstring,
+ gchar c)
+{
+ GRealString *string = (GRealString*)fstring;
+
+ g_return_val_if_fail (string != NULL, NULL);
+ g_string_maybe_expand (string, 1);
+
+ string->str[string->len++] = c;
+ string->str[string->len] = 0;
+
+ return fstring;
+}
+
+GString*
+g_string_prepend (GString *fstring,
+ const gchar *val)
+{
+ GRealString *string = (GRealString*)fstring;
+ gint len;
+
+ g_return_val_if_fail (string != NULL, NULL);
+ g_return_val_if_fail (val != NULL, fstring);
+
+ len = strlen (val);
+ g_string_maybe_expand (string, len);
+
+ g_memmove (string->str + len, string->str, string->len);
+
+ strncpy (string->str, val, len);
+
+ string->len += len;
+
+ string->str[string->len] = 0;
+
+ return fstring;
+}
+
+GString*
+g_string_prepend_c (GString *fstring,
+ gchar c)
+{
+ GRealString *string = (GRealString*)fstring;
+
+ g_return_val_if_fail (string != NULL, NULL);
+ g_string_maybe_expand (string, 1);
+
+ g_memmove (string->str + 1, string->str, string->len);
+
+ string->str[0] = c;
+
+ string->len += 1;
+
+ string->str[string->len] = 0;
+
+ return fstring;
+}
+
+GString*
+g_string_insert (GString *fstring,
+ gint pos,
+ const gchar *val)
+{
+ GRealString *string = (GRealString*)fstring;
+ gint len;
+
+ g_return_val_if_fail (string != NULL, NULL);
+ g_return_val_if_fail (val != NULL, fstring);
+ g_return_val_if_fail (pos >= 0, fstring);
+ g_return_val_if_fail (pos <= string->len, fstring);
+
+ len = strlen (val);
+ g_string_maybe_expand (string, len);
+
+ g_memmove (string->str + pos + len, string->str + pos, string->len - pos);
+
+ strncpy (string->str + pos, val, len);
+
+ string->len += len;
+
+ string->str[string->len] = 0;
+
+ return fstring;
+}
+
+GString *
+g_string_insert_c (GString *fstring,
+ gint pos,
+ gchar c)
+{
+ GRealString *string = (GRealString*)fstring;
+
+ g_return_val_if_fail (string != NULL, NULL);
+ g_return_val_if_fail (pos <= string->len, fstring);
+
+ g_string_maybe_expand (string, 1);
+
+ g_memmove (string->str + pos + 1, string->str + pos, string->len - pos);
+
+ string->str[pos] = c;
+
+ string->len += 1;
+
+ string->str[string->len] = 0;
+
+ return fstring;
+}
+
+GString*
+g_string_erase (GString *fstring,
+ gint pos,
+ gint len)
+{
+ GRealString *string = (GRealString*)fstring;
+
+ g_return_val_if_fail (string != NULL, NULL);
+ g_return_val_if_fail (len >= 0, fstring);
+ g_return_val_if_fail (pos >= 0, fstring);
+ g_return_val_if_fail (pos <= string->len, fstring);
+ g_return_val_if_fail (pos + len <= string->len, fstring);
+
+ if (pos + len < string->len)
+ g_memmove (string->str + pos, string->str + pos + len, string->len - (pos + len));
+
+ string->len -= len;
+
+ string->str[string->len] = 0;
+
+ return fstring;
+}
+
+GString*
+g_string_down (GString *fstring)
+{
+ GRealString *string = (GRealString*)fstring;
+ guchar *s;
+
+ g_return_val_if_fail (string != NULL, NULL);
+
+ s = string->str;
+
+ while (*s)
+ {
+ *s = tolower (*s);
+ s++;
+ }
+
+ return fstring;
+}
+
+GString*
+g_string_up (GString *fstring)
+{
+ GRealString *string = (GRealString*)fstring;
+ guchar *s;
+
+ g_return_val_if_fail (string != NULL, NULL);
+
+ s = string->str;
+
+ while (*s)
+ {
+ *s = toupper (*s);
+ s++;
+ }
+
+ return fstring;
+}
+
+static void
+g_string_sprintfa_int (GString *string,
+ const gchar *fmt,
+ va_list args)
+{
+ gchar *buffer;
+
+ buffer = g_strdup_vprintf (fmt, args);
+ g_string_append (string, buffer);
+ g_free (buffer);
+}
+
+void
+g_string_sprintf (GString *string,
+ const gchar *fmt,
+ ...)
+{
+ va_list args;
+
+ g_string_truncate (string, 0);
+
+ va_start (args, fmt);
+ g_string_sprintfa_int (string, fmt, args);
+ va_end (args);
+}
+
+void
+g_string_sprintfa (GString *string,
+ const gchar *fmt,
+ ...)
+{
+ va_list args;
+
+ va_start (args, fmt);
+ g_string_sprintfa_int (string, fmt, args);
+ va_end (args);
+}
diff -urN linux-2.4.1/net/korbit/kglib/gtree.c linux-2.4.1-korbit/net/korbit/kglib/gtree.c
--- linux-2.4.1/net/korbit/kglib/gtree.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/kglib/gtree.c Thu Feb 1 11:46:57 2001
@@ -0,0 +1,740 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Modified by the GLib Team and others 1997-1999. See the AUTHORS
+ * file for a list of people on the GLib Team. See the ChangeLog
+ * files for a list of changes. These files are distributed with
+ * GLib at ftp://ftp.gtk.org/pub/gtk/.
+ */
+
+#include "glib.h"
+
+
+typedef struct _GRealTree GRealTree;
+typedef struct _GTreeNode GTreeNode;
+
+struct _GRealTree
+{
+ GTreeNode *root;
+ GCompareFunc key_compare;
+};
+
+struct _GTreeNode
+{
+ gint balance; /* height (left) - height (right) */
+ GTreeNode *left; /* left subtree */
+ GTreeNode *right; /* right subtree */
+ gpointer key; /* key for this node */
+ gpointer value; /* value stored at this node */
+};
+
+
+static GTreeNode* g_tree_node_new (gpointer key,
+ gpointer value);
+static void g_tree_node_destroy (GTreeNode *node);
+static GTreeNode* g_tree_node_insert (GTreeNode *node,
+ GCompareFunc compare,
+ gpointer key,
+ gpointer value,
+ gint *inserted);
+static GTreeNode* g_tree_node_remove (GTreeNode *node,
+ GCompareFunc compare,
+ gpointer key);
+static GTreeNode* g_tree_node_balance (GTreeNode *node);
+static GTreeNode* g_tree_node_remove_leftmost (GTreeNode *node,
+ GTreeNode **leftmost);
+static GTreeNode* g_tree_node_restore_left_balance (GTreeNode *node,
+ gint old_balance);
+static GTreeNode* g_tree_node_restore_right_balance (GTreeNode *node,
+ gint old_balance);
+static gpointer g_tree_node_lookup (GTreeNode *node,
+ GCompareFunc compare,
+ gpointer key);
+static gint g_tree_node_count (GTreeNode *node);
+static gint g_tree_node_pre_order (GTreeNode *node,
+ GTraverseFunc traverse_func,
+ gpointer data);
+static gint g_tree_node_in_order (GTreeNode *node,
+ GTraverseFunc traverse_func,
+ gpointer data);
+static gint g_tree_node_post_order (GTreeNode *node,
+ GTraverseFunc traverse_func,
+ gpointer data);
+static gpointer g_tree_node_search (GTreeNode *node,
+ GSearchFunc search_func,
+ gpointer data);
+static gint g_tree_node_height (GTreeNode *node);
+static GTreeNode* g_tree_node_rotate_left (GTreeNode *node);
+static GTreeNode* g_tree_node_rotate_right (GTreeNode *node);
+static void g_tree_node_check (GTreeNode *node);
+
+
+G_LOCK_DEFINE_STATIC (g_tree_global);
+static GMemChunk *node_mem_chunk = NULL;
+static GTreeNode *node_free_list = NULL;
+
+
+static GTreeNode*
+g_tree_node_new (gpointer key,
+ gpointer value)
+{
+ GTreeNode *node;
+
+ G_LOCK (g_tree_global);
+ if (node_free_list)
+ {
+ node = node_free_list;
+ node_free_list = node->right;
+ }
+ else
+ {
+ if (!node_mem_chunk)
+ node_mem_chunk = g_mem_chunk_new ("GLib GTreeNode mem chunk",
+ sizeof (GTreeNode),
+ 1024,
+ G_ALLOC_ONLY);
+
+ node = g_chunk_new (GTreeNode, node_mem_chunk);
+ }
+ G_UNLOCK (g_tree_global);
+
+ node->balance = 0;
+ node->left = NULL;
+ node->right = NULL;
+ node->key = key;
+ node->value = value;
+
+ return node;
+}
+
+static void
+g_tree_node_destroy (GTreeNode *node)
+{
+ if (node)
+ {
+ g_tree_node_destroy (node->right);
+ g_tree_node_destroy (node->left);
+ G_LOCK (g_tree_global);
+ node->right = node_free_list;
+ node_free_list = node;
+ G_UNLOCK (g_tree_global);
+ }
+}
+
+
+GTree*
+g_tree_new (GCompareFunc key_compare_func)
+{
+ GRealTree *rtree;
+
+ g_return_val_if_fail (key_compare_func != NULL, NULL);
+
+ rtree = g_new (GRealTree, 1);
+ rtree->root = NULL;
+ rtree->key_compare = key_compare_func;
+
+ return (GTree*) rtree;
+}
+
+void
+g_tree_destroy (GTree *tree)
+{
+ GRealTree *rtree;
+
+ g_return_if_fail (tree != NULL);
+
+ rtree = (GRealTree*) tree;
+
+ g_tree_node_destroy (rtree->root);
+ g_free (rtree);
+}
+
+void
+g_tree_insert (GTree *tree,
+ gpointer key,
+ gpointer value)
+{
+ GRealTree *rtree;
+ gint inserted;
+
+ g_return_if_fail (tree != NULL);
+
+ rtree = (GRealTree*) tree;
+
+ inserted = FALSE;
+ rtree->root = g_tree_node_insert (rtree->root, rtree->key_compare,
+ key, value, &inserted);
+}
+
+void
+g_tree_remove (GTree *tree,
+ gpointer key)
+{
+ GRealTree *rtree;
+
+ g_return_if_fail (tree != NULL);
+
+ rtree = (GRealTree*) tree;
+
+ rtree->root = g_tree_node_remove (rtree->root, rtree->key_compare, key);
+}
+
+gpointer
+g_tree_lookup (GTree *tree,
+ gpointer key)
+{
+ GRealTree *rtree;
+
+ g_return_val_if_fail (tree != NULL, NULL);
+
+ rtree = (GRealTree*) tree;
+
+ return g_tree_node_lookup (rtree->root, rtree->key_compare, key);
+}
+
+void
+g_tree_traverse (GTree *tree,
+ GTraverseFunc traverse_func,
+ GTraverseType traverse_type,
+ gpointer data)
+{
+ GRealTree *rtree;
+
+ g_return_if_fail (tree != NULL);
+
+ rtree = (GRealTree*) tree;
+
+ if (!rtree->root)
+ return;
+
+ switch (traverse_type)
+ {
+ case G_PRE_ORDER:
+ g_tree_node_pre_order (rtree->root, traverse_func, data);
+ break;
+
+ case G_IN_ORDER:
+ g_tree_node_in_order (rtree->root, traverse_func, data);
+ break;
+
+ case G_POST_ORDER:
+ g_tree_node_post_order (rtree->root, traverse_func, data);
+ break;
+
+ case G_LEVEL_ORDER:
+ g_warning ("g_tree_traverse(): traverse type G_LEVEL_ORDER isn't implemented.");
+ break;
+ }
+}
+
+gpointer
+g_tree_search (GTree *tree,
+ GSearchFunc search_func,
+ gpointer data)
+{
+ GRealTree *rtree;
+
+ g_return_val_if_fail (tree != NULL, NULL);
+
+ rtree = (GRealTree*) tree;
+
+ if (rtree->root)
+ return g_tree_node_search (rtree->root, search_func, data);
+ else
+ return NULL;
+}
+
+gint
+g_tree_height (GTree *tree)
+{
+ GRealTree *rtree;
+
+ g_return_val_if_fail (tree != NULL, 0);
+
+ rtree = (GRealTree*) tree;
+
+ if (rtree->root)
+ return g_tree_node_height (rtree->root);
+ else
+ return 0;
+}
+
+gint
+g_tree_nnodes (GTree *tree)
+{
+ GRealTree *rtree;
+
+ g_return_val_if_fail (tree != NULL, 0);
+
+ rtree = (GRealTree*) tree;
+
+ if (rtree->root)
+ return g_tree_node_count (rtree->root);
+ else
+ return 0;
+}
+
+static GTreeNode*
+g_tree_node_insert (GTreeNode *node,
+ GCompareFunc compare,
+ gpointer key,
+ gpointer value,
+ gint *inserted)
+{
+ gint old_balance;
+ gint cmp;
+
+ if (!node)
+ {
+ *inserted = TRUE;
+ return g_tree_node_new (key, value);
+ }
+
+ cmp = (* compare) (key, node->key);
+ if (cmp == 0)
+ {
+ *inserted = FALSE;
+ node->value = value;
+ return node;
+ }
+
+ if (cmp < 0)
+ {
+ if (node->left)
+ {
+ old_balance = node->left->balance;
+ node->left = g_tree_node_insert (node->left, compare, key, value, inserted);
+
+ if ((old_balance != node->left->balance) && node->left->balance)
+ node->balance -= 1;
+ }
+ else
+ {
+ *inserted = TRUE;
+ node->left = g_tree_node_new (key, value);
+ node->balance -= 1;
+ }
+ }
+ else if (cmp > 0)
+ {
+ if (node->right)
+ {
+ old_balance = node->right->balance;
+ node->right = g_tree_node_insert (node->right, compare, key, value, inserted);
+
+ if ((old_balance != node->right->balance) && node->right->balance)
+ node->balance += 1;
+ }
+ else
+ {
+ *inserted = TRUE;
+ node->right = g_tree_node_new (key, value);
+ node->balance += 1;
+ }
+ }
+
+ if (*inserted)
+ {
+ if ((node->balance < -1) || (node->balance > 1))
+ node = g_tree_node_balance (node);
+ }
+
+ return node;
+}
+
+static GTreeNode*
+g_tree_node_remove (GTreeNode *node,
+ GCompareFunc compare,
+ gpointer key)
+{
+ GTreeNode *new_root;
+ gint old_balance;
+ gint cmp;
+
+ if (!node)
+ return NULL;
+
+ cmp = (* compare) (key, node->key);
+ if (cmp == 0)
+ {
+ GTreeNode *garbage;
+
+ garbage = node;
+
+ if (!node->right)
+ {
+ node = node->left;
+ }
+ else
+ {
+ old_balance = node->right->balance;
+ node->right = g_tree_node_remove_leftmost (node->right, &new_root);
+ new_root->left = node->left;
+ new_root->right = node->right;
+ new_root->balance = node->balance;
+ node = g_tree_node_restore_right_balance (new_root, old_balance);
+ }
+
+ G_LOCK (g_tree_global);
+ garbage->right = node_free_list;
+ node_free_list = garbage;
+ G_UNLOCK (g_tree_global);
+ }
+ else if (cmp < 0)
+ {
+ if (node->left)
+ {
+ old_balance = node->left->balance;
+ node->left = g_tree_node_remove (node->left, compare, key);
+ node = g_tree_node_restore_left_balance (node, old_balance);
+ }
+ }
+ else if (cmp > 0)
+ {
+ if (node->right)
+ {
+ old_balance = node->right->balance;
+ node->right = g_tree_node_remove (node->right, compare, key);
+ node = g_tree_node_restore_right_balance (node, old_balance);
+ }
+ }
+
+ return node;
+}
+
+static GTreeNode*
+g_tree_node_balance (GTreeNode *node)
+{
+ if (node->balance < -1)
+ {
+ if (node->left->balance > 0)
+ node->left = g_tree_node_rotate_left (node->left);
+ node = g_tree_node_rotate_right (node);
+ }
+ else if (node->balance > 1)
+ {
+ if (node->right->balance < 0)
+ node->right = g_tree_node_rotate_right (node->right);
+ node = g_tree_node_rotate_left (node);
+ }
+
+ return node;
+}
+
+static GTreeNode*
+g_tree_node_remove_leftmost (GTreeNode *node,
+ GTreeNode **leftmost)
+{
+ gint old_balance;
+
+ if (!node->left)
+ {
+ *leftmost = node;
+ return node->right;
+ }
+
+ old_balance = node->left->balance;
+ node->left = g_tree_node_remove_leftmost (node->left, leftmost);
+ return g_tree_node_restore_left_balance (node, old_balance);
+}
+
+static GTreeNode*
+g_tree_node_restore_left_balance (GTreeNode *node,
+ gint old_balance)
+{
+ if (!node->left)
+ node->balance += 1;
+ else if ((node->left->balance != old_balance) &&
+ (node->left->balance == 0))
+ node->balance += 1;
+
+ if (node->balance > 1)
+ return g_tree_node_balance (node);
+ return node;
+}
+
+static GTreeNode*
+g_tree_node_restore_right_balance (GTreeNode *node,
+ gint old_balance)
+{
+ if (!node->right)
+ node->balance -= 1;
+ else if ((node->right->balance != old_balance) &&
+ (node->right->balance == 0))
+ node->balance -= 1;
+
+ if (node->balance < -1)
+ return g_tree_node_balance (node);
+ return node;
+}
+
+static gpointer
+g_tree_node_lookup (GTreeNode *node,
+ GCompareFunc compare,
+ gpointer key)
+{
+ gint cmp;
+
+ if (!node)
+ return NULL;
+
+ cmp = (* compare) (key, node->key);
+ if (cmp == 0)
+ return node->value;
+
+ if (cmp < 0)
+ {
+ if (node->left)
+ return g_tree_node_lookup (node->left, compare, key);
+ }
+ else if (cmp > 0)
+ {
+ if (node->right)
+ return g_tree_node_lookup (node->right, compare, key);
+ }
+
+ return NULL;
+}
+
+static gint
+g_tree_node_count (GTreeNode *node)
+{
+ gint count;
+
+ count = 1;
+ if (node->left)
+ count += g_tree_node_count (node->left);
+ if (node->right)
+ count += g_tree_node_count (node->right);
+
+ return count;
+}
+
+static gint
+g_tree_node_pre_order (GTreeNode *node,
+ GTraverseFunc traverse_func,
+ gpointer data)
+{
+ if ((*traverse_func) (node->key, node->value, data))
+ return TRUE;
+ if (node->left)
+ {
+ if (g_tree_node_pre_order (node->left, traverse_func, data))
+ return TRUE;
+ }
+ if (node->right)
+ {
+ if (g_tree_node_pre_order (node->right, traverse_func, data))
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gint
+g_tree_node_in_order (GTreeNode *node,
+ GTraverseFunc traverse_func,
+ gpointer data)
+{
+ if (node->left)
+ {
+ if (g_tree_node_in_order (node->left, traverse_func, data))
+ return TRUE;
+ }
+ if ((*traverse_func) (node->key, node->value, data))
+ return TRUE;
+ if (node->right)
+ {
+ if (g_tree_node_in_order (node->right, traverse_func, data))
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gint
+g_tree_node_post_order (GTreeNode *node,
+ GTraverseFunc traverse_func,
+ gpointer data)
+{
+ if (node->left)
+ {
+ if (g_tree_node_post_order (node->left, traverse_func, data))
+ return TRUE;
+ }
+ if (node->right)
+ {
+ if (g_tree_node_post_order (node->right, traverse_func, data))
+ return TRUE;
+ }
+ if ((*traverse_func) (node->key, node->value, data))
+ return TRUE;
+
+ return FALSE;
+}
+
+static gpointer
+g_tree_node_search (GTreeNode *node,
+ GSearchFunc search_func,
+ gpointer data)
+{
+ gint dir;
+
+ if (!node)
+ return NULL;
+
+ do {
+ dir = (* search_func) (node->key, data);
+ if (dir == 0)
+ return node->value;
+
+ if (dir < 0)
+ node = node->left;
+ else if (dir > 0)
+ node = node->right;
+ } while (node && (dir != 0));
+
+ return NULL;
+}
+
+static gint
+g_tree_node_height (GTreeNode *node)
+{
+ gint left_height;
+ gint right_height;
+
+ if (node)
+ {
+ left_height = 0;
+ right_height = 0;
+
+ if (node->left)
+ left_height = g_tree_node_height (node->left);
+
+ if (node->right)
+ right_height = g_tree_node_height (node->right);
+
+ return MAX (left_height, right_height) + 1;
+ }
+
+ return 0;
+}
+
+static GTreeNode*
+g_tree_node_rotate_left (GTreeNode *node)
+{
+ GTreeNode *left;
+ GTreeNode *right;
+ gint a_bal;
+ gint b_bal;
+
+ left = node->left;
+ right = node->right;
+
+ node->right = right->left;
+ right->left = node;
+
+ a_bal = node->balance;
+ b_bal = right->balance;
+
+ if (b_bal <= 0)
+ {
+ if (a_bal >= 1)
+ right->balance = b_bal - 1;
+ else
+ right->balance = a_bal + b_bal - 2;
+ node->balance = a_bal - 1;
+ }
+ else
+ {
+ if (a_bal <= b_bal)
+ right->balance = a_bal - 2;
+ else
+ right->balance = b_bal - 1;
+ node->balance = a_bal - b_bal - 1;
+ }
+
+ return right;
+}
+
+static GTreeNode*
+g_tree_node_rotate_right (GTreeNode *node)
+{
+ GTreeNode *left;
+ gint a_bal;
+ gint b_bal;
+
+ left = node->left;
+
+ node->left = left->right;
+ left->right = node;
+
+ a_bal = node->balance;
+ b_bal = left->balance;
+
+ if (b_bal <= 0)
+ {
+ if (b_bal > a_bal)
+ left->balance = b_bal + 1;
+ else
+ left->balance = a_bal + 2;
+ node->balance = a_bal - b_bal + 1;
+ }
+ else
+ {
+ if (a_bal <= -1)
+ left->balance = b_bal + 1;
+ else
+ left->balance = a_bal + b_bal + 2;
+ node->balance = a_bal + 1;
+ }
+
+ return left;
+}
+
+static void
+g_tree_node_check (GTreeNode *node)
+{
+ gint left_height;
+ gint right_height;
+ gint balance;
+
+ if (node)
+ {
+ left_height = 0;
+ right_height = 0;
+
+ if (node->left)
+ left_height = g_tree_node_height (node->left);
+ if (node->right)
+ right_height = g_tree_node_height (node->right);
+
+ balance = right_height - left_height;
+ if (balance != node->balance)
+ g_log (g_log_domain_glib, G_LOG_LEVEL_INFO,
+ "g_tree_node_check: failed: %d ( %d )\n",
+ balance, node->balance);
+
+ if (node->left)
+ g_tree_node_check (node->left);
+ if (node->right)
+ g_tree_node_check (node->right);
+ }
+}
diff -urN linux-2.4.1/net/korbit/kglib/gutils.c linux-2.4.1-korbit/net/korbit/kglib/gutils.c
--- linux-2.4.1/net/korbit/kglib/gutils.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/kglib/gutils.c Thu Feb 1 11:46:57 2001
@@ -0,0 +1,915 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1998 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Modified by the GLib Team and others 1997-1999. See the AUTHORS
+ * file for a list of people on the GLib Team. See the ChangeLog
+ * files for a list of changes. These files are distributed with
+ * GLib at ftp://ftp.gtk.org/pub/gtk/.
+ */
+
+#define G_INLINE_FUNC extern
+#define G_CAN_INLINE 1
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#ifdef HAVE_PWD_H
+#include <pwd.h>
+#endif
+#include <sys/types.h>
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+
+#ifdef NATIVE_WIN32
+# define STRICT /* Strict typing, please */
+# include <windows.h>
+# include <direct.h>
+# include <errno.h>
+# include <ctype.h>
+# ifdef _MSC_VER
+# include <io.h>
+# endif /* _MSC_VER */
+#endif /* NATIVE_WIN32 */
+
+/* implement Glib's inline functions
+ */
+#include "glib.h"
+
+#ifdef MAXPATHLEN
+#define G_PATH_LENGTH (MAXPATHLEN + 1)
+#elif defined (PATH_MAX)
+#define G_PATH_LENGTH (PATH_MAX + 1)
+#else /* !MAXPATHLEN */
+#define G_PATH_LENGTH (2048 + 1)
+#endif /* !MAXPATHLEN && !PATH_MAX */
+
+const guint glib_major_version = 1;
+const guint glib_minor_version = 2;
+const guint glib_micro_version = 8;
+const guint glib_interface_age = 8;
+const guint glib_binary_age = 8;
+
+#if defined (NATIVE_WIN32) && defined (__LCC__)
+int __stdcall
+LibMain (void *hinstDll,
+ unsigned long dwReason,
+ void *reserved)
+{
+ return 1;
+}
+#endif /* NATIVE_WIN32 && __LCC__ */
+
+void
+g_atexit (GVoidFunc func)
+{
+ gint result;
+ gchar *error = NULL;
+
+ /* keep this in sync with glib.h */
+
+#ifdef G_NATIVE_ATEXIT
+ result = ATEXIT (func);
+ if (result)
+ error = g_strerror (errno);
+#elif defined (HAVE_ATEXIT)
+# ifdef NeXT /* @#%@! NeXTStep */
+ result = !atexit ((void (*)(void)) func);
+ if (result)
+ error = g_strerror (errno);
+# else
+ result = atexit ((void (*)(void)) func);
+ if (result)
+ error = g_strerror (errno);
+# endif /* NeXT */
+#elif defined (HAVE_ON_EXIT)
+ result = on_exit ((void (*)(int, void *)) func, NULL);
+ if (result)
+ error = g_strerror (errno);
+#else
+ result = 0;
+ error = "no implementation";
+#endif /* G_NATIVE_ATEXIT */
+
+ if (error)
+ g_error ("Could not register atexit() function: %s", error);
+}
+
+gint
+g_snprintf (gchar *str,
+ gulong n,
+ gchar const *fmt,
+ ...)
+{
+#ifdef HAVE_VSNPRINTF
+ va_list args;
+ gint retval;
+
+ g_return_val_if_fail (str != NULL, 0);
+ g_return_val_if_fail (n > 0, 0);
+ g_return_val_if_fail (fmt != NULL, 0);
+
+ va_start (args, fmt);
+ retval = vsnprintf (str, n, fmt, args);
+ va_end (args);
+
+ if (retval < 0)
+ {
+ str[n-1] = '\0';
+ retval = strlen (str);
+ }
+
+ return retval;
+#else /* !HAVE_VSNPRINTF */
+ gchar *printed;
+ va_list args;
+
+ g_return_val_if_fail (str != NULL, 0);
+ g_return_val_if_fail (n > 0, 0);
+ g_return_val_if_fail (fmt != NULL, 0);
+
+ va_start (args, fmt);
+ printed = g_strdup_vprintf (fmt, args);
+ va_end (args);
+
+ strncpy (str, printed, n);
+ str[n-1] = '\0';
+
+ g_free (printed);
+
+ return strlen (str);
+#endif /* !HAVE_VSNPRINTF */
+}
+
+gint
+g_vsnprintf (gchar *str,
+ gulong n,
+ gchar const *fmt,
+ va_list args)
+{
+#ifdef HAVE_VSNPRINTF
+ gint retval;
+
+ g_return_val_if_fail (str != NULL, 0);
+ g_return_val_if_fail (n > 0, 0);
+ g_return_val_if_fail (fmt != NULL, 0);
+
+ retval = vsnprintf (str, n, fmt, args);
+
+ if (retval < 0)
+ {
+ str[n-1] = '\0';
+ retval = strlen (str);
+ }
+
+ return retval;
+#else /* !HAVE_VSNPRINTF */
+ gchar *printed;
+
+ g_return_val_if_fail (str != NULL, 0);
+ g_return_val_if_fail (n > 0, 0);
+ g_return_val_if_fail (fmt != NULL, 0);
+
+ printed = g_strdup_vprintf (fmt, args);
+ strncpy (str, printed, n);
+ str[n-1] = '\0';
+
+ g_free (printed);
+
+ return strlen (str);
+#endif /* !HAVE_VSNPRINTF */
+}
+
+guint
+g_parse_debug_string (const gchar *string,
+ GDebugKey *keys,
+ guint nkeys)
+{
+ guint i;
+ guint result = 0;
+
+ g_return_val_if_fail (string != NULL, 0);
+
+ if (!g_strcasecmp (string, "all"))
+ {
+ for (i=0; i<nkeys; i++)
+ result |= keys[i].value;
+ }
+ else
+ {
+ gchar *str = g_strdup (string);
+ gchar *p = str;
+ gchar *q;
+ gboolean done = FALSE;
+
+ while (*p && !done)
+ {
+ q = strchr (p, ':');
+ if (!q)
+ {
+ q = p + strlen(p);
+ done = TRUE;
+ }
+
+ *q = 0;
+
+ for (i=0; i<nkeys; i++)
+ if (!g_strcasecmp(keys[i].key, p))
+ result |= keys[i].value;
+
+ p = q+1;
+ }
+
+ g_free (str);
+ }
+
+ return result;
+}
+
+gchar*
+g_basename (const gchar *file_name)
+{
+ register gchar *base;
+
+ g_return_val_if_fail (file_name != NULL, NULL);
+
+ base = strrchr (file_name, G_DIR_SEPARATOR);
+ if (base)
+ return base + 1;
+
+#ifdef NATIVE_WIN32
+ if (isalpha (file_name[0]) && file_name[1] == ':')
+ return (gchar*) file_name + 2;
+#endif /* NATIVE_WIN32 */
+
+ return (gchar*) file_name;
+}
+
+gboolean
+g_path_is_absolute (const gchar *file_name)
+{
+ g_return_val_if_fail (file_name != NULL, FALSE);
+
+ if (file_name[0] == G_DIR_SEPARATOR)
+ return TRUE;
+
+#ifdef NATIVE_WIN32
+ if (isalpha (file_name[0]) && file_name[1] == ':' && file_name[2] == G_DIR_SEPARATOR)
+ return TRUE;
+#endif
+
+ return FALSE;
+}
+
+gchar*
+g_path_skip_root (gchar *file_name)
+{
+ g_return_val_if_fail (file_name != NULL, NULL);
+
+ if (file_name[0] == G_DIR_SEPARATOR)
+ return file_name + 1;
+
+#ifdef NATIVE_WIN32
+ if (isalpha (file_name[0]) && file_name[1] == ':' && file_name[2] == G_DIR_SEPARATOR)
+ return file_name + 3;
+#endif
+
+ return NULL;
+}
+
+gchar*
+g_dirname (const gchar *file_name)
+{
+ register gchar *base;
+ register guint len;
+
+ g_return_val_if_fail (file_name != NULL, NULL);
+
+ base = strrchr (file_name, G_DIR_SEPARATOR);
+ if (!base)
+ return g_strdup (".");
+ while (base > file_name && *base == G_DIR_SEPARATOR)
+ base--;
+ len = (guint) 1 + base - file_name;
+
+ base = g_new (gchar, len + 1);
+ g_memmove (base, file_name, len);
+ base[len] = 0;
+
+ return base;
+}
+
+#ifndef __KORBIT__
+gchar*
+g_get_current_dir (void)
+{
+ gchar *buffer;
+ gchar *dir;
+
+ buffer = g_new (gchar, G_PATH_LENGTH);
+ *buffer = 0;
+
+ /* We don't use getcwd(3) on SUNOS, because, it does a popen("pwd")
+ * and, if that wasn't bad enough, hangs in doing so.
+ */
+#if defined (sun) && !defined (__SVR4)
+ dir = getwd (buffer);
+#else /* !sun */
+ dir = getcwd (buffer, G_PATH_LENGTH - 1);
+#endif /* !sun */
+
+ if (!dir || !*buffer)
+ {
+ /* hm, should we g_error() out here?
+ * this can happen if e.g. "./" has mode \0000
+ */
+ buffer[0] = G_DIR_SEPARATOR;
+ buffer[1] = 0;
+ }
+
+ dir = g_strdup (buffer);
+ g_free (buffer);
+
+ return dir;
+}
+#endif /* !__KORBIT__ */
+
+gchar*
+g_getenv (const gchar *variable)
+{
+#ifndef NATIVE_WIN32
+ g_return_val_if_fail (variable != NULL, NULL);
+
+ return getenv (variable);
+#else
+ gchar *v;
+ guint k;
+ static gchar *p = NULL;
+ static gint l;
+ gchar dummy[2];
+
+ g_return_val_if_fail (variable != NULL, NULL);
+
+ v = getenv (variable);
+ if (!v)
+ return NULL;
+
+ /* On Windows NT, it is relatively typical that environment variables
+ * contain references to other environment variables. Handle that by
+ * calling ExpandEnvironmentStrings.
+ */
+
+ /* First check how much space we need */
+ k = ExpandEnvironmentStrings (v, dummy, 2);
+ /* Then allocate that much, and actualy do the expansion */
+ if (p == NULL)
+ {
+ p = g_malloc (k);
+ l = k;
+ }
+ else if (k > l)
+ {
+ p = g_realloc (p, k);
+ l = k;
+ }
+ ExpandEnvironmentStrings (v, p, k);
+ return p;
+#endif
+}
+
+
+G_LOCK_DEFINE_STATIC (g_utils_global);
+
+static gchar *g_tmp_dir = NULL;
+static gchar *g_user_name = NULL;
+static gchar *g_real_name = NULL;
+static gchar *g_home_dir = NULL;
+
+/* HOLDS: g_utils_global_lock */
+static void
+g_get_any_init (void)
+{
+ if (!g_tmp_dir)
+ {
+ g_tmp_dir = g_strdup (g_getenv ("TMPDIR"));
+ if (!g_tmp_dir)
+ g_tmp_dir = g_strdup (g_getenv ("TMP"));
+ if (!g_tmp_dir)
+ g_tmp_dir = g_strdup (g_getenv ("TEMP"));
+
+#ifdef P_tmpdir
+ if (!g_tmp_dir)
+ {
+ int k;
+ g_tmp_dir = g_strdup (P_tmpdir);
+ k = strlen (g_tmp_dir);
+ if (g_tmp_dir[k-1] == G_DIR_SEPARATOR)
+ g_tmp_dir[k-1] = '\0';
+ }
+#endif
+
+ if (!g_tmp_dir)
+ {
+#ifndef NATIVE_WIN32
+ g_tmp_dir = g_strdup ("/tmp");
+#else /* NATIVE_WIN32 */
+ g_tmp_dir = g_strdup ("C:\\");
+#endif /* NATIVE_WIN32 */
+ }
+
+ if (!g_home_dir)
+ g_home_dir = g_strdup (g_getenv ("HOME"));
+
+#ifdef NATIVE_WIN32
+ if (!g_home_dir)
+ {
+ /* The official way to specify a home directory on NT is
+ * the HOMEDRIVE and HOMEPATH environment variables.
+ *
+ * This is inside #ifdef NATIVE_WIN32 because with the cygwin dll,
+ * HOME should be a POSIX style pathname.
+ */
+
+ if (getenv ("HOMEDRIVE") != NULL && getenv ("HOMEPATH") != NULL)
+ {
+ gchar *homedrive, *homepath;
+
+ homedrive = g_strdup (g_getenv ("HOMEDRIVE"));
+ homepath = g_strdup (g_getenv ("HOMEPATH"));
+
+ g_home_dir = g_strconcat (homedrive, homepath, NULL);
+ g_free (homedrive);
+ g_free (homepath);
+ }
+ }
+#endif /* !NATIVE_WIN32 */
+
+#ifdef HAVE_PWD_H
+ {
+ struct passwd *pw = NULL;
+ gpointer buffer = NULL;
+
+# ifdef HAVE_GETPWUID_R
+ struct passwd pwd;
+ guint bufsize = 64;
+ gint error;
+
+ do
+ {
+ g_free (buffer);
+ buffer = g_malloc (bufsize);
+ errno = 0;
+
+# ifdef HAVE_GETPWUID_R_POSIX
+ error = getpwuid_r (getuid (), &pwd, buffer, bufsize, &pw);
+ error = error < 0 ? errno : error;
+# else /* !HAVE_GETPWUID_R_POSIX */
+# ifdef _AIX
+ error = getpwuid_r (getuid (), &pwd, buffer, bufsize);
+ pw = error == 0 ? &pwd : NULL;
+# else /* !_AIX */
+ pw = getpwuid_r (getuid (), &pwd, buffer, bufsize);
+ error = pw ? 0 : errno;
+# endif /* !_AIX */
+# endif /* !HAVE_GETPWUID_R_POSIX */
+
+ if (!pw)
+ {
+ /* we bail out prematurely if the user id can't be found
+ * (should be pretty rare case actually), or if the buffer
+ * should be sufficiently big and lookups are still not
+ * successfull.
+ */
+ if (error == 0 || error == ENOENT)
+ {
+ g_warning ("getpwuid_r(): failed due to: No such user %d.",
+ getuid ());
+ break;
+ }
+ if (bufsize > 32 * 1024)
+ {
+ g_warning ("getpwuid_r(): failed due to: %s.",
+ g_strerror (error));
+ break;
+ }
+
+ bufsize *= 2;
+ }
+ }
+ while (!pw);
+# endif /* !HAVE_GETPWUID_R */
+
+ if (!pw)
+ {
+ setpwent ();
+ pw = getpwuid (getuid ());
+ endpwent ();
+ }
+ if (pw)
+ {
+ g_user_name = g_strdup (pw->pw_name);
+ g_real_name = g_strdup (pw->pw_gecos);
+ if (!g_home_dir)
+ g_home_dir = g_strdup (pw->pw_dir);
+ }
+ g_free (buffer);
+ }
+
+#else /* !HAVE_PWD_H */
+
+# ifdef NATIVE_WIN32
+ {
+ guint len = 17;
+ gchar buffer[17];
+
+ if (GetUserName (buffer, &len))
+ {
+ g_user_name = g_strdup (buffer);
+ g_real_name = g_strdup (buffer);
+ }
+ }
+# endif /* NATIVE_WIN32 */
+
+#endif /* !HAVE_PWD_H */
+
+ if (!g_user_name)
+ g_user_name = g_strdup ("somebody");
+ if (!g_real_name)
+ g_real_name = g_strdup ("Unknown");
+ else
+ {
+ gchar *p;
+
+ for (p = g_real_name; *p; p++)
+ if (*p == ',')
+ {
+ *p = 0;
+ p = g_strdup (g_real_name);
+ g_free (g_real_name);
+ g_real_name = p;
+ break;
+ }
+ }
+ }
+}
+
+gchar*
+g_get_user_name (void)
+{
+ G_LOCK (g_utils_global);
+ if (!g_tmp_dir)
+ g_get_any_init ();
+ G_UNLOCK (g_utils_global);
+
+ return g_user_name;
+}
+
+gchar*
+g_get_real_name (void)
+{
+ G_LOCK (g_utils_global);
+ if (!g_tmp_dir)
+ g_get_any_init ();
+ G_UNLOCK (g_utils_global);
+
+ return g_real_name;
+}
+
+/* Return the home directory of the user. If there is a HOME
+ * environment variable, its value is returned, otherwise use some
+ * system-dependent way of finding it out. If no home directory can be
+ * deduced, return NULL.
+ */
+
+gchar*
+g_get_home_dir (void)
+{
+ G_LOCK (g_utils_global);
+ if (!g_tmp_dir)
+ g_get_any_init ();
+ G_UNLOCK (g_utils_global);
+
+ return g_home_dir;
+}
+
+/* Return a directory to be used to store temporary files. This is the
+ * value of the TMPDIR, TMP or TEMP environment variables (they are
+ * checked in that order). If none of those exist, use P_tmpdir from
+ * stdio.h. If that isn't defined, return "/tmp" on POSIXly systems,
+ * and C:\ on Windows.
+ */
+
+gchar*
+g_get_tmp_dir (void)
+{
+ G_LOCK (g_utils_global);
+ if (!g_tmp_dir)
+ g_get_any_init ();
+ G_UNLOCK (g_utils_global);
+
+ return g_tmp_dir;
+}
+
+static gchar *g_prgname = NULL;
+
+gchar*
+g_get_prgname (void)
+{
+ gchar* retval;
+
+ G_LOCK (g_utils_global);
+ retval = g_prgname;
+ G_UNLOCK (g_utils_global);
+
+ return retval;
+}
+
+void
+g_set_prgname (const gchar *prgname)
+{
+ gchar *c;
+
+ G_LOCK (g_utils_global);
+ c = g_prgname;
+ g_prgname = g_strdup (prgname);
+ g_free (c);
+ G_UNLOCK (g_utils_global);
+}
+
+guint
+g_direct_hash (gconstpointer v)
+{
+ return GPOINTER_TO_UINT (v);
+}
+
+gint
+g_direct_equal (gconstpointer v1,
+ gconstpointer v2)
+{
+ return v1 == v2;
+}
+
+gint
+g_int_equal (gconstpointer v1,
+ gconstpointer v2)
+{
+ return *((const gint*) v1) == *((const gint*) v2);
+}
+
+guint
+g_int_hash (gconstpointer v)
+{
+ return *(const gint*) v;
+}
+
+#if 0 /* Old IO Channels */
+
+GIOChannel*
+g_iochannel_new (gint fd)
+{
+ GIOChannel *channel = g_new (GIOChannel, 1);
+
+ channel->fd = fd;
+
+#ifdef NATIVE_WIN32
+ channel->peer = 0;
+ channel->peer_fd = 0;
+ channel->offset = 0;
+ channel->need_wakeups = 0;
+#endif /* NATIVE_WIN32 */
+
+ return channel;
+}
+
+void
+g_iochannel_free (GIOChannel *channel)
+{
+ g_return_if_fail (channel != NULL);
+
+ g_free (channel);
+}
+
+void
+g_iochannel_close_and_free (GIOChannel *channel)
+{
+ g_return_if_fail (channel != NULL);
+
+ close (channel->fd);
+
+ g_iochannel_free (channel);
+}
+
+#undef g_iochannel_wakeup_peer
+
+void
+g_iochannel_wakeup_peer (GIOChannel *channel)
+{
+#ifdef NATIVE_WIN32
+ static guint message = 0;
+#endif
+
+ g_return_if_fail (channel != NULL);
+
+#ifdef NATIVE_WIN32
+ if (message == 0)
+ message = RegisterWindowMessage ("gdk-pipe-readable");
+
+# if 0
+ g_print ("g_iochannel_wakeup_peer: calling PostThreadMessage (%#x, %d, %d, %d)\n",
+ channel->peer, message, channel->peer_fd, channel->offset);
+# endif
+ PostThreadMessage (channel->peer, message,
+ channel->peer_fd, channel->offset);
+#endif /* NATIVE_WIN32 */
+}
+
+#endif /* Old IO Channels */
+
+#ifdef NATIVE_WIN32
+#ifdef _MSC_VER
+
+int
+gwin_ftruncate (gint fd,
+ guint size)
+{
+ HANDLE hfile;
+ guint curpos;
+
+ g_return_val_if_fail (fd >= 0, -1);
+
+ hfile = (HANDLE) _get_osfhandle (fd);
+ curpos = SetFilePointer (hfile, 0, NULL, FILE_CURRENT);
+ if (curpos == 0xFFFFFFFF
+ || SetFilePointer (hfile, size, NULL, FILE_BEGIN) == 0xFFFFFFFF
+ || !SetEndOfFile (hfile))
+ {
+ gint error = GetLastError ();
+
+ switch (error)
+ {
+ case ERROR_INVALID_HANDLE:
+ errno = EBADF;
+ break;
+ default:
+ errno = EIO;
+ break;
+ }
+
+ return -1;
+ }
+
+ return 0;
+}
+
+DIR*
+gwin_opendir (const char *dirname)
+{
+ DIR *result;
+ gchar *mask;
+ guint k;
+
+ g_return_val_if_fail (dirname != NULL, NULL);
+
+ result = g_new0 (DIR, 1);
+ result->find_file_data = g_new0 (WIN32_FIND_DATA, 1);
+ result->dir_name = g_strdup (dirname);
+
+ k = strlen (result->dir_name);
+ if (k && result->dir_name[k - 1] == '\\')
+ {
+ result->dir_name[k - 1] = '\0';
+ k--;
+ }
+ mask = g_strdup_printf ("%s\\*", result->dir_name);
+
+ result->find_file_handle = (guint) FindFirstFile (mask,
+ (LPWIN32_FIND_DATA) result->find_file_data);
+ g_free (mask);
+
+ if (result->find_file_handle == (guint) INVALID_HANDLE_VALUE)
+ {
+ int error = GetLastError ();
+
+ g_free (result->dir_name);
+ g_free (result->find_file_data);
+ g_free (result);
+ switch (error)
+ {
+ default:
+ errno = EIO;
+ return NULL;
+ }
+ }
+ result->just_opened = TRUE;
+
+ return result;
+}
+
+struct dirent*
+gwin_readdir (DIR *dir)
+{
+ static struct dirent result;
+
+ g_return_val_if_fail (dir != NULL, NULL);
+
+ if (dir->just_opened)
+ dir->just_opened = FALSE;
+ else
+ {
+ if (!FindNextFile ((HANDLE) dir->find_file_handle,
+ (LPWIN32_FIND_DATA) dir->find_file_data))
+ {
+ int error = GetLastError ();
+
+ switch (error)
+ {
+ case ERROR_NO_MORE_FILES:
+ return NULL;
+ default:
+ errno = EIO;
+ return NULL;
+ }
+ }
+ }
+ strcpy (result.d_name, g_basename (((LPWIN32_FIND_DATA) dir->find_file_data)->cFileName));
+
+ return &result;
+}
+
+void
+gwin_rewinddir (DIR *dir)
+{
+ gchar *mask;
+
+ g_return_if_fail (dir != NULL);
+
+ if (!FindClose ((HANDLE) dir->find_file_handle))
+ g_warning ("gwin_rewinddir(): FindClose() failed\n");
+
+ mask = g_strdup_printf ("%s\\*", dir->dir_name);
+ dir->find_file_handle = (guint) FindFirstFile (mask,
+ (LPWIN32_FIND_DATA) dir->find_file_data);
+ g_free (mask);
+
+ if (dir->find_file_handle == (guint) INVALID_HANDLE_VALUE)
+ {
+ int error = GetLastError ();
+
+ switch (error)
+ {
+ default:
+ errno = EIO;
+ return;
+ }
+ }
+ dir->just_opened = TRUE;
+}
+
+gint
+gwin_closedir (DIR *dir)
+{
+ g_return_val_if_fail (dir != NULL, -1);
+
+ if (!FindClose ((HANDLE) dir->find_file_handle))
+ {
+ int error = GetLastError ();
+
+ switch (error)
+ {
+ default:
+ errno = EIO; return -1;
+ }
+ }
+
+ g_free (dir->dir_name);
+ g_free (dir->find_file_data);
+ g_free (dir);
+
+ return 0;
+}
+
+#endif /* _MSC_VER */
+
+#endif /* NATIVE_WIN32 */
diff -urN linux-2.4.1/net/korbit/kglib/korbit_errno.c linux-2.4.1-korbit/net/korbit/kglib/korbit_errno.c
--- linux-2.4.1/net/korbit/kglib/korbit_errno.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/kglib/korbit_errno.c Thu Feb 1 11:46:57 2001
@@ -0,0 +1 @@
+int korbit_errno;
diff -urN linux-2.4.1/net/korbit/korbit.h linux-2.4.1-korbit/net/korbit/korbit.h
--- linux-2.4.1/net/korbit/korbit.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/korbit.h Thu Feb 1 11:46:49 2001
@@ -0,0 +1,53 @@
+
+#ifndef KORBIT_H
+#define KORBIT_H
+
+#ifdef __KERNEL__
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/proc_fs.h>
+#endif
+
+#include "stdlib.h"
+
+#ifdef __KERNEL__
+static int korbit_get_ior_func(char *buffer, char **start, off_t offset,
+ int length, int *eof, void *data) {
+ int Len = strlen((char*)data);
+ memcpy(buffer, data, Len); // Data is the ior...
+ buffer[Len++] = '\n'; // Add a newline to make fredrik happy
+ buffer[Len] = 0; // Null terminate the buffer...
+ *start = buffer + offset;
+ *eof = 1;
+
+ Len -= offset;
+ if (Len > length)
+ Len = length;
+ if (Len < 0)
+ Len = 0;
+
+ return Len;
+}
+
+#endif
+
+
+static inline void korbit_register_ior(const char *name, CORBA_Object obj,
+ CORBA_ORB orb, CORBA_Environment *ev) {
+ char *retval = CORBA_ORB_object_to_string(orb, obj, ev);
+#if defined(__KERNEL__) && defined(CONFIG_PROC_FS)
+ char *procdirname = malloc(strlen(name)+7); // 7 = len("corba/\0")
+ strcpy(procdirname, "corba/");
+ strcpy(procdirname+6, name);
+
+ create_proc_read_entry(procdirname, 0, 0, korbit_get_ior_func, retval);
+
+ free(procdirname);
+ // Don't free the ior in the /proc handling case...
+#else
+ // No procfs support, just print to console... :(
+ g_print("%s IOR:\n%s\n", name, retval);
+ CORBA_free(retval);
+#endif
+}
+#endif
diff -urN linux-2.4.1/net/korbit/modules/CVS/Entries linux-2.4.1-korbit/net/korbit/modules/CVS/Entries
--- linux-2.4.1/net/korbit/modules/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CVS/Entries Thu Feb 1 11:46:58 2001
@@ -0,0 +1,5 @@
+/Config.in/1.8/Thu Feb 1 09:46:58 2001//
+/Makefile/1.8/Thu Feb 1 09:46:58 2001//
+/Makefile.module/1.2/Thu Feb 1 09:46:58 2001//
+/README/1.1/Thu Feb 1 09:46:58 2001//
+D
diff -urN linux-2.4.1/net/korbit/modules/CVS/Entries.Log linux-2.4.1-korbit/net/korbit/modules/CVS/Entries.Log
--- linux-2.4.1/net/korbit/modules/CVS/Entries.Log Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CVS/Entries.Log Thu Feb 1 11:47:09 2001
@@ -0,0 +1,6 @@
+A D/CharDev////
+A D/Console////
+A D/CorbaFS////
+A D/Echo////
+A D/FileServer////
+A D/UserFS////
diff -urN linux-2.4.1/net/korbit/modules/CVS/Repository linux-2.4.1-korbit/net/korbit/modules/CVS/Repository
--- linux-2.4.1/net/korbit/modules/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CVS/Repository Thu Feb 1 11:46:57 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/modules
diff -urN linux-2.4.1/net/korbit/modules/CVS/Root linux-2.4.1-korbit/net/korbit/modules/CVS/Root
--- linux-2.4.1/net/korbit/modules/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CVS/Root Thu Feb 1 11:46:57 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/modules/CharDev/CVS/Entries linux-2.4.1-korbit/net/korbit/modules/CharDev/CVS/Entries
--- linux-2.4.1/net/korbit/modules/CharDev/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CharDev/CVS/Entries Thu Feb 1 11:46:58 2001
@@ -0,0 +1,4 @@
+/Makefile/1.3/Thu Feb 1 09:46:58 2001//
+/README/1.1/Thu Feb 1 09:46:58 2001//
+/chardev.idl/1.1/Thu Feb 1 09:46:58 2001//
+D
diff -urN linux-2.4.1/net/korbit/modules/CharDev/CVS/Entries.Log linux-2.4.1-korbit/net/korbit/modules/CharDev/CVS/Entries.Log
--- linux-2.4.1/net/korbit/modules/CharDev/CVS/Entries.Log Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CharDev/CVS/Entries.Log Thu Feb 1 11:47:00 2001
@@ -0,0 +1,3 @@
+A D/kernel////
+A D/kernel-perl////
+A D/userspace////
diff -urN linux-2.4.1/net/korbit/modules/CharDev/CVS/Repository linux-2.4.1-korbit/net/korbit/modules/CharDev/CVS/Repository
--- linux-2.4.1/net/korbit/modules/CharDev/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CharDev/CVS/Repository Thu Feb 1 11:46:58 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/modules/CharDev
diff -urN linux-2.4.1/net/korbit/modules/CharDev/CVS/Root linux-2.4.1-korbit/net/korbit/modules/CharDev/CVS/Root
--- linux-2.4.1/net/korbit/modules/CharDev/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CharDev/CVS/Root Thu Feb 1 11:46:58 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/modules/CharDev/Makefile linux-2.4.1-korbit/net/korbit/modules/CharDev/Makefile
--- linux-2.4.1/net/korbit/modules/CharDev/Makefile Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CharDev/Makefile Thu Feb 1 11:46:58 2001
@@ -0,0 +1,11 @@
+#
+# Makefile for KORBit - CharDev
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+
+subdir-$(CONFIG_CORBA_CHARDEV) := kernel
+
+include $(TOPDIR)/Rules.make
+
diff -urN linux-2.4.1/net/korbit/modules/CharDev/README linux-2.4.1-korbit/net/korbit/modules/CharDev/README
--- linux-2.4.1/net/korbit/modules/CharDev/README Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CharDev/README Thu Feb 1 11:46:58 2001
@@ -0,0 +1 @@
+This module is used to implement a character device with kORBit.
diff -urN linux-2.4.1/net/korbit/modules/CharDev/chardev.idl linux-2.4.1-korbit/net/korbit/modules/CharDev/chardev.idl
--- linux-2.4.1/net/korbit/modules/CharDev/chardev.idl Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CharDev/chardev.idl Thu Feb 1 11:46:58 2001
@@ -0,0 +1,5 @@
+typedef sequence<octet> Buffer;
+
+interface CharDev {
+ long read(out Buffer buffer, in long size);
+};
diff -urN linux-2.4.1/net/korbit/modules/CharDev/kernel/CVS/Entries linux-2.4.1-korbit/net/korbit/modules/CharDev/kernel/CVS/Entries
--- linux-2.4.1/net/korbit/modules/CharDev/kernel/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CharDev/kernel/CVS/Entries Thu Feb 1 11:46:59 2001
@@ -0,0 +1,4 @@
+/Makefile/1.2/Thu Feb 1 09:46:59 2001//
+/README/1.2/Thu Feb 1 09:46:59 2001//
+/chardev-kernel.c/1.9/Thu Feb 1 09:46:59 2001//
+D
diff -urN linux-2.4.1/net/korbit/modules/CharDev/kernel/CVS/Repository linux-2.4.1-korbit/net/korbit/modules/CharDev/kernel/CVS/Repository
--- linux-2.4.1/net/korbit/modules/CharDev/kernel/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CharDev/kernel/CVS/Repository Thu Feb 1 11:46:59 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/modules/CharDev/kernel
diff -urN linux-2.4.1/net/korbit/modules/CharDev/kernel/CVS/Root linux-2.4.1-korbit/net/korbit/modules/CharDev/kernel/CVS/Root
--- linux-2.4.1/net/korbit/modules/CharDev/kernel/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CharDev/kernel/CVS/Root Thu Feb 1 11:46:59 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/modules/CharDev/kernel/Makefile linux-2.4.1-korbit/net/korbit/modules/CharDev/kernel/Makefile
--- linux-2.4.1/net/korbit/modules/CharDev/kernel/Makefile Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CharDev/kernel/Makefile Thu Feb 1 11:46:59 2001
@@ -0,0 +1,20 @@
+#
+# Makefile for KORBit / chardev
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
+# Note 2! The CFLAGS definition is now in the main makefile...
+
+O_TARGET := corba-chardev-kernel.o
+
+obj-y := chardev-common.o chardev-stubs.o chardev-kernel.o
+obj-m := $(O_TARGET)
+
+include ../../Makefile.module
+
+chardev-kernel.c: chardev.h
+
+chardev.h chardev-stubs.c chardev-common.c: ../chardev.idl
+ $(ORBIT_IDL) ../chardev.idl
diff -urN linux-2.4.1/net/korbit/modules/CharDev/kernel/README linux-2.4.1-korbit/net/korbit/modules/CharDev/kernel/README
--- linux-2.4.1/net/korbit/modules/CharDev/kernel/README Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CharDev/kernel/README Thu Feb 1 11:46:59 2001
@@ -0,0 +1,5 @@
+This module is used to implement the kernel side of the CORBA Character
+device.
+
+ORB: kORBit
+Status: Working!!!
diff -urN linux-2.4.1/net/korbit/modules/CharDev/kernel/chardev-kernel.c linux-2.4.1-korbit/net/korbit/modules/CharDev/kernel/chardev-kernel.c
--- linux-2.4.1/net/korbit/modules/CharDev/kernel/chardev-kernel.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CharDev/kernel/chardev-kernel.c Thu Feb 1 11:46:59 2001
@@ -0,0 +1,140 @@
+//-----------------------------------------------------------------------------
+//
+// chardev-kernel - Kernel miscdevice to CORBA glue.
+//
+// This file implements a standard Linux Kernel "miscdevice". This device
+// operates by forwarding all calls across to a remote CORBA server. This
+// server is located by reading the file /tmp/chardev-ior at the time the
+// device is opened. The device exported is major #10, minor #42. Create this
+// device with 'mknod' like all the others.
+//
+// No implementations of CORBA functions should block, although I think it
+// might be just fine, I'm not sure. Let's just make this a TODO. :) -CAL
+//
+// TODO: Locking, finish exporting all "miscdevice" functions, send position
+// on READ request.
+//
+// History:
+// Keith Wessel - Initial hack, initial idea
+// Andy Reitz - Get it to compile
+// Chris Lattner - Make it work. :)
+//
+//-----------------------------------------------------------------------------
+
+
+#include "chardev.h"
+#include <stdio.h>
+#include "orb/orbit.h"
+#include "korbit.h"
+#include <linux/miscdevice.h>
+
+#define DEV_MINOR 42
+
+CORBA_ORB orb;
+CORBA_Environment *ev;
+
+static int open_dev(struct inode *inode, struct file *file) {
+ char *iorstr = (char *)malloc(10240);
+ int error = -EINVAL;
+ int fd, len;
+
+ if (iorstr == 0) return -ENOMEM;
+
+ if ((fd = open ("/tmp/chardev-ior", O_RDONLY, 0)) == -1) {
+ printk("kORBit: chararacter driver couldn't open /tmp/chardev-ior!\n");
+ goto outfree;
+ }
+
+ len = read(fd, iorstr, 10240);
+ close(fd);
+ if (len == -1)
+ goto outfree;
+
+ iorstr[len] = 0; // Null terminate string!
+
+ printk("CharDEV IOR String = %s\n", iorstr);
+ file->private_data = (void*)CORBA_ORB_string_to_object(orb, iorstr, ev);
+ if (!file->private_data)
+ goto outfree;
+
+ // TODO: Send create_dev message out over CORBA
+
+ error = 0;
+ outfree:
+ free(iorstr);
+ return error;
+}
+
+static int release_dev(struct inode *inode, struct file *file) {
+ // TODO: Send release_dev message out over CORBA...
+ if (file->private_data)
+ CORBA_free(file->private_data);
+ return 0;
+}
+
+
+static ssize_t read_dev(struct file * file, char * buf, size_t count,
+ loff_t *ppos) {
+ Buffer *octet_buffer = NULL;
+ if (!file->private_data) return -EINVAL;
+ if (!count) return 0;
+
+ if (!access_ok(VERIFY_WRITE, buf, count))
+ return -EFAULT;
+
+ CharDev_read(file->private_data, &octet_buffer, count, ev);
+
+ if (!octet_buffer)
+ return -EPERM;
+
+ if (copy_to_user(buf, octet_buffer->_buffer, octet_buffer->_length))
+ return -EFAULT;
+
+ // TODO: Should free octet_buffer here!?!?!?
+
+ return octet_buffer->_length;
+}
+
+
+//-----------------------------------------------------------------------------
+// Kernel Callbacks for miscdevice
+//-----------------------------------------------------------------------------
+
+
+static struct file_operations dev_fops = {
+ owner: THIS_MODULE,
+ open: open_dev,
+ read: read_dev,
+ release: release_dev,
+ // mmap: mmap_dev,
+ // llseek: llseek_dev,
+ // write: write_dev,
+};
+
+static struct miscdevice cdev = {
+ DEV_MINOR,
+ "CORBA Character device",
+ &dev_fops
+};
+
+
+//-----------------------------------------------------------------------------
+// Module Initializion/Finalization
+//-----------------------------------------------------------------------------
+
+static int __init CharDev_init(void) {
+ int argc = 1;
+ char *argv[] = { "CharDev-kernel", 0 };
+ ev = g_new0(CORBA_Environment,1);
+ orb = CORBA_ORB_init(&argc, argv, "orbit-local-orb", ev);
+
+ // Register the device
+ return misc_register(&cdev);
+}
+
+static void __exit CharDev_exit(void) {
+ misc_deregister(&cdev);
+}
+
+module_init(CharDev_init)
+module_exit(CharDev_exit)
diff -urN linux-2.4.1/net/korbit/modules/CharDev/kernel-perl/CVS/Entries linux-2.4.1-korbit/net/korbit/modules/CharDev/kernel-perl/CVS/Entries
--- linux-2.4.1/net/korbit/modules/CharDev/kernel-perl/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CharDev/kernel-perl/CVS/Entries Thu Feb 1 11:46:59 2001
@@ -0,0 +1,3 @@
+/PerlTest/1.1/Thu Feb 1 09:46:59 2001//
+/README/1.1/Thu Feb 1 09:46:59 2001//
+D
diff -urN linux-2.4.1/net/korbit/modules/CharDev/kernel-perl/CVS/Repository linux-2.4.1-korbit/net/korbit/modules/CharDev/kernel-perl/CVS/Repository
--- linux-2.4.1/net/korbit/modules/CharDev/kernel-perl/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CharDev/kernel-perl/CVS/Repository Thu Feb 1 11:46:59 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/modules/CharDev/kernel-perl
diff -urN linux-2.4.1/net/korbit/modules/CharDev/kernel-perl/CVS/Root linux-2.4.1-korbit/net/korbit/modules/CharDev/kernel-perl/CVS/Root
--- linux-2.4.1/net/korbit/modules/CharDev/kernel-perl/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CharDev/kernel-perl/CVS/Root Thu Feb 1 11:46:59 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/modules/CharDev/kernel-perl/PerlTest linux-2.4.1-korbit/net/korbit/modules/CharDev/kernel-perl/PerlTest
--- linux-2.4.1/net/korbit/modules/CharDev/kernel-perl/PerlTest Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CharDev/kernel-perl/PerlTest Thu Feb 1 11:46:59 2001
@@ -0,0 +1,17 @@
+#!/usr/bin/perl -w
+
+use CORBA::ORBit idl => [ qw(../chardev.idl) ];
+use Error qw(:try);
+use strict;
+
+my $orb = CORBA::ORB_init("orbit-local-orb");
+open IOR, "/tmp/chardev-ior" or die "no chardev server found!";
+my $ior = <IOR>;
+close IOR;
+#chomp($ior); # Kill fredrik's newline...
+
+my $chardev = $orb->string_to_object($ior);
+# Echo echoString(in string astring, out long anum);
+my ($ressize, $buf) = $chardev->read(10);
+
+print "Return size = $ressize\nresult = $buf\n";
diff -urN linux-2.4.1/net/korbit/modules/CharDev/kernel-perl/README linux-2.4.1-korbit/net/korbit/modules/CharDev/kernel-perl/README
--- linux-2.4.1/net/korbit/modules/CharDev/kernel-perl/README Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CharDev/kernel-perl/README Thu Feb 1 11:46:59 2001
@@ -0,0 +1,6 @@
+This module is used to test the user side of the CORBA Character
+device. It doesn't do anything really complex, just implements a quick
+sanity test for the server.
+
+ORB: ORBit - Perl
+Status: Working!
diff -urN linux-2.4.1/net/korbit/modules/CharDev/userspace/CVS/Entries linux-2.4.1-korbit/net/korbit/modules/CharDev/userspace/CVS/Entries
--- linux-2.4.1/net/korbit/modules/CharDev/userspace/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CharDev/userspace/CVS/Entries Thu Feb 1 11:47:00 2001
@@ -0,0 +1,6 @@
+/Makefile/1.5/Thu Feb 1 09:47:00 2001//
+/README/1.1/Thu Feb 1 09:47:00 2001//
+/RunServer.sh/1.1/Thu Feb 1 09:47:00 2001//
+/chardev-server.c/1.5/Thu Feb 1 09:47:00 2001//
+/chardev-skelimpl.c/1.5/Thu Feb 1 09:47:00 2001//
+D
diff -urN linux-2.4.1/net/korbit/modules/CharDev/userspace/CVS/Repository linux-2.4.1-korbit/net/korbit/modules/CharDev/userspace/CVS/Repository
--- linux-2.4.1/net/korbit/modules/CharDev/userspace/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CharDev/userspace/CVS/Repository Thu Feb 1 11:47:00 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/modules/CharDev/userspace
diff -urN linux-2.4.1/net/korbit/modules/CharDev/userspace/CVS/Root linux-2.4.1-korbit/net/korbit/modules/CharDev/userspace/CVS/Root
--- linux-2.4.1/net/korbit/modules/CharDev/userspace/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CharDev/userspace/CVS/Root Thu Feb 1 11:47:00 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/modules/CharDev/userspace/Makefile linux-2.4.1-korbit/net/korbit/modules/CharDev/userspace/Makefile
--- linux-2.4.1/net/korbit/modules/CharDev/userspace/Makefile Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CharDev/userspace/Makefile Thu Feb 1 11:47:00 2001
@@ -0,0 +1,30 @@
+#
+# Makefile for KORBit / CharDev
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
+# Note 2! The CFLAGS definition is now in the main makefile...
+
+CFLAGS = -Wall -I/usr/lib/glib/include
+LDFLAGS = -lORBit -lIIOP -lORBitutil
+OBJS = chardev-common.o chardev-skels.o chardev-server.o
+ORBIT-IDL = /usr/bin/orbit-idl
+
+chardev-server: $(OBJS)
+ gcc -o chardev-server $(OBJS) $(LDFLAGS)
+
+chardev-server.o: chardev.h chardev-skelimpl.c
+
+chardev.h chardev-skels.c chardev-common.c: ../chardev.idl
+ $(ORBIT-IDL) ../chardev.idl
+
+chardev-skelimpl.c:
+
+%.o: %.c
+ gcc -c $< $(CFLAGS)
+clean:
+ rm -f $(OBJS) chardev-server chardev-common.c chardev-skels.c \
+ chardev-stubs.c chardev.h
+
diff -urN linux-2.4.1/net/korbit/modules/CharDev/userspace/README linux-2.4.1-korbit/net/korbit/modules/CharDev/userspace/README
--- linux-2.4.1/net/korbit/modules/CharDev/userspace/README Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CharDev/userspace/README Thu Feb 1 11:47:00 2001
@@ -0,0 +1,4 @@
+This is an example character driver.
+
+ORB: ORBit
+Status: not yet working
diff -urN linux-2.4.1/net/korbit/modules/CharDev/userspace/RunServer.sh linux-2.4.1-korbit/net/korbit/modules/CharDev/userspace/RunServer.sh
--- linux-2.4.1/net/korbit/modules/CharDev/userspace/RunServer.sh Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CharDev/userspace/RunServer.sh Thu Feb 1 11:47:00 2001
@@ -0,0 +1 @@
+./chardev-server -ORBIIOPUSock=0 -ORBIIOPIPv4=1
diff -urN linux-2.4.1/net/korbit/modules/CharDev/userspace/chardev-server.c linux-2.4.1-korbit/net/korbit/modules/CharDev/userspace/chardev-server.c
--- linux-2.4.1/net/korbit/modules/CharDev/userspace/chardev-server.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CharDev/userspace/chardev-server.c Thu Feb 1 11:47:00 2001
@@ -0,0 +1,77 @@
+//-----------------------------------------------------------------------------
+//
+// chardev-server.c - TEST Kernel miscdevice implementation
+//
+// This file implements the standard server code for a userspace server. This
+// is basically cut and paste boilerplate code adapted from the CorbaFS server
+// by Fredrik Vraalsen.
+//
+// TODO: Locking, finish exporting all "miscdevice" functions, send position
+// on READ request.
+//
+// History:
+// Keith Wessel - Initial hack, initial idea
+// Andy Reitz - Get it to compile
+// Chris Lattner - Hack'n'slash, make it work, comment it, kill warnings.
+//
+//-----------------------------------------------------------------------------
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+#include <orb/orbit.h>
+
+// #include the C file because all the functions are static. Bizarre.
+#include "chardev-skelimpl.c"
+
+int main(int argc, char *argv[]) {
+ PortableServer_POA poa;
+ PortableServer_POAManager pm;
+
+ CharDev chardev = CORBA_OBJECT_NIL;
+ impl_POA_CharDev *chardev_impl;
+ PortableServer_ObjectId *objid;
+
+ CORBA_Environment ev;
+ char *retval;
+ CORBA_ORB orb;
+ FILE *IORFILE;
+
+ orb = CORBA_ORB_init(&argc, argv, "orbit-local-orb", &ev);
+ poa = (PortableServer_POA)CORBA_ORB_resolve_initial_references(orb, "RootPOA", &ev);
+
+ chardev = impl_CharDev__create(poa, &ev);
+ pm = PortableServer_POA__get_the_POAManager(poa, &ev);
+ PortableServer_POAManager_activate(pm, &ev);
+
+ if (!chardev) {
+ printf("Cannot get objref\n");
+ return 1;
+ }
+
+ chardev_impl = PortableServer_POA_reference_to_servant(poa, chardev, &ev);
+ objid = PortableServer_POA_servant_to_id(poa, chardev_impl, &ev);
+
+ retval = CORBA_ORB_object_to_string(orb, chardev, &ev);
+
+ g_print("FYI, this also goes into /tmp/chardev-ior for you.\n");
+ g_print("%s\n", retval); fflush(stdout);
+
+ IORFILE = fopen ("/tmp/chardev-ior", "w");
+ if (IORFILE == NULL) {
+ perror("ERROR: IOR_WRITE_TO_DISK");
+ exit(1);
+ }
+
+ fprintf(IORFILE, "%s", retval);
+ fclose(IORFILE);
+
+ CORBA_free(retval); // Free the corba string like a good little CORBear
+
+
+ // La dee dah... I will never return for you mister.
+ CORBA_ORB_run(orb, &ev);
+ return 0;
+}
+
diff -urN linux-2.4.1/net/korbit/modules/CharDev/userspace/chardev-skelimpl.c linux-2.4.1-korbit/net/korbit/modules/CharDev/userspace/chardev-skelimpl.c
--- linux-2.4.1/net/korbit/modules/CharDev/userspace/chardev-skelimpl.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CharDev/userspace/chardev-skelimpl.c Thu Feb 1 11:47:00 2001
@@ -0,0 +1,119 @@
+//-----------------------------------------------------------------------------
+//
+// chardev-skelimpl.c - TEST Kernel miscdevice implementation
+//
+// This file implements a CORBA "miscdevice" (character device node).
+// This device simply outputs a fixed string (set by "message", below) when
+// cat'd. Pretty simple stuff, but you can obviously do much more creative
+// things with it.
+//
+// TODO: Locking, finish exporting all "miscdevice" functions, send position
+// on READ request.
+//
+// Right now we have ONE server object with global state, so that when you
+// read the string from that object, it is finished. This should be reset
+// whenever an open request is had or when the file position is reset (duh).
+//
+// History:
+// Keith Wessel - Initial hack, initial idea
+// Andy Reitz - Get it to compile
+// Chris Lattner - Make it work, comment it, no warnings.
+//
+//-----------------------------------------------------------------------------
+
+#include "chardev.h"
+
+// The message to spit out.
+const char *message = "Hello world!\nI love kORBit\n";
+
+
+/*** App-specific servant structures ***/
+
+typedef struct
+{
+ POA_CharDev servant;
+ PortableServer_POA poa;
+ int AmountRead;
+
+}
+impl_POA_CharDev;
+
+/*** Implementation stub prototypes ***/
+
+static inline void impl_CharDev__destroy(impl_POA_CharDev * servant,
+ CORBA_Environment * ev);
+static CORBA_long
+impl_CharDev_read(impl_POA_CharDev * servant,
+ Buffer ** buffer, CORBA_long size, CORBA_Environment * ev);
+
+/*** epv structures ***/
+
+static PortableServer_ServantBase__epv impl_CharDev_base_epv = {
+ NULL, /* _private data */
+ NULL, /* finalize routine */
+ NULL, /* default_POA routine */
+};
+static POA_CharDev__epv impl_CharDev_epv = {
+ NULL, /* _private */
+ (gpointer) & impl_CharDev_read,
+
+};
+
+/*** vepv structures ***/
+
+static POA_CharDev__vepv impl_CharDev_vepv = {
+ &impl_CharDev_base_epv,
+ &impl_CharDev_epv,
+};
+
+/*** Stub implementations ***/
+
+static CharDev
+impl_CharDev__create(PortableServer_POA poa, CORBA_Environment * ev)
+{
+ CharDev retval;
+ impl_POA_CharDev *newservant;
+ PortableServer_ObjectId *objid;
+
+ newservant = g_new0(impl_POA_CharDev, 1);
+ newservant->servant.vepv = &impl_CharDev_vepv;
+ newservant->poa = poa;
+ newservant->AmountRead = 0; // Initialize chardev stuff...
+
+ POA_CharDev__init((PortableServer_Servant) newservant, ev);
+ objid = PortableServer_POA_activate_object(poa, newservant, ev);
+ CORBA_free(objid);
+ retval = PortableServer_POA_servant_to_reference(poa, newservant, ev);
+
+ return retval;
+}
+
+static inline void
+impl_CharDev__destroy(impl_POA_CharDev * servant, CORBA_Environment * ev)
+{
+ PortableServer_ObjectId *objid;
+
+ objid = PortableServer_POA_servant_to_id(servant->poa, servant, ev);
+ PortableServer_POA_deactivate_object(servant->poa, objid, ev);
+ CORBA_free(objid);
+
+ POA_CharDev__fini((PortableServer_Servant) servant, ev);
+ g_free(servant);
+}
+
+static CORBA_long
+impl_CharDev_read(impl_POA_CharDev * servant,
+ Buffer ** buffer, CORBA_long ReqSize, CORBA_Environment * ev)
+{
+ int AvailSize = strlen(message)-servant->AmountRead;
+ CORBA_long retval = (ReqSize > AvailSize) ? AvailSize : ReqSize;
+
+ *buffer = Buffer__alloc();
+ (*buffer)->_buffer = CORBA_octet_allocbuf(retval);
+ (*buffer)->_length = retval;
+
+ strncpy((*buffer)->_buffer, message + servant->AmountRead, retval);
+ servant->AmountRead += retval;
+ return retval;
+}
+
diff -urN linux-2.4.1/net/korbit/modules/Config.in linux-2.4.1-korbit/net/korbit/modules/Config.in
--- linux-2.4.1/net/korbit/modules/Config.in Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Config.in Thu Feb 1 11:46:58 2001
@@ -0,0 +1,11 @@
+# Console server
+#
+dep_tristate ' CORBA Console Server (EXPERIMENTAL)' CONFIG_CORBA_CONSOLE $CONFIG_KORBIT
+
+dep_tristate ' CORBA Echo Server (EXPERIMENTAL)' CONFIG_CORBA_ECHO $CONFIG_KORBIT
+
+dep_tristate ' CORBA FileSystem Access (EXPERIMENTAL)' CONFIG_CORBA_FILESERVER $CONFIG_KORBIT
+
+dep_tristate ' CORBA User-space FileSystem (EXPERIMENTAL)' CONFIG_CORBA_CORBAFS $CONFIG_KORBIT
+
+dep_tristate ' CORBA Character Device Interface (EXPERIMENTAL)' CONFIG_CORBA_CHARDEV $CONFIG_KORBIT
diff -urN linux-2.4.1/net/korbit/modules/Console/CVS/Entries linux-2.4.1-korbit/net/korbit/modules/Console/CVS/Entries
--- linux-2.4.1/net/korbit/modules/Console/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Console/CVS/Entries Thu Feb 1 11:47:01 2001
@@ -0,0 +1,4 @@
+/Makefile/1.2/Thu Feb 1 09:47:00 2001//
+/README/1.1/Thu Feb 1 09:47:00 2001//
+/console.idl/1.1/Thu Feb 1 09:47:00 2001//
+D
diff -urN linux-2.4.1/net/korbit/modules/Console/CVS/Entries.Log linux-2.4.1-korbit/net/korbit/modules/Console/CVS/Entries.Log
--- linux-2.4.1/net/korbit/modules/Console/CVS/Entries.Log Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Console/CVS/Entries.Log Thu Feb 1 11:47:02 2001
@@ -0,0 +1,3 @@
+A D/PerlClient////
+A D/client////
+A D/server////
diff -urN linux-2.4.1/net/korbit/modules/Console/CVS/Repository linux-2.4.1-korbit/net/korbit/modules/Console/CVS/Repository
--- linux-2.4.1/net/korbit/modules/Console/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Console/CVS/Repository Thu Feb 1 11:47:00 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/modules/Console
diff -urN linux-2.4.1/net/korbit/modules/Console/CVS/Root linux-2.4.1-korbit/net/korbit/modules/Console/CVS/Root
--- linux-2.4.1/net/korbit/modules/Console/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Console/CVS/Root Thu Feb 1 11:47:00 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/modules/Console/Makefile linux-2.4.1-korbit/net/korbit/modules/Console/Makefile
--- linux-2.4.1/net/korbit/modules/Console/Makefile Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Console/Makefile Thu Feb 1 11:47:00 2001
@@ -0,0 +1,11 @@
+#
+# Makefile for KORBit/modules/Console
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+
+subdir-$(CONFIG_CORBA_CONSOLE) := server
+
+include $(TOPDIR)/Rules.make
+
diff -urN linux-2.4.1/net/korbit/modules/Console/PerlClient/CVS/Entries linux-2.4.1-korbit/net/korbit/modules/Console/PerlClient/CVS/Entries
--- linux-2.4.1/net/korbit/modules/Console/PerlClient/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Console/PerlClient/CVS/Entries Thu Feb 1 11:47:01 2001
@@ -0,0 +1,3 @@
+/Client/1.1/Thu Feb 1 09:47:01 2001//
+/README/1.1/Thu Feb 1 09:47:01 2001//
+D
diff -urN linux-2.4.1/net/korbit/modules/Console/PerlClient/CVS/Repository linux-2.4.1-korbit/net/korbit/modules/Console/PerlClient/CVS/Repository
--- linux-2.4.1/net/korbit/modules/Console/PerlClient/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Console/PerlClient/CVS/Repository Thu Feb 1 11:47:01 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/modules/Console/PerlClient
diff -urN linux-2.4.1/net/korbit/modules/Console/PerlClient/CVS/Root linux-2.4.1-korbit/net/korbit/modules/Console/PerlClient/CVS/Root
--- linux-2.4.1/net/korbit/modules/Console/PerlClient/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Console/PerlClient/CVS/Root Thu Feb 1 11:47:01 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/modules/Console/PerlClient/Client linux-2.4.1-korbit/net/korbit/modules/Console/PerlClient/Client
--- linux-2.4.1/net/korbit/modules/Console/PerlClient/Client Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Console/PerlClient/Client Thu Feb 1 11:47:01 2001
@@ -0,0 +1,14 @@
+#!/usr/bin/perl -w
+
+use CORBA::ORBit idl => [ qw(../console.idl) ];
+use Error qw(:try);
+use strict;
+
+my $orb = CORBA::ORB_init("orbit-local-orb");
+open IOR, "/proc/corba/console-server" or die "no console server found!";
+my $ior = <IOR>;
+close IOR;
+chomp($ior); # Kill fredrik's newline...
+
+my $console = $orb->string_to_object($ior);
+$console->print("Hello Strange World");
diff -urN linux-2.4.1/net/korbit/modules/Console/PerlClient/README linux-2.4.1-korbit/net/korbit/modules/Console/PerlClient/README
--- linux-2.4.1/net/korbit/modules/Console/PerlClient/README Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Console/PerlClient/README Thu Feb 1 11:47:01 2001
@@ -0,0 +1,3 @@
+This is a perl client for the Console server.
+
+ORB: ORBit
diff -urN linux-2.4.1/net/korbit/modules/Console/README linux-2.4.1-korbit/net/korbit/modules/Console/README
--- linux-2.4.1/net/korbit/modules/Console/README Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Console/README Thu Feb 1 11:47:00 2001
@@ -0,0 +1 @@
+The "hello world" testcase. This is used to write a string to the linux console.
diff -urN linux-2.4.1/net/korbit/modules/Console/client/CVS/Entries linux-2.4.1-korbit/net/korbit/modules/Console/client/CVS/Entries
--- linux-2.4.1/net/korbit/modules/Console/client/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Console/client/CVS/Entries Thu Feb 1 11:47:01 2001
@@ -0,0 +1,4 @@
+/Makefile/1.2/Thu Feb 1 09:47:01 2001//
+/README/1.1/Thu Feb 1 09:47:01 2001//
+/console-client.c/1.1/Thu Feb 1 09:47:01 2001//
+D
diff -urN linux-2.4.1/net/korbit/modules/Console/client/CVS/Repository linux-2.4.1-korbit/net/korbit/modules/Console/client/CVS/Repository
--- linux-2.4.1/net/korbit/modules/Console/client/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Console/client/CVS/Repository Thu Feb 1 11:47:01 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/modules/Console/client
diff -urN linux-2.4.1/net/korbit/modules/Console/client/CVS/Root linux-2.4.1-korbit/net/korbit/modules/Console/client/CVS/Root
--- linux-2.4.1/net/korbit/modules/Console/client/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Console/client/CVS/Root Thu Feb 1 11:47:01 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/modules/Console/client/Makefile linux-2.4.1-korbit/net/korbit/modules/Console/client/Makefile
--- linux-2.4.1/net/korbit/modules/Console/client/Makefile Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Console/client/Makefile Thu Feb 1 11:47:01 2001
@@ -0,0 +1,32 @@
+#
+# Makefile for KORBit
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
+# Note 2! The CFLAGS definition is now in the main makefile...
+
+PROJECT = console
+
+CFLAGS = -Wall `orbit-config --cflags client` -I../../..
+LDFLAGS = `orbit-config --libs client`
+OBJS = $(PROJECT)-common.o $(PROJECT)-stubs.o $(PROJECT)-client.o
+ORBIT-IDL = orbit-idl
+
+$(PROJECT)-client: $(OBJS)
+ gcc -o $(PROJECT)-client $(OBJS) $(LDFLAGS)
+
+$(PROJECT)-client.c: $(PROJECT).h
+
+$(PROJECT).h $(PROJECT)-common.c $(PROJECT)-stubs.c: ../$(PROJECT).idl
+ $(ORBIT-IDL) --noskels ../$(PROJECT).idl
+
+clean:
+ rm -f $(OBJS) $(PROJECT)-client
+
+realclean: clean
+ rm -f $(PROJECT).h
+ rm -f $(PROJECT)-common.c
+ rm -f $(PROJECT)-stubs.c
+ rm -f *~
diff -urN linux-2.4.1/net/korbit/modules/Console/client/README linux-2.4.1-korbit/net/korbit/modules/Console/client/README
--- linux-2.4.1/net/korbit/modules/Console/client/README Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Console/client/README Thu Feb 1 11:47:01 2001
@@ -0,0 +1,3 @@
+C Client to access console server.
+
+ORB: ORBit
diff -urN linux-2.4.1/net/korbit/modules/Console/client/console-client.c linux-2.4.1-korbit/net/korbit/modules/Console/client/console-client.c
--- linux-2.4.1/net/korbit/modules/Console/client/console-client.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Console/client/console-client.c Thu Feb 1 11:47:01 2001
@@ -0,0 +1,63 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <orb/orbit.h>
+
+#include "console.h"
+
+Console console_client;
+
+int
+main (int argc, char *argv[])
+{
+ CORBA_Environment ev;
+ CORBA_ORB orb;
+ char *Message = "Hey dood, nice hair";
+ int i;
+
+ int niters = 10;
+
+ CORBA_exception_init(&ev);
+ orb = CORBA_ORB_init(&argc, argv, "orbit-local-orb", &ev);
+
+#if 0
+ for(i = 0; i < (sizeof(theblah) - 1); i++)
+ theblah[i] = 'a';
+ theblah[sizeof(theblah) - 1] = '\0';
+#endif
+
+ if(argc < 2)
+ {
+ printf("Need a binding ID thing as argv[1]\n");
+ return 1;
+ }
+
+ if(argc >= 3)
+ niters = atoi(argv[2]);
+
+ if (argc >= 4)
+ Message = argv[3];
+
+ console_client = CORBA_ORB_string_to_object(orb, argv[1], &ev);
+ if (!console_client) {
+ printf("Cannot bind to %s\n", argv[1]);
+ return 1;
+ }
+
+ printf("corba = %d, console = %d, foobar = %d\n",
+ CORBA_Object_is_a(console_client, "IDL:CORBA/Object:1.0", &ev),
+ CORBA_Object_is_a(console_client, "IDL:Empty:1.0", &ev),
+ CORBA_Object_is_a(console_client, "IDL:Foo/Bar:1.0", &ev));
+
+ for(i = 0; i < niters; i++) {
+ Console_print(console_client, Message, &ev);
+ if(ev._major != CORBA_NO_EXCEPTION) {
+ printf("we got exception %d from doNothing!\n", ev._major);
+ return 1;
+ }
+ }
+
+ CORBA_Object_release(console_client, &ev);
+ CORBA_Object_release((CORBA_Object)orb, &ev);
+
+ return 0;
+}
diff -urN linux-2.4.1/net/korbit/modules/Console/console.idl linux-2.4.1-korbit/net/korbit/modules/Console/console.idl
--- linux-2.4.1/net/korbit/modules/Console/console.idl Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Console/console.idl Thu Feb 1 11:47:00 2001
@@ -0,0 +1,3 @@
+interface Console {
+ void print(in string TheString);
+};
diff -urN linux-2.4.1/net/korbit/modules/Console/server/CVS/Entries linux-2.4.1-korbit/net/korbit/modules/Console/server/CVS/Entries
--- linux-2.4.1/net/korbit/modules/Console/server/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Console/server/CVS/Entries Thu Feb 1 11:47:02 2001
@@ -0,0 +1,5 @@
+/Makefile/1.7/Thu Feb 1 09:47:02 2001//
+/Makefile.user/1.1/Thu Feb 1 09:47:02 2001//
+/README/1.1/Thu Feb 1 09:47:02 2001//
+/console-server.c/1.7/Thu Feb 1 09:47:02 2001//
+D
diff -urN linux-2.4.1/net/korbit/modules/Console/server/CVS/Repository linux-2.4.1-korbit/net/korbit/modules/Console/server/CVS/Repository
--- linux-2.4.1/net/korbit/modules/Console/server/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Console/server/CVS/Repository Thu Feb 1 11:47:02 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/modules/Console/server
diff -urN linux-2.4.1/net/korbit/modules/Console/server/CVS/Root linux-2.4.1-korbit/net/korbit/modules/Console/server/CVS/Root
--- linux-2.4.1/net/korbit/modules/Console/server/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Console/server/CVS/Root Thu Feb 1 11:47:02 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/modules/Console/server/Makefile linux-2.4.1-korbit/net/korbit/modules/Console/server/Makefile
--- linux-2.4.1/net/korbit/modules/Console/server/Makefile Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Console/server/Makefile Thu Feb 1 11:47:02 2001
@@ -0,0 +1,21 @@
+#
+# Makefile for KORBit
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
+# Note 2! The CFLAGS definition is now in the main makefile...
+
+O_TARGET := corba-cons-server.o
+
+obj-y := console-server.o console-skels.o console-common.o
+obj-m := $(O_TARGET)
+
+include ../../Makefile.module
+
+console-server.c: console.h console-common.c console-skels.c
+
+
+console.h console-skels.c: ../console.idl
+ $(ORBIT_IDL) ../console.idl
diff -urN linux-2.4.1/net/korbit/modules/Console/server/Makefile.user linux-2.4.1-korbit/net/korbit/modules/Console/server/Makefile.user
--- linux-2.4.1/net/korbit/modules/Console/server/Makefile.user Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Console/server/Makefile.user Thu Feb 1 11:47:02 2001
@@ -0,0 +1,32 @@
+#
+# Makefile for KORBit
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
+# Note 2! The CFLAGS definition is now in the main makefile...
+
+PROJECT = console
+
+CFLAGS = -Wall `orbit-config --cflags server` -I../../..
+LDFLAGS = `orbit-config --libs server`
+OBJS = $(PROJECT)-common.o $(PROJECT)-skels.o $(PROJECT)-server.o
+ORBIT-IDL = orbit-idl
+
+$(PROJECT)-server: $(OBJS)
+ gcc -o $(PROJECT)-server $(OBJS) $(LDFLAGS)
+
+$(PROJECT)-server.c: $(PROJECT).h
+
+$(PROJECT).h $(PROJECT)-common.c $(PROJECT)-skels.c: ../$(PROJECT).idl
+ $(ORBIT-IDL) --nostubs ../$(PROJECT).idl
+
+clean:
+ rm -f $(OBJS) $(PROJECT)-server
+
+realclean: clean
+ rm -f $(PROJECT).h
+ rm -f $(PROJECT)-common.c
+ rm -f $(PROJECT)-skels.c
+ rm -f *~
diff -urN linux-2.4.1/net/korbit/modules/Console/server/README linux-2.4.1-korbit/net/korbit/modules/Console/server/README
--- linux-2.4.1/net/korbit/modules/Console/server/README Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Console/server/README Thu Feb 1 11:47:02 2001
@@ -0,0 +1 @@
+Kernel module to implement Console server.
diff -urN linux-2.4.1/net/korbit/modules/Console/server/console-server.c linux-2.4.1-korbit/net/korbit/modules/Console/server/console-server.c
--- linux-2.4.1/net/korbit/modules/Console/server/console-server.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Console/server/console-server.c Thu Feb 1 11:47:02 2001
@@ -0,0 +1,85 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+#include <orb/orbit.h>
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include "console.h"
+#include "glib.h"
+#include "korbit.h"
+
+Console console_client = CORBA_OBJECT_NIL;
+
+static void corba_console_print(PortableServer_Servant _servant,
+ CORBA_char *TheString,
+ CORBA_Environment *ev);
+
+PortableServer_ServantBase__epv base_epv = {
+ NULL,
+ NULL,
+ NULL
+};
+POA_Console__epv console_epv = { NULL, corba_console_print };
+POA_Console__vepv poa_console_vepv = { &base_epv, &console_epv };
+POA_Console poa_console_servant = { NULL, &poa_console_vepv };
+
+// MAke this global so that I can unregister the module...
+PortableServer_ObjectId objid = {0, sizeof("myFoo"), "myFoo"};
+CORBA_Environment *ev;
+PortableServer_POA poa;
+
+#ifdef __KERNEL__
+int __init corba_console_init(void)
+#else
+int main(int argc, char *argv[])
+#endif
+{
+#ifdef __KERNEL__
+ int argc = 1; char *argv[] = { "server", 0 };
+#endif
+ CORBA_ORB orb;
+
+ ev = g_new0(CORBA_Environment, 1);
+ CORBA_exception_init(ev);
+ orb = CORBA_ORB_init(&argc, argv, "orbit-local-orb", ev);
+
+ poa = (PortableServer_POA)CORBA_ORB_resolve_initial_references(orb, "RootPOA", ev);
+ PortableServer_POAManager_activate(PortableServer_POA__get_the_POAManager(poa, ev), ev);
+
+ POA_Console__init(&poa_console_servant, ev);
+
+ PortableServer_POA_activate_object_with_id(poa,
+ &objid, &poa_console_servant, ev);
+
+ console_client =
+ PortableServer_POA_servant_to_reference(poa, &poa_console_servant, ev);
+ if (!console_client) {
+ printf("Cannot get objref\n");
+ return 1;
+ }
+
+ korbit_register_ior("console-server", console_client, orb, ev);
+
+ CORBA_ORB_run(orb, ev);
+
+ return 0;
+}
+
+#ifdef __KERNEL__
+void corba_console_exit(void) {
+ PortableServer_POA_deactivate_object(poa, &objid, ev);
+ remove_proc_entry("corba/console-server", 0);
+}
+
+module_init(corba_console_init)
+module_exit(corba_console_exit)
+#endif
+
+static void corba_console_print(PortableServer_Servant _servant,
+ CORBA_char *TheString,
+ CORBA_Environment *ev) {
+ printf("Yo. Dood. You said: '%s'!\n", TheString);
+}
+
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/CVS/Entries linux-2.4.1-korbit/net/korbit/modules/CorbaFS/CVS/Entries
--- linux-2.4.1/net/korbit/modules/CorbaFS/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/CVS/Entries Thu Feb 1 11:47:02 2001
@@ -0,0 +1,4 @@
+/CorbaFS.idl/1.7/Thu Feb 1 09:47:02 2001//
+/Makefile/1.4/Thu Feb 1 09:47:02 2001//
+/README/1.2/Thu Feb 1 09:47:02 2001//
+D
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/CVS/Entries.Log linux-2.4.1-korbit/net/korbit/modules/CorbaFS/CVS/Entries.Log
--- linux-2.4.1/net/korbit/modules/CorbaFS/CVS/Entries.Log Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/CVS/Entries.Log Thu Feb 1 11:47:04 2001
@@ -0,0 +1,3 @@
+A D/client////
+A D/server////
+A D/server-perl////
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/CVS/Repository linux-2.4.1-korbit/net/korbit/modules/CorbaFS/CVS/Repository
--- linux-2.4.1/net/korbit/modules/CorbaFS/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/CVS/Repository Thu Feb 1 11:47:02 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/modules/CorbaFS
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/CVS/Root linux-2.4.1-korbit/net/korbit/modules/CorbaFS/CVS/Root
--- linux-2.4.1/net/korbit/modules/CorbaFS/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/CVS/Root Thu Feb 1 11:47:02 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/CorbaFS.idl linux-2.4.1-korbit/net/korbit/modules/CorbaFS/CorbaFS.idl
--- linux-2.4.1/net/korbit/modules/CorbaFS/CorbaFS.idl Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/CorbaFS.idl Thu Feb 1 11:47:02 2001
@@ -0,0 +1,38 @@
+// -----------------------------------------------------------------------------
+// CorbaDS Module - Implement Kernel functionality in Korba
+// -----------------------------------------------------------------------------
+//
+// Main source of information:
+// http://www.cse.unsw.edu.au/~neilb/oss/linux-commentary/vfs.html
+//
+module CorbaFS {
+
+ struct dirent
+ {
+ long inode; // inode number
+ string name; // file name (null-terminated)
+ };
+
+ typedef sequence<dirent> DirEntSeq;
+ typedef sequence<octet> Buffer;
+
+ interface Inode {
+ void getStatus(out unsigned short mode, out unsigned long uid, out unsigned long gid,
+ out unsigned long size, out unsigned long inodeNum, out unsigned short numLinks,
+ out long atime, out long mtime, out long ctime);
+ void readpage(out Buffer buffer, in long size, in long offset);
+ void release();
+ };
+
+ interface FileSystem {
+ Inode getInode(in string path);
+
+ // DirectoryInode getStatus implementation must have S_IFDIR in the S_IFMT
+ // field of the mode value.
+ DirEntSeq readdir(in string path);
+
+ // SymlinkInode getStatus implementation must have S_IFLNK in the S_IFMT
+ // field of the mode value.
+ string readlink(in string filename);
+ };
+};
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/Makefile linux-2.4.1-korbit/net/korbit/modules/CorbaFS/Makefile
--- linux-2.4.1/net/korbit/modules/CorbaFS/Makefile Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/Makefile Thu Feb 1 11:47:02 2001
@@ -0,0 +1,11 @@
+#
+# Makefile for KORBit - CorbaFS
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+
+subdir-$(CONFIG_CORBA_CORBAFS) := client
+
+include $(TOPDIR)/Rules.make
+
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/README linux-2.4.1-korbit/net/korbit/modules/CorbaFS/README
--- linux-2.4.1/net/korbit/modules/CorbaFS/README Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/README Thu Feb 1 11:47:02 2001
@@ -0,0 +1,14 @@
+This interface is used to implement linux FileSystems in CORBA.
+
+Status: Working for readonly filesystems. Write capability is a todo.
+
+This lets you do all kinds of interesting things (just like the user level
+filesystem proposals would let you do):
+ server/ implements NFS like capability of just exporting an existing FS
+ TODO: webfs, ftpfs, cvsfs, mysqlfs...
+
+Usage:
+ insmod corba-corbafs.o
+ mount -t corbafs -o IOR:... none /mnt/corbafs
+
+Where the IOR comes from a filesystem server that you run somewhere...
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/client/CVS/Entries linux-2.4.1-korbit/net/korbit/modules/CorbaFS/client/CVS/Entries
--- linux-2.4.1/net/korbit/modules/CorbaFS/client/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/client/CVS/Entries Thu Feb 1 11:47:03 2001
@@ -0,0 +1,6 @@
+/CorbaFS-client.c/1.9/Thu Feb 1 09:47:03 2001//
+/CorbaFS-user-client.c/1.3/Thu Feb 1 09:47:03 2001//
+/Makefile/1.4/Thu Feb 1 09:47:03 2001//
+/Makefile.user/1.1/Thu Feb 1 09:47:03 2001//
+/README/1.1/Thu Feb 1 09:47:03 2001//
+D
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/client/CVS/Repository linux-2.4.1-korbit/net/korbit/modules/CorbaFS/client/CVS/Repository
--- linux-2.4.1/net/korbit/modules/CorbaFS/client/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/client/CVS/Repository Thu Feb 1 11:47:03 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/modules/CorbaFS/client
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/client/CVS/Root linux-2.4.1-korbit/net/korbit/modules/CorbaFS/client/CVS/Root
--- linux-2.4.1/net/korbit/modules/CorbaFS/client/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/client/CVS/Root Thu Feb 1 11:47:03 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/client/CorbaFS-client.c linux-2.4.1-korbit/net/korbit/modules/CorbaFS/client/CorbaFS-client.c
--- linux-2.4.1/net/korbit/modules/CorbaFS/client/CorbaFS-client.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/client/CorbaFS-client.c Fri Feb 2 02:20:21 2001
@@ -0,0 +1,469 @@
+/*
+ * corbafs - Interface glue between native linux VFS layer and CORBA
+ */
+
+#include <linux/module.h>
+#include <linux/fs.h>
+#include <linux/pagemap.h>
+#include <linux/init.h>
+#include <linux/string.h>
+#include <linux/locks.h>
+#include <linux/dirent.h>
+#include <linux/module.h>
+
+#include <asm/uaccess.h>
+#include "CorbaFS.h"
+
+/* some random number */
+#define CORBAFS_MAGIC 0xC02BAF5
+
+// CORBA Stuff...
+CORBA_ORB orb;
+CORBA_Environment *ev;
+
+
+/*
+ * FILE OPERATIONS FILE OPERATIONS FILE OPERATIONS FILE OPERATIONS
+ */
+
+/* Declarations for the file_operations structure for normal files...
+ */
+static struct file_operations corbafs_file_operations = {
+ read: generic_file_read,
+};
+
+
+/* Declarations for the file_operations structure for directories...
+ */
+static int corbafs_readdir(struct file *file, void *data, filldir_t filldir);
+
+static struct file_operations corbafs_dir_operations = {
+ read: generic_read_dir,
+ readdir: corbafs_readdir,
+};
+
+
+/*
+ * INODE OPERATIONS INODE OPERATIONS INODE OPERATIONS INODE OPERATIONS
+ */
+
+/* Declarations for the inode_operations structure for symlinks...
+ */
+static int corbafs_readlink(struct dentry *dentry, char *buffer, int buflen);
+static int corbafs_followlink(struct dentry *link, struct nameidata *nd);
+
+static struct inode_operations corbafs_symlink_inode_operations = {
+ readlink: corbafs_readlink,
+ follow_link: corbafs_followlink,
+};
+
+
+/* Declarations for the inode_operations structure for directories...
+ */
+static struct dentry *corbafs_lookup(struct inode *dir, struct dentry *dentry);
+
+static struct inode_operations corbafs_dir_inode_operations = {
+ lookup: corbafs_lookup,
+};
+
+
+/*
+ * OTHER OPERATIONS OTHER OPERATIONS OTHER OPERATIONS OTHER OPERATIONS
+ */
+
+/* Declarations for the corba FS's address space ops...
+ */
+static int corbafs_readpage(struct file *file, struct page * page);
+
+static struct address_space_operations corbafs_aops = {
+ readpage: corbafs_readpage,
+};
+
+
+/* Declarations for the super_operations structure...
+ */
+static int corbafs_statfs(struct super_block *sb, struct statfs *buf);
+static void corbafs_delete_inode(struct inode *);
+
+static struct super_operations corbafs_ops = {
+ statfs: corbafs_statfs,
+ delete_inode: corbafs_delete_inode,
+};
+
+
+
+
+/* do_local_path - Modified version of d_path that is used to get the remote
+ * filename that a dentry represents...
+ */
+static char *d_local_path(struct dentry *dentry, char *buffer, int buflen) {
+ char * end = buffer+buflen;
+ char * retval;
+ int namelen;
+
+ *--end = '\0';
+ buflen--;
+
+ /* Get '/' right */
+ retval = end-1;
+ *retval = '/';
+ for (;;) {
+ if (IS_ROOT(dentry)) {
+ if (dentry->d_name.len > 1 ||
+ dentry->d_name.name[0] != '/' ||
+ retval != end) { /* Only for root directory */
+ namelen = dentry->d_name.len;
+ buflen -= namelen;
+ if (buflen >= 0) {
+ end -= namelen;
+ memcpy(end, dentry->d_name.name, namelen);
+ }
+ }
+ return end;
+ }
+ namelen = dentry->d_name.len;
+ buflen -= namelen + 1;
+ if (buflen < 0)
+ break;
+ end -= namelen;
+ memcpy(end, dentry->d_name.name, namelen);
+ *--end = '/';
+ retval = end;
+ if (dentry == dentry->d_parent) break;
+ dentry = dentry->d_parent;
+ }
+ return retval;
+}
+
+
+/* corbafs_readpage - This request should be between a file_open and a
+ * file_release, so file_fd(f) should be valid. Just read the buffer...
+ */
+static int corbafs_readpage(struct file *f, struct page * page)
+{
+ struct inode *d_inode = f->f_dentry->d_inode;
+ CorbaFS_Inode inode;
+ CorbaFS_Buffer *buffer = NULL;
+
+ int offset = page->index*PAGE_CACHE_SIZE;
+ int bytesRead;
+
+#if 0
+ printk("*** READPAGE 0x%p: 0x%lX->0x%lX to 0x%p\n",
+ f,
+ page->index,
+ page->index*PAGE_CACHE_SIZE,
+ page_address(page));
+#endif
+
+ inode = d_inode->u.generic_ip;
+ if (!inode) return -EPERM;
+
+ CorbaFS_Inode_readpage(inode, &buffer, PAGE_CACHE_SIZE, offset, ev);
+ if (!buffer) return -EPERM; /* ??? */
+
+ bytesRead = buffer->_length;
+ memcpy(page_address(page), buffer->_buffer, bytesRead);
+
+ if (bytesRead != PAGE_CACHE_SIZE) { /* EOF? */
+ /* Zero out rest of page for security. */
+ memset((void*)(page_address(page)+bytesRead), 0,
+ PAGE_CACHE_SIZE-bytesRead);
+ }
+
+ SetPageUptodate(page);
+ UnlockPage(page);
+ return 0;
+}
+
+
+
+struct inode *corbafs_get_inode(struct super_block *sb, const char *path)
+{
+ struct inode * inode = get_empty_inode();
+ CorbaFS_FileSystem fs_client;
+ CorbaFS_Inode newInode;
+
+ if (!inode) return 0;
+
+ inode->i_sb = sb;
+ inode->i_dev = sb->s_dev;
+
+ fs_client = sb->u.generic_sbp;
+//printk("\n \n \nCorbaFS_FileSystem_getInode(0x%X, %s)\n", fs_client, path);
+ newInode = CorbaFS_FileSystem_getInode(fs_client, path, ev);
+//printk("NewInode = 0x%X\n \n \n \n", newInode);
+ if (!newInode) {
+ iput(inode);
+ return NULL;
+ }
+
+//printk("CorbaFS_Inode_getStatus\n");
+ CorbaFS_Inode_getStatus(newInode,
+ &inode->i_mode, &inode->i_uid, &inode->i_gid,
+ (CORBA_unsigned_long *)&inode->i_size,
+ (CORBA_unsigned_long *)&inode->i_ino,
+ &inode->i_nlink,
+ (CORBA_long *)&inode->i_atime,
+ (CORBA_long *)&inode->i_mtime,
+ (CORBA_long *)&inode->i_ctime,
+ ev);
+//printk("Back from CorbaFS_Inode_getStatus\n \n \n \n");
+
+ inode->u.generic_ip = (void*)newInode;
+
+ /* TODO: Map things back correctly??? */
+ inode->i_uid = 0 /*current->fsuid */;
+ inode->i_gid = 0 /*current->fsgid */;
+
+ inode->i_blksize = PAGE_CACHE_SIZE;
+ inode->i_blocks = 0;
+ inode->i_rdev = 0;
+ inode->i_op = NULL;
+ inode->i_fop = NULL;
+ inode->i_mapping->a_ops = &corbafs_aops;
+ inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
+
+ switch (inode->i_mode & S_IFMT) {
+ default:
+ /* Do I really want to expose device inodes? */
+ init_special_inode(inode, inode->i_mode, sb->s_dev);
+ break;
+ case S_IFREG:
+ inode->i_fop = &corbafs_file_operations;
+ break;
+ case S_IFDIR:
+ inode->i_op = &corbafs_dir_inode_operations;
+ inode->i_fop = &corbafs_dir_operations;
+ break;
+ case S_IFLNK:
+ inode->i_op = &corbafs_symlink_inode_operations;
+ break;
+ }
+ insert_inode_hash(inode);
+
+ return inode;
+}
+
+static int corbafs_readdir(struct file *file, void *data, filldir_t filldir)
+{
+ struct inode *inode = file->f_dentry->d_inode;
+ struct super_block *sb = file->f_dentry->d_sb;
+ unsigned offset = file->f_pos;
+ char *path, *page = (char *)__get_free_page(GFP_KERNEL);
+ int i;
+ unsigned char d_type = DT_UNKNOWN;
+ CorbaFS_FileSystem fs_client;
+ CorbaFS_DirEntSeq *dirEntSeq;
+ CorbaFS_dirent *dirEnts;
+
+ if (offset >= inode->i_size) return 0;
+
+ path = d_local_path(file->f_dentry, page, PAGE_SIZE);
+
+ fs_client = sb->u.generic_sbp;
+ if (!fs_client)
+ return -EPERM; /* ??? */
+
+// printk("\n \n \nCorbaFS_FileSystem_readdir(%s)\n", path);
+
+ dirEntSeq = CorbaFS_FileSystem_readdir(fs_client, path, ev);
+
+// printk("CorbaFS_FileSystem_readdir = %d\n \n \n \n", dirEntSeq->_length);
+
+ if (dirEntSeq->_length == 0) goto full;
+
+ dirEnts = dirEntSeq->_buffer;
+ i = 0;
+ if (offset) { // We have read PART of the directory
+ int idxadj = offset; // Start reading now from where we left
+ while (idxadj > 0) { // off...
+ idxadj -= sizeof(struct dirent)+
+ strlen(dirEnts[i].name);
+ i++;
+ }
+
+ if (idxadj < 0) { // We should end up with exactly 0.
+ printf("Alert! Readdir can't resume in the middle "
+ "of a directory! stopage.\n");
+ goto full;
+ }
+ }
+
+ for (; i < dirEntSeq->_length; i++) {
+ int myinode = dirEnts[i].inode;
+ char *myname = dirEnts[i].name;
+ int namelen = strlen(myname);
+
+ if (filldir(data, myname, namelen, offset, myinode, d_type))
+ goto full;
+ offset += sizeof(struct dirent)+namelen;
+ }
+
+ full:
+ file->f_pos = offset;
+ return 0;
+}
+
+static int corbafs_statfs(struct super_block *sb, struct statfs *buf) {
+ buf->f_type = CORBAFS_MAGIC;
+ buf->f_bsize = PAGE_CACHE_SIZE;
+ buf->f_namelen = 255;
+ return 0;
+}
+
+/*
+ * Lookup the data. Most of the grunt work is done by corbafs_get_inode.
+ */
+static struct dentry *corbafs_lookup(struct inode *dir, struct dentry *dentry)
+{
+ struct inode *New;
+ char *Path, *Page = (char *)__get_free_page(GFP_KERNEL);
+ if (Page == 0) goto out; /* nomem? */
+
+ Path = d_local_path(dentry, Page, PAGE_SIZE);
+
+ New = corbafs_get_inode(dir->i_sb, Path);
+ free_page((unsigned long)Page);
+
+ if (New) {
+ d_add(dentry, New);
+ return 0;
+ }
+
+out:
+ d_add(dentry, NULL);
+ return 0;
+}
+
+
+static char *corbafs_read_a_link(struct dentry *dentry) {
+ char *path, *page, *s = 0;
+ struct super_block *sb = dentry->d_sb;
+ CorbaFS_FileSystem fs_client;
+
+ page = (char *)__get_free_page(GFP_KERNEL);
+ if (page == 0) goto out; /* nomem? */
+
+ path = d_local_path(dentry, page, PAGE_SIZE);
+
+ fs_client = sb->u.generic_sbp;
+// printk("\n \n \nCorbaFS_FileSystem_readlink(%s)\n", path);
+ s = CorbaFS_FileSystem_readlink(fs_client, path, ev);
+// printk("CorbaFS_FileSystem_readlink = %s\n \n \n \n", s);
+
+ if (ev->_major != CORBA_NO_EXCEPTION) {
+ if (s) {
+ // CORBA_string_free(s,..);
+ s = 0;
+ }
+ goto outfree;
+ }
+ outfree:
+ free_page((unsigned long)page);
+ out:
+ return s;
+}
+
+
+static int corbafs_readlink(struct dentry *dentry, char *buffer, int buflen) {
+ char *str = corbafs_read_a_link(dentry);
+ int error = -EINVAL;
+
+ if (str) {
+ error = vfs_readlink(dentry, buffer, buflen, str);
+ // TODO: CORBA_string__free the string str.
+ }
+ return error;
+}
+
+/* Fill in nd->dentry
+ */
+static int corbafs_followlink(struct dentry *link, struct nameidata *nd) {
+ int Error = -ENOMEM;
+ char *Path = corbafs_read_a_link(link);
+ if (!Path) goto out;
+
+#if 1
+ printk("Followlink: %s\n", Path);
+#endif
+ Error = vfs_follow_link(nd, Path);
+ // TODO: CORBA_string__free the string str.
+
+ out:
+ return Error;
+}
+
+static void corbafs_delete_inode(struct inode *inode) {
+ CorbaFS_Inode Inode = inode->u.generic_ip;
+// printk("\n \n \nCorbaFS_Inode_Release\n");
+ CorbaFS_Inode_release(Inode, ev);
+// printk("CorbaFS_Inode_Release done\n \n \n \n");
+}
+
+static void corbafs_put_super(struct super_block *sb) {
+// MOD_DEC_USE_COUNT;
+}
+
+static struct super_block *corbafs_read_super(struct super_block * sb, void * data, int silent) {
+ struct dentry *root = 0;
+ struct inode *root_inode = 0;
+
+ CorbaFS_FileSystem fs_client;
+
+ sb->s_blocksize = PAGE_CACHE_SIZE;
+ sb->s_blocksize_bits = PAGE_CACHE_SHIFT;
+ sb->s_magic = CORBAFS_MAGIC;
+ sb->s_op = &corbafs_ops;
+
+//printk("corbafs_read_super: '%s'\n", (char*)data);
+
+ // Note that the CORBA IOR is now in *data
+ fs_client = CORBA_ORB_string_to_object(orb, data, ev);
+
+//printk("fs_client: 0x%X\n", fs_client);
+ if (!fs_client)
+ return NULL;
+
+ sb->u.generic_sbp = fs_client;
+
+ root_inode = corbafs_get_inode(sb, "/");
+//printk("root_inode = 0x%X\n", root_inode);
+ root = d_alloc_root(root_inode);
+ if (!root) {
+ iput(root_inode);
+ return NULL;
+ }
+ sb->s_root = root;
+
+// MOD_INC_USE_COUNT;
+ return sb;
+}
+
+static DECLARE_FSTYPE(corbafs_fs_type, "corbafs", corbafs_read_super, 0);
+
+static int __init init_corbafs_fs(void) {
+ int argc = 1;
+ char *argv[] = { "client", 0 };
+ ev = g_new0(CORBA_Environment,1);
+ orb = CORBA_ORB_init(&argc, argv, "orbit-local-orb", ev);
+
+ return register_filesystem(&corbafs_fs_type);
+}
+
+static void __exit exit_corbafs_fs(void)
+{
+ // remove object from orb.
+ printf("\n \n \nCorbaFS_exit()\n");
+ unregister_filesystem(&corbafs_fs_type);
+ CORBA_Object_release((CORBA_Object)orb, ev);
+}
+
+module_init(init_corbafs_fs)
+module_exit(exit_corbafs_fs)
+
+/*
+ * Local variables:
+ * c-file-style: "linux"
+ * End:
+ */
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/client/CorbaFS-common.c linux-2.4.1-korbit/net/korbit/modules/CorbaFS/client/CorbaFS-common.c
--- linux-2.4.1/net/korbit/modules/CorbaFS/client/CorbaFS-common.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/client/CorbaFS-common.c Thu Feb 1 16:36:08 2001
@@ -0,0 +1,370 @@
+/*
+ * This file was generated by orbit-idl - DO NOT EDIT!
+ */
+
+#include <string.h>
+#include "CorbaFS.h"
+
+#if ( (TC_IMPL_TC_CorbaFS_dirent_0 == 'C') \
+&& (TC_IMPL_TC_CorbaFS_dirent_1 == 'o') \
+&& (TC_IMPL_TC_CorbaFS_dirent_2 == 'r') \
+&& (TC_IMPL_TC_CorbaFS_dirent_3 == 'b') \
+&& (TC_IMPL_TC_CorbaFS_dirent_4 == 'a') \
+&& (TC_IMPL_TC_CorbaFS_dirent_5 == 'F') \
+&& (TC_IMPL_TC_CorbaFS_dirent_6 == 'S') \
+) && !defined(TC_DEF_TC_CorbaFS_dirent)
+#define TC_DEF_TC_CorbaFS_dirent 1
+static const char *anon_subnames_array1[] = { "inode", "name" };
+static const CORBA_TypeCode anon_subtypes_array2[] =
+ { (CORBA_TypeCode) & TC_CORBA_long_struct,
+ (CORBA_TypeCode) & TC_CORBA_string_struct };
+const struct CORBA_TypeCode_struct TC_CorbaFS_dirent_struct = {
+
+ {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1},
+ ORBIT_PSEUDO_TYPECODE},
+
+ CORBA_tk_struct, "dirent", "IDL:CorbaFS/dirent:1.0",
+ 0, 2,
+ (const char **) anon_subnames_array1,
+ (CORBA_TypeCode *) anon_subtypes_array2,
+ NULL,
+ CORBA_OBJECT_NIL, 0, -1, 0, 0
+};
+#endif
+#if ( (TC_IMPL_TC_CORBA_sequence_CorbaFS_dirent_0 == 'C') \
+&& (TC_IMPL_TC_CORBA_sequence_CorbaFS_dirent_1 == 'o') \
+&& (TC_IMPL_TC_CORBA_sequence_CorbaFS_dirent_2 == 'r') \
+&& (TC_IMPL_TC_CORBA_sequence_CorbaFS_dirent_3 == 'b') \
+&& (TC_IMPL_TC_CORBA_sequence_CorbaFS_dirent_4 == 'a') \
+&& (TC_IMPL_TC_CORBA_sequence_CorbaFS_dirent_5 == 'F') \
+&& (TC_IMPL_TC_CORBA_sequence_CorbaFS_dirent_6 == 'S') \
+) && !defined(TC_DEF_TC_CORBA_sequence_CorbaFS_dirent)
+#define TC_DEF_TC_CORBA_sequence_CorbaFS_dirent 1
+static const CORBA_TypeCode anon_subtypes_array6[] =
+ { (CORBA_TypeCode) & TC_CorbaFS_dirent_struct };
+const struct CORBA_TypeCode_struct TC_CORBA_sequence_CorbaFS_dirent_struct = {
+
+ {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1},
+ ORBIT_PSEUDO_TYPECODE},
+
+ CORBA_tk_sequence, NULL, NULL,
+ 0, 1,
+ NULL,
+ (CORBA_TypeCode *) anon_subtypes_array6,
+ NULL,
+ CORBA_OBJECT_NIL, 0, -1, 0, 0
+};
+#endif
+#if ( (TC_IMPL_TC_CORBA_sequence_CorbaFS_dirent_0 == 'C') \
+&& (TC_IMPL_TC_CORBA_sequence_CorbaFS_dirent_1 == 'o') \
+&& (TC_IMPL_TC_CORBA_sequence_CorbaFS_dirent_2 == 'r') \
+&& (TC_IMPL_TC_CORBA_sequence_CorbaFS_dirent_3 == 'b') \
+&& (TC_IMPL_TC_CORBA_sequence_CorbaFS_dirent_4 == 'a') \
+&& (TC_IMPL_TC_CORBA_sequence_CorbaFS_dirent_5 == 'F') \
+&& (TC_IMPL_TC_CORBA_sequence_CorbaFS_dirent_6 == 'S') \
+) && !defined(TC_DEF_TC_CORBA_sequence_CorbaFS_dirent)
+#define TC_DEF_TC_CORBA_sequence_CorbaFS_dirent 1
+static const CORBA_TypeCode anon_subtypes_array15[] =
+ { (CORBA_TypeCode) & TC_CorbaFS_dirent_struct };
+const struct CORBA_TypeCode_struct TC_CORBA_sequence_CorbaFS_dirent_struct = {
+
+ {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1},
+ ORBIT_PSEUDO_TYPECODE},
+
+ CORBA_tk_sequence, NULL, NULL,
+ 0, 1,
+ NULL,
+ (CORBA_TypeCode *) anon_subtypes_array15,
+ NULL,
+ CORBA_OBJECT_NIL, 0, -1, 0, 0
+};
+#endif
+#if ( (TC_IMPL_TC_CorbaFS_DirEntSeq_0 == 'C') \
+&& (TC_IMPL_TC_CorbaFS_DirEntSeq_1 == 'o') \
+&& (TC_IMPL_TC_CorbaFS_DirEntSeq_2 == 'r') \
+&& (TC_IMPL_TC_CorbaFS_DirEntSeq_3 == 'b') \
+&& (TC_IMPL_TC_CorbaFS_DirEntSeq_4 == 'a') \
+&& (TC_IMPL_TC_CorbaFS_DirEntSeq_5 == 'F') \
+&& (TC_IMPL_TC_CorbaFS_DirEntSeq_6 == 'S') \
+) && !defined(TC_DEF_TC_CorbaFS_DirEntSeq)
+#define TC_DEF_TC_CorbaFS_DirEntSeq 1
+static const CORBA_TypeCode anon_subtypes_array19[] =
+ { (CORBA_TypeCode) & TC_CORBA_sequence_CorbaFS_dirent_struct };
+const struct CORBA_TypeCode_struct TC_CorbaFS_DirEntSeq_struct = {
+
+ {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1},
+ ORBIT_PSEUDO_TYPECODE},
+
+ CORBA_tk_alias, "DirEntSeq", "IDL:CorbaFS/DirEntSeq:1.0",
+ 0, 1,
+ NULL,
+ (CORBA_TypeCode *) anon_subtypes_array19,
+ NULL,
+ CORBA_OBJECT_NIL, 0, -1, 0, 0
+};
+#endif
+#if ( (TC_IMPL_TC_CORBA_sequence_CORBA_octet_0 == 'C') \
+&& (TC_IMPL_TC_CORBA_sequence_CORBA_octet_1 == 'o') \
+&& (TC_IMPL_TC_CORBA_sequence_CORBA_octet_2 == 'r') \
+&& (TC_IMPL_TC_CORBA_sequence_CORBA_octet_3 == 'b') \
+&& (TC_IMPL_TC_CORBA_sequence_CORBA_octet_4 == 'a') \
+&& (TC_IMPL_TC_CORBA_sequence_CORBA_octet_5 == 'F') \
+&& (TC_IMPL_TC_CORBA_sequence_CORBA_octet_6 == 'S') \
+) && !defined(TC_DEF_TC_CORBA_sequence_CORBA_octet)
+#define TC_DEF_TC_CORBA_sequence_CORBA_octet 1
+static const CORBA_TypeCode anon_subtypes_array23[] =
+ { (CORBA_TypeCode) & TC_CORBA_octet_struct };
+const struct CORBA_TypeCode_struct TC_CORBA_sequence_CORBA_octet_struct = {
+
+ {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1},
+ ORBIT_PSEUDO_TYPECODE},
+
+ CORBA_tk_sequence, NULL, NULL,
+ 0, 1,
+ NULL,
+ (CORBA_TypeCode *) anon_subtypes_array23,
+ NULL,
+ CORBA_OBJECT_NIL, 0, -1, 0, 0
+};
+#endif
+#if ( (TC_IMPL_TC_CORBA_sequence_CORBA_octet_0 == 'C') \
+&& (TC_IMPL_TC_CORBA_sequence_CORBA_octet_1 == 'o') \
+&& (TC_IMPL_TC_CORBA_sequence_CORBA_octet_2 == 'r') \
+&& (TC_IMPL_TC_CORBA_sequence_CORBA_octet_3 == 'b') \
+&& (TC_IMPL_TC_CORBA_sequence_CORBA_octet_4 == 'a') \
+&& (TC_IMPL_TC_CORBA_sequence_CORBA_octet_5 == 'F') \
+&& (TC_IMPL_TC_CORBA_sequence_CORBA_octet_6 == 'S') \
+) && !defined(TC_DEF_TC_CORBA_sequence_CORBA_octet)
+#define TC_DEF_TC_CORBA_sequence_CORBA_octet 1
+static const CORBA_TypeCode anon_subtypes_array32[] =
+ { (CORBA_TypeCode) & TC_CORBA_octet_struct };
+const struct CORBA_TypeCode_struct TC_CORBA_sequence_CORBA_octet_struct = {
+
+ {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1},
+ ORBIT_PSEUDO_TYPECODE},
+
+ CORBA_tk_sequence, NULL, NULL,
+ 0, 1,
+ NULL,
+ (CORBA_TypeCode *) anon_subtypes_array32,
+ NULL,
+ CORBA_OBJECT_NIL, 0, -1, 0, 0
+};
+#endif
+#if ( (TC_IMPL_TC_CorbaFS_Buffer_0 == 'C') \
+&& (TC_IMPL_TC_CorbaFS_Buffer_1 == 'o') \
+&& (TC_IMPL_TC_CorbaFS_Buffer_2 == 'r') \
+&& (TC_IMPL_TC_CorbaFS_Buffer_3 == 'b') \
+&& (TC_IMPL_TC_CorbaFS_Buffer_4 == 'a') \
+&& (TC_IMPL_TC_CorbaFS_Buffer_5 == 'F') \
+&& (TC_IMPL_TC_CorbaFS_Buffer_6 == 'S') \
+) && !defined(TC_DEF_TC_CorbaFS_Buffer)
+#define TC_DEF_TC_CorbaFS_Buffer 1
+static const CORBA_TypeCode anon_subtypes_array36[] =
+ { (CORBA_TypeCode) & TC_CORBA_sequence_CORBA_octet_struct };
+const struct CORBA_TypeCode_struct TC_CorbaFS_Buffer_struct = {
+
+ {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1},
+ ORBIT_PSEUDO_TYPECODE},
+
+ CORBA_tk_alias, "Buffer", "IDL:CorbaFS/Buffer:1.0",
+ 0, 1,
+ NULL,
+ (CORBA_TypeCode *) anon_subtypes_array36,
+ NULL,
+ CORBA_OBJECT_NIL, 0, -1, 0, 0
+};
+#endif
+#if ( (TC_IMPL_TC_CorbaFS_Inode_0 == 'C') \
+&& (TC_IMPL_TC_CorbaFS_Inode_1 == 'o') \
+&& (TC_IMPL_TC_CorbaFS_Inode_2 == 'r') \
+&& (TC_IMPL_TC_CorbaFS_Inode_3 == 'b') \
+&& (TC_IMPL_TC_CorbaFS_Inode_4 == 'a') \
+&& (TC_IMPL_TC_CorbaFS_Inode_5 == 'F') \
+&& (TC_IMPL_TC_CorbaFS_Inode_6 == 'S') \
+) && !defined(TC_DEF_TC_CorbaFS_Inode)
+#define TC_DEF_TC_CorbaFS_Inode 1
+const struct CORBA_TypeCode_struct TC_CorbaFS_Inode_struct = {
+
+ {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1},
+ ORBIT_PSEUDO_TYPECODE},
+
+ CORBA_tk_objref, "Inode", "IDL:CorbaFS/Inode:1.0",
+ 0, 0,
+ NULL,
+ NULL,
+ NULL,
+ CORBA_OBJECT_NIL, 0, -1, 0, 0
+};
+#endif
+#if ( (TC_IMPL_TC_CorbaFS_FileSystem_0 == 'C') \
+&& (TC_IMPL_TC_CorbaFS_FileSystem_1 == 'o') \
+&& (TC_IMPL_TC_CorbaFS_FileSystem_2 == 'r') \
+&& (TC_IMPL_TC_CorbaFS_FileSystem_3 == 'b') \
+&& (TC_IMPL_TC_CorbaFS_FileSystem_4 == 'a') \
+&& (TC_IMPL_TC_CorbaFS_FileSystem_5 == 'F') \
+&& (TC_IMPL_TC_CorbaFS_FileSystem_6 == 'S') \
+) && !defined(TC_DEF_TC_CorbaFS_FileSystem)
+#define TC_DEF_TC_CorbaFS_FileSystem 1
+const struct CORBA_TypeCode_struct TC_CorbaFS_FileSystem_struct = {
+
+ {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1},
+ ORBIT_PSEUDO_TYPECODE},
+
+ CORBA_tk_objref, "FileSystem", "IDL:CorbaFS/FileSystem:1.0",
+ 0, 0,
+ NULL,
+ NULL,
+ NULL,
+ CORBA_OBJECT_NIL, 0, -1, 0, 0
+};
+#endif
+gpointer
+CorbaFS_dirent__free(gpointer mem, gpointer dat, CORBA_boolean free_strings)
+{
+ CorbaFS_dirent *var = mem;
+
+ if (free_strings) {
+ CORBA_string__free(&(var->name), NULL, free_strings);
+ }
+ return (gpointer) (var + 1);
+}
+
+CorbaFS_dirent *
+CorbaFS_dirent__alloc(void)
+{
+ CorbaFS_dirent *retval;
+
+ retval =
+ ORBit_alloc(sizeof(CorbaFS_dirent),
+ (ORBit_free_childvals) CorbaFS_dirent__free,
+ GUINT_TO_POINTER(1));
+ memset(&(retval->name), '\0', sizeof(retval->name));
+ return retval;
+}
+
+#if ( (ORBIT_IMPL_CORBA_sequence_CorbaFS_dirent_0 == 'C') \
+&& (ORBIT_IMPL_CORBA_sequence_CorbaFS_dirent_1 == 'o') \
+&& (ORBIT_IMPL_CORBA_sequence_CorbaFS_dirent_2 == 'r') \
+&& (ORBIT_IMPL_CORBA_sequence_CorbaFS_dirent_3 == 'b') \
+&& (ORBIT_IMPL_CORBA_sequence_CorbaFS_dirent_4 == 'a') \
+&& (ORBIT_IMPL_CORBA_sequence_CorbaFS_dirent_5 == 'F') \
+&& (ORBIT_IMPL_CORBA_sequence_CorbaFS_dirent_6 == 'S') \
+) && !defined(ORBIT_DEF_CORBA_sequence_CorbaFS_dirent)
+#define ORBIT_DEF_CORBA_sequence_CorbaFS_dirent 1
+
+gpointer
+CORBA_sequence_CorbaFS_dirent__free(gpointer mem, gpointer dat,
+ CORBA_boolean free_strings)
+{
+ CORBA_sequence_CorbaFS_dirent *val = mem;
+
+ if (val->_release)
+ ORBit_free(val->_buffer, free_strings);
+ return (gpointer) (val + 1);
+}
+
+CORBA_sequence_CorbaFS_dirent *
+CORBA_sequence_CorbaFS_dirent__alloc(void)
+{
+ CORBA_sequence_CorbaFS_dirent *retval;
+
+ retval =
+ ORBit_alloc(sizeof(CORBA_sequence_CorbaFS_dirent),
+ (ORBit_free_childvals) CORBA_sequence_CorbaFS_dirent__free,
+ GUINT_TO_POINTER(1));
+ retval->_maximum = 0;
+ retval->_length = 0;
+ retval->_buffer = NULL;
+ retval->_release = CORBA_FALSE;
+ return retval;
+}
+
+CorbaFS_dirent *
+CORBA_sequence_CorbaFS_dirent_allocbuf(CORBA_unsigned_long len)
+{
+ CorbaFS_dirent *retval =
+ ORBit_alloc(sizeof(CorbaFS_dirent) * len,
+ (ORBit_free_childvals) CorbaFS_dirent__free,
+ GUINT_TO_POINTER(len));
+
+ memset(retval, '\0', sizeof(CorbaFS_dirent) * len);
+ return retval;
+}
+#endif
+
+gpointer
+CorbaFS_DirEntSeq__free(gpointer mem, gpointer dat,
+ CORBA_boolean free_strings)
+{
+ return CORBA_sequence_CorbaFS_dirent__free(mem, dat, free_strings);
+}
+
+CorbaFS_DirEntSeq *
+CorbaFS_DirEntSeq__alloc(void)
+{
+ return CORBA_sequence_CorbaFS_dirent__alloc();
+}
+
+#if ( (ORBIT_IMPL_CORBA_sequence_CORBA_octet_0 == 'C') \
+&& (ORBIT_IMPL_CORBA_sequence_CORBA_octet_1 == 'o') \
+&& (ORBIT_IMPL_CORBA_sequence_CORBA_octet_2 == 'r') \
+&& (ORBIT_IMPL_CORBA_sequence_CORBA_octet_3 == 'b') \
+&& (ORBIT_IMPL_CORBA_sequence_CORBA_octet_4 == 'a') \
+&& (ORBIT_IMPL_CORBA_sequence_CORBA_octet_5 == 'F') \
+&& (ORBIT_IMPL_CORBA_sequence_CORBA_octet_6 == 'S') \
+) && !defined(ORBIT_DEF_CORBA_sequence_CORBA_octet)
+#define ORBIT_DEF_CORBA_sequence_CORBA_octet 1
+
+gpointer
+CORBA_sequence_CORBA_octet__free(gpointer mem, gpointer dat,
+ CORBA_boolean free_strings)
+{
+ CORBA_sequence_CORBA_octet *val = mem;
+
+ if (val->_release)
+ ORBit_free(val->_buffer, free_strings);
+ return (gpointer) (val + 1);
+}
+
+CORBA_sequence_CORBA_octet *
+CORBA_sequence_CORBA_octet__alloc(void)
+{
+ CORBA_sequence_CORBA_octet *retval;
+
+ retval =
+ ORBit_alloc(sizeof(CORBA_sequence_CORBA_octet),
+ (ORBit_free_childvals) CORBA_sequence_CORBA_octet__free,
+ GUINT_TO_POINTER(1));
+ retval->_maximum = 0;
+ retval->_length = 0;
+ retval->_buffer = NULL;
+ retval->_release = CORBA_FALSE;
+ return retval;
+}
+
+CORBA_octet *
+CORBA_sequence_CORBA_octet_allocbuf(CORBA_unsigned_long len)
+{
+ CORBA_octet *retval =
+ ORBit_alloc(sizeof(CORBA_octet) * len, (ORBit_free_childvals) NULL,
+ GUINT_TO_POINTER(len));
+
+ return retval;
+}
+#endif
+
+gpointer
+CorbaFS_Buffer__free(gpointer mem, gpointer dat, CORBA_boolean free_strings)
+{
+ return CORBA_sequence_CORBA_octet__free(mem, dat, free_strings);
+}
+
+CorbaFS_Buffer *
+CorbaFS_Buffer__alloc(void)
+{
+ return CORBA_sequence_CORBA_octet__alloc();
+}
+
+CORBA_unsigned_long CorbaFS_Inode__classid = 0;
+CORBA_unsigned_long CorbaFS_FileSystem__classid = 0;
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/client/CorbaFS-stubs.c linux-2.4.1-korbit/net/korbit/modules/CorbaFS/client/CorbaFS-stubs.c
--- linux-2.4.1/net/korbit/modules/CorbaFS/client/CorbaFS-stubs.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/client/CorbaFS-stubs.c Thu Feb 1 16:36:08 2001
@@ -0,0 +1,791 @@
+/*
+ * This file was generated by orbit-idl - DO NOT EDIT!
+ */
+
+#include <string.h>
+#include "CorbaFS.h"
+
+void
+CorbaFS_Inode_getStatus(CorbaFS_Inode _obj, CORBA_unsigned_short * mode,
+ CORBA_unsigned_long * uid, CORBA_unsigned_long * gid,
+ CORBA_unsigned_long * size,
+ CORBA_unsigned_long * inodeNum,
+ CORBA_unsigned_short * numLinks, CORBA_long * atime,
+ CORBA_long * mtime, CORBA_long * ctime,
+ CORBA_Environment * ev)
+{
+ register GIOP_unsigned_long _ORBIT_request_id,
+ _ORBIT_system_exception_minor;
+ register CORBA_completion_status _ORBIT_completion_status;
+ register GIOPSendBuffer *_ORBIT_send_buffer;
+ register GIOPRecvBuffer *_ORBIT_recv_buffer;
+ register GIOPConnection *_cnx;
+
+ if (_obj->servant && _obj->vepv && CorbaFS_Inode__classid) {
+
+ ((POA_CorbaFS_Inode__epv *) _obj->vepv[CorbaFS_Inode__classid])->
+ getStatus(_obj->servant, mode, uid, gid, size, inodeNum, numLinks,
+ atime, mtime, ctime, ev);
+ return;
+ }
+ _cnx = ORBit_object_get_connection(_obj);
+ _ORBIT_retry_request:
+ _ORBIT_send_buffer = NULL;
+ _ORBIT_recv_buffer = NULL;
+ _ORBIT_completion_status = CORBA_COMPLETED_NO;
+ _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0));
+ { /* marshalling */
+ static const struct
+ {
+ CORBA_unsigned_long len;
+ char opname[10];
+ }
+ _ORBIT_operation_name_data =
+ {
+ 10, "getStatus"};
+ static const struct iovec _ORBIT_operation_vec =
+ { (gpointer) & _ORBIT_operation_name_data, 14 };
+
+ _ORBIT_send_buffer =
+ giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id,
+ CORBA_TRUE,
+ &(_obj->active_profile->object_key_vec),
+ &_ORBIT_operation_vec,
+ &ORBit_default_principal_iovec);
+
+ _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE;
+ if (!_ORBIT_send_buffer)
+ goto _ORBIT_system_exception;
+ giop_send_buffer_write(_ORBIT_send_buffer);
+ _ORBIT_completion_status = CORBA_COMPLETED_MAYBE;
+ giop_send_buffer_unuse(_ORBIT_send_buffer);
+ _ORBIT_send_buffer = NULL;
+ }
+ { /* demarshalling */
+ register guchar *_ORBIT_curptr;
+
+ _ORBIT_recv_buffer =
+ giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE);
+ if (!_ORBIT_recv_buffer)
+ goto _ORBIT_system_exception;
+ _ORBIT_completion_status = CORBA_COMPLETED_YES;
+ if (_ORBIT_recv_buffer->message.u.reply.reply_status !=
+ GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception;
+ _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur;
+ if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) {
+ _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 2);
+
+ (*((guint16 *) & ((*mode)))) =
+ GUINT16_SWAP_LE_BE(*((guint16 *) _ORBIT_curptr));
+ _ORBIT_curptr += 2;
+ _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4);
+
+ (*((guint32 *) & ((*uid)))) =
+ GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr));
+ _ORBIT_curptr += 4;
+ (*((guint32 *) & ((*gid)))) =
+ GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr));
+ _ORBIT_curptr += 4;
+ (*((guint32 *) & ((*size)))) =
+ GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr));
+ _ORBIT_curptr += 4;
+ (*((guint32 *) & ((*inodeNum)))) =
+ GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr));
+ _ORBIT_curptr += 4;
+ (*((guint16 *) & ((*numLinks)))) =
+ GUINT16_SWAP_LE_BE(*((guint16 *) _ORBIT_curptr));
+ _ORBIT_curptr += 2;
+ _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4);
+
+ (*((guint32 *) & ((*atime)))) =
+ GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr));
+ _ORBIT_curptr += 4;
+ (*((guint32 *) & ((*mtime)))) =
+ GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr));
+ _ORBIT_curptr += 4;
+ (*((guint32 *) & ((*ctime)))) =
+ GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr));} else {
+ _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 2);
+ (*mode) = *((CORBA_unsigned_short *) _ORBIT_curptr);
+ _ORBIT_curptr += 2;
+ _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4);
+ (*uid) = *((CORBA_unsigned_long *) _ORBIT_curptr);
+ _ORBIT_curptr += 4;
+ (*gid) = *((CORBA_unsigned_long *) _ORBIT_curptr);
+ _ORBIT_curptr += 4;
+ (*size) = *((CORBA_unsigned_long *) _ORBIT_curptr);
+ _ORBIT_curptr += 4;
+ (*inodeNum) = *((CORBA_unsigned_long *) _ORBIT_curptr);
+ _ORBIT_curptr += 4;
+ (*numLinks) = *((CORBA_unsigned_short *) _ORBIT_curptr);
+ _ORBIT_curptr += 2;
+ _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4);
+ (*atime) = *((CORBA_long *) _ORBIT_curptr);
+ _ORBIT_curptr += 4;
+ (*mtime) = *((CORBA_long *) _ORBIT_curptr);
+ _ORBIT_curptr += 4;
+ (*ctime) = *((CORBA_long *) _ORBIT_curptr);
+ }
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ return;
+ _ORBIT_system_exception:
+ CORBA_exception_set_system(ev, _ORBIT_system_exception_minor,
+ _ORBIT_completion_status);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ giop_send_buffer_unuse(_ORBIT_send_buffer);
+ return;
+ _ORBIT_msg_exception:
+ if (_ORBIT_recv_buffer->message.u.reply.reply_status ==
+ GIOP_LOCATION_FORWARD) {
+ if (_obj->forward_locations != NULL)
+ ORBit_delete_profiles(_obj->forward_locations);
+ _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer);
+ _cnx = ORBit_object_get_forwarded_connection(_obj);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+
+ goto _ORBIT_retry_request;
+ } else {
+ ORBit_handle_exception(_ORBIT_recv_buffer, ev, NULL, _obj->orb);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ return;
+ }
+ }
+}
+void
+CorbaFS_Inode_readpage(CorbaFS_Inode _obj, CorbaFS_Buffer ** buffer,
+ const CORBA_long size, const CORBA_long offset,
+ CORBA_Environment * ev)
+{
+ register GIOP_unsigned_long _ORBIT_request_id,
+ _ORBIT_system_exception_minor;
+ register CORBA_completion_status _ORBIT_completion_status;
+ register GIOPSendBuffer *_ORBIT_send_buffer;
+ register GIOPRecvBuffer *_ORBIT_recv_buffer;
+ register GIOPConnection *_cnx;
+ register CORBA_unsigned_long _ORBIT_tmpvar_1;
+
+ if (_obj->servant && _obj->vepv && CorbaFS_Inode__classid) {
+
+ ((POA_CorbaFS_Inode__epv *) _obj->vepv[CorbaFS_Inode__classid])->
+ readpage(_obj->servant, buffer, size, offset, ev);
+ return;
+ }
+ _cnx = ORBit_object_get_connection(_obj);
+ _ORBIT_retry_request:
+ _ORBIT_send_buffer = NULL;
+ _ORBIT_recv_buffer = NULL;
+ _ORBIT_completion_status = CORBA_COMPLETED_NO;
+ _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0));
+ { /* marshalling */
+ static const struct
+ {
+ CORBA_unsigned_long len;
+ char opname[9];
+ }
+ _ORBIT_operation_name_data =
+ {
+ 9, "readpage"};
+ static const struct iovec _ORBIT_operation_vec =
+ { (gpointer) & _ORBIT_operation_name_data, 13 };
+
+ _ORBIT_send_buffer =
+ giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id,
+ CORBA_TRUE,
+ &(_obj->active_profile->object_key_vec),
+ &_ORBIT_operation_vec,
+ &ORBit_default_principal_iovec);
+
+ _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE;
+ if (!_ORBIT_send_buffer)
+ goto _ORBIT_system_exception;
+ giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER
+ (_ORBIT_send_buffer), 4);
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer),
+ &(size), sizeof(size));
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer),
+ &(offset), sizeof(offset));
+ giop_send_buffer_write(_ORBIT_send_buffer);
+ _ORBIT_completion_status = CORBA_COMPLETED_MAYBE;
+ giop_send_buffer_unuse(_ORBIT_send_buffer);
+ _ORBIT_send_buffer = NULL;
+ }
+ { /* demarshalling */
+ register guchar *_ORBIT_curptr;
+
+ _ORBIT_recv_buffer =
+ giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE);
+ if (!_ORBIT_recv_buffer)
+ goto _ORBIT_system_exception;
+ _ORBIT_completion_status = CORBA_COMPLETED_YES;
+ if (_ORBIT_recv_buffer->message.u.reply.reply_status !=
+ GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception;
+ *buffer = CorbaFS_Buffer__alloc();
+ _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur;
+ if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) {
+ _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4);
+
+ (*((guint32 *) & (((**buffer))._length))) =
+ GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr));
+ _ORBIT_curptr += 4;
+
+ ((**buffer))._buffer =
+ CORBA_sequence_CORBA_octet_allocbuf(((**buffer))._length);
+ ((**buffer))._release = CORBA_TRUE;
+ memcpy(((**buffer))._buffer, _ORBIT_curptr,
+ sizeof(((**buffer))._buffer[_ORBIT_tmpvar_1]) *
+ ((**buffer))._length);
+ _ORBIT_curptr +=
+ sizeof(((**buffer))._buffer[_ORBIT_tmpvar_1]) *
+ ((**buffer))._length;
+ } else {
+ _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4);
+ ((**buffer))._length = *((CORBA_unsigned_long *) _ORBIT_curptr);
+ _ORBIT_curptr += 4;
+
+ ((**buffer))._buffer =
+ CORBA_sequence_CORBA_octet_allocbuf(((**buffer))._length);
+ ((**buffer))._release = CORBA_TRUE;
+ memcpy(((**buffer))._buffer, _ORBIT_curptr,
+ sizeof(((**buffer))._buffer[_ORBIT_tmpvar_1]) *
+ ((**buffer))._length);
+ _ORBIT_curptr +=
+ sizeof(((**buffer))._buffer[_ORBIT_tmpvar_1]) *
+ ((**buffer))._length;
+ }
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ return;
+ _ORBIT_system_exception:
+ CORBA_exception_set_system(ev, _ORBIT_system_exception_minor,
+ _ORBIT_completion_status);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ giop_send_buffer_unuse(_ORBIT_send_buffer);
+ return;
+ _ORBIT_msg_exception:
+ if (_ORBIT_recv_buffer->message.u.reply.reply_status ==
+ GIOP_LOCATION_FORWARD) {
+ if (_obj->forward_locations != NULL)
+ ORBit_delete_profiles(_obj->forward_locations);
+ _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer);
+ _cnx = ORBit_object_get_forwarded_connection(_obj);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+
+ goto _ORBIT_retry_request;
+ } else {
+ ORBit_handle_exception(_ORBIT_recv_buffer, ev, NULL, _obj->orb);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ return;
+ }
+ }
+}
+void
+CorbaFS_Inode_release(CorbaFS_Inode _obj, CORBA_Environment * ev)
+{
+ register GIOP_unsigned_long _ORBIT_request_id,
+ _ORBIT_system_exception_minor;
+ register CORBA_completion_status _ORBIT_completion_status;
+ register GIOPSendBuffer *_ORBIT_send_buffer;
+ register GIOPRecvBuffer *_ORBIT_recv_buffer;
+ register GIOPConnection *_cnx;
+
+ if (_obj->servant && _obj->vepv && CorbaFS_Inode__classid) {
+
+ ((POA_CorbaFS_Inode__epv *) _obj->vepv[CorbaFS_Inode__classid])->
+ release(_obj->servant, ev);
+ return;
+ }
+ _cnx = ORBit_object_get_connection(_obj);
+ _ORBIT_retry_request:
+ _ORBIT_send_buffer = NULL;
+ _ORBIT_recv_buffer = NULL;
+ _ORBIT_completion_status = CORBA_COMPLETED_NO;
+ _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0));
+ { /* marshalling */
+ static const struct
+ {
+ CORBA_unsigned_long len;
+ char opname[8];
+ }
+ _ORBIT_operation_name_data =
+ {
+ 8, "release"};
+ static const struct iovec _ORBIT_operation_vec =
+ { (gpointer) & _ORBIT_operation_name_data, 12 };
+
+ _ORBIT_send_buffer =
+ giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id,
+ CORBA_TRUE,
+ &(_obj->active_profile->object_key_vec),
+ &_ORBIT_operation_vec,
+ &ORBit_default_principal_iovec);
+
+ _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE;
+ if (!_ORBIT_send_buffer)
+ goto _ORBIT_system_exception;
+ giop_send_buffer_write(_ORBIT_send_buffer);
+ _ORBIT_completion_status = CORBA_COMPLETED_MAYBE;
+ giop_send_buffer_unuse(_ORBIT_send_buffer);
+ _ORBIT_send_buffer = NULL;
+ }
+ { /* demarshalling */
+ register guchar *_ORBIT_curptr;
+
+ _ORBIT_recv_buffer =
+ giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE);
+ if (!_ORBIT_recv_buffer)
+ goto _ORBIT_system_exception;
+ _ORBIT_completion_status = CORBA_COMPLETED_YES;
+ if (_ORBIT_recv_buffer->message.u.reply.reply_status !=
+ GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception;
+ _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur;
+ if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) {
+ } else {
+ }
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ return;
+ _ORBIT_system_exception:
+ CORBA_exception_set_system(ev, _ORBIT_system_exception_minor,
+ _ORBIT_completion_status);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ giop_send_buffer_unuse(_ORBIT_send_buffer);
+ return;
+ _ORBIT_msg_exception:
+ if (_ORBIT_recv_buffer->message.u.reply.reply_status ==
+ GIOP_LOCATION_FORWARD) {
+ if (_obj->forward_locations != NULL)
+ ORBit_delete_profiles(_obj->forward_locations);
+ _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer);
+ _cnx = ORBit_object_get_forwarded_connection(_obj);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+
+ goto _ORBIT_retry_request;
+ } else {
+ ORBit_handle_exception(_ORBIT_recv_buffer, ev, NULL, _obj->orb);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ return;
+ }
+ }
+}
+CorbaFS_Inode
+CorbaFS_FileSystem_getInode(CorbaFS_FileSystem _obj, const CORBA_char * path,
+ CORBA_Environment * ev)
+{
+ register GIOP_unsigned_long _ORBIT_request_id,
+ _ORBIT_system_exception_minor;
+ register CORBA_completion_status _ORBIT_completion_status;
+ register GIOPSendBuffer *_ORBIT_send_buffer;
+ register GIOPRecvBuffer *_ORBIT_recv_buffer;
+ register GIOPConnection *_cnx;
+ CorbaFS_Inode _ORBIT_retval;
+
+ if (_obj->servant && _obj->vepv && CorbaFS_FileSystem__classid) {
+ _ORBIT_retval =
+ ((POA_CorbaFS_FileSystem__epv *) _obj->
+ vepv[CorbaFS_FileSystem__classid])->getInode(_obj->servant, path,
+ ev);
+ return _ORBIT_retval;
+ }
+ _cnx = ORBit_object_get_connection(_obj);
+ _ORBIT_retry_request:
+ _ORBIT_send_buffer = NULL;
+ _ORBIT_recv_buffer = NULL;
+ _ORBIT_completion_status = CORBA_COMPLETED_NO;
+ _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0));
+ { /* marshalling */
+ static const struct
+ {
+ CORBA_unsigned_long len;
+ char opname[9];
+ }
+ _ORBIT_operation_name_data =
+ {
+ 9, "getInode"};
+ static const struct iovec _ORBIT_operation_vec =
+ { (gpointer) & _ORBIT_operation_name_data, 13 };
+ register CORBA_unsigned_long _ORBIT_tmpvar_0;
+ CORBA_unsigned_long _ORBIT_tmpvar_1;
+
+ _ORBIT_send_buffer =
+ giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id,
+ CORBA_TRUE,
+ &(_obj->active_profile->object_key_vec),
+ &_ORBIT_operation_vec,
+ &ORBit_default_principal_iovec);
+
+ _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE;
+ if (!_ORBIT_send_buffer)
+ goto _ORBIT_system_exception;
+ _ORBIT_tmpvar_1 = strlen(path) + 1;
+ giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER
+ (_ORBIT_send_buffer), 4);
+ {
+ guchar *_ORBIT_t;
+
+ _ORBIT_t = alloca(sizeof(_ORBIT_tmpvar_1));
+ memcpy(_ORBIT_t, &(_ORBIT_tmpvar_1), sizeof(_ORBIT_tmpvar_1));
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER
+ (_ORBIT_send_buffer), (_ORBIT_t),
+ sizeof(_ORBIT_tmpvar_1));
+ }
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer),
+ (path),
+ sizeof(path[_ORBIT_tmpvar_0]) *
+ _ORBIT_tmpvar_1);
+ giop_send_buffer_write(_ORBIT_send_buffer);
+ _ORBIT_completion_status = CORBA_COMPLETED_MAYBE;
+ giop_send_buffer_unuse(_ORBIT_send_buffer);
+ _ORBIT_send_buffer = NULL;
+ }
+ { /* demarshalling */
+ register guchar *_ORBIT_curptr;
+
+ _ORBIT_recv_buffer =
+ giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE);
+ if (!_ORBIT_recv_buffer)
+ goto _ORBIT_system_exception;
+ _ORBIT_completion_status = CORBA_COMPLETED_YES;
+ if (_ORBIT_recv_buffer->message.u.reply.reply_status !=
+ GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception;
+ _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur;
+ if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) {
+ GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur = _ORBIT_curptr;
+ _ORBIT_retval =
+ ORBit_demarshal_object(_ORBIT_recv_buffer,
+ GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)->
+ connection->orb_data);
+ _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur;
+ } else {
+ GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur = _ORBIT_curptr;
+ _ORBIT_retval =
+ ORBit_demarshal_object(_ORBIT_recv_buffer,
+ GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)->
+ connection->orb_data);
+ _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur;
+ }
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ return _ORBIT_retval;
+ _ORBIT_system_exception:
+ CORBA_exception_set_system(ev, _ORBIT_system_exception_minor,
+ _ORBIT_completion_status);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ giop_send_buffer_unuse(_ORBIT_send_buffer);
+ return _ORBIT_retval;
+ _ORBIT_msg_exception:
+ if (_ORBIT_recv_buffer->message.u.reply.reply_status ==
+ GIOP_LOCATION_FORWARD) {
+ if (_obj->forward_locations != NULL)
+ ORBit_delete_profiles(_obj->forward_locations);
+ _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer);
+ _cnx = ORBit_object_get_forwarded_connection(_obj);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+
+ goto _ORBIT_retry_request;
+ } else {
+ ORBit_handle_exception(_ORBIT_recv_buffer, ev, NULL, _obj->orb);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ return _ORBIT_retval;
+ }
+ }
+}
+CorbaFS_DirEntSeq *
+CorbaFS_FileSystem_readdir(CorbaFS_FileSystem _obj, const CORBA_char * path,
+ CORBA_Environment * ev)
+{
+ register GIOP_unsigned_long _ORBIT_request_id,
+ _ORBIT_system_exception_minor;
+ register CORBA_completion_status _ORBIT_completion_status;
+ register GIOPSendBuffer *_ORBIT_send_buffer;
+ register GIOPRecvBuffer *_ORBIT_recv_buffer;
+ register GIOPConnection *_cnx;
+ CorbaFS_DirEntSeq *_ORBIT_retval;
+ register CORBA_unsigned_long _ORBIT_tmpvar_5;
+ register CORBA_unsigned_long _ORBIT_tmpvar_6;
+ CORBA_unsigned_long _ORBIT_tmpvar_7;
+
+ if (_obj->servant && _obj->vepv && CorbaFS_FileSystem__classid) {
+ _ORBIT_retval =
+ ((POA_CorbaFS_FileSystem__epv *) _obj->
+ vepv[CorbaFS_FileSystem__classid])->readdir(_obj->servant, path,
+ ev);
+ return _ORBIT_retval;
+ }
+ _cnx = ORBit_object_get_connection(_obj);
+ _ORBIT_retry_request:
+ _ORBIT_send_buffer = NULL;
+ _ORBIT_recv_buffer = NULL;
+ _ORBIT_completion_status = CORBA_COMPLETED_NO;
+ _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0));
+ { /* marshalling */
+ static const struct
+ {
+ CORBA_unsigned_long len;
+ char opname[8];
+ }
+ _ORBIT_operation_name_data =
+ {
+ 8, "readdir"};
+ static const struct iovec _ORBIT_operation_vec =
+ { (gpointer) & _ORBIT_operation_name_data, 12 };
+ register CORBA_unsigned_long _ORBIT_tmpvar_0;
+ CORBA_unsigned_long _ORBIT_tmpvar_1;
+
+ _ORBIT_send_buffer =
+ giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id,
+ CORBA_TRUE,
+ &(_obj->active_profile->object_key_vec),
+ &_ORBIT_operation_vec,
+ &ORBit_default_principal_iovec);
+
+ _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE;
+ if (!_ORBIT_send_buffer)
+ goto _ORBIT_system_exception;
+ _ORBIT_tmpvar_1 = strlen(path) + 1;
+ giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER
+ (_ORBIT_send_buffer), 4);
+ {
+ guchar *_ORBIT_t;
+
+ _ORBIT_t = alloca(sizeof(_ORBIT_tmpvar_1));
+ memcpy(_ORBIT_t, &(_ORBIT_tmpvar_1), sizeof(_ORBIT_tmpvar_1));
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER
+ (_ORBIT_send_buffer), (_ORBIT_t),
+ sizeof(_ORBIT_tmpvar_1));
+ }
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer),
+ (path),
+ sizeof(path[_ORBIT_tmpvar_0]) *
+ _ORBIT_tmpvar_1);
+ giop_send_buffer_write(_ORBIT_send_buffer);
+ _ORBIT_completion_status = CORBA_COMPLETED_MAYBE;
+ giop_send_buffer_unuse(_ORBIT_send_buffer);
+ _ORBIT_send_buffer = NULL;
+ }
+ { /* demarshalling */
+ register guchar *_ORBIT_curptr;
+
+ _ORBIT_recv_buffer =
+ giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE);
+ if (!_ORBIT_recv_buffer)
+ goto _ORBIT_system_exception;
+ _ORBIT_completion_status = CORBA_COMPLETED_YES;
+ if (_ORBIT_recv_buffer->message.u.reply.reply_status !=
+ GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception;
+ _ORBIT_retval = CorbaFS_DirEntSeq__alloc();
+ _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur;
+ if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) {
+ _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4);
+
+ (*((guint32 *) & ((*_ORBIT_retval)._length))) =
+ GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr));
+ _ORBIT_curptr += 4;
+
+ (*_ORBIT_retval)._buffer =
+ CORBA_sequence_CorbaFS_dirent_allocbuf((*_ORBIT_retval)._length);
+ (*_ORBIT_retval)._release = CORBA_TRUE;
+ for (_ORBIT_tmpvar_5 = 0; _ORBIT_tmpvar_5 < (*_ORBIT_retval)._length;
+ _ORBIT_tmpvar_5++) {
+ _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4);
+
+ (*
+ ((guint32 *) &
+ ((*_ORBIT_retval)._buffer[_ORBIT_tmpvar_5].inode))) =
+GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr));
+ _ORBIT_curptr += 4;
+
+ (*((guint32 *) & (_ORBIT_tmpvar_7))) =
+ GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr));
+ _ORBIT_curptr += 4;
+
+ (*_ORBIT_retval)._buffer[_ORBIT_tmpvar_5].name =
+ CORBA_string_alloc(_ORBIT_tmpvar_7);
+ memcpy((*_ORBIT_retval)._buffer[_ORBIT_tmpvar_5].name,
+ _ORBIT_curptr,
+ sizeof((*_ORBIT_retval)._buffer[_ORBIT_tmpvar_5].
+ name[_ORBIT_tmpvar_6]) * _ORBIT_tmpvar_7);
+ _ORBIT_curptr +=
+ sizeof((*_ORBIT_retval)._buffer[_ORBIT_tmpvar_5].
+ name[_ORBIT_tmpvar_6]) * _ORBIT_tmpvar_7;
+ }
+
+ } else {
+ _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4);
+ (*_ORBIT_retval)._length = *((CORBA_unsigned_long *) _ORBIT_curptr);
+ _ORBIT_curptr += 4;
+
+ (*_ORBIT_retval)._buffer =
+ CORBA_sequence_CorbaFS_dirent_allocbuf((*_ORBIT_retval)._length);
+ (*_ORBIT_retval)._release = CORBA_TRUE;
+ for (_ORBIT_tmpvar_5 = 0; _ORBIT_tmpvar_5 < (*_ORBIT_retval)._length;
+ _ORBIT_tmpvar_5++) {
+ _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4);
+ (*_ORBIT_retval)._buffer[_ORBIT_tmpvar_5].inode = *((CORBA_long *) _ORBIT_curptr);
+ _ORBIT_curptr += 4;
+ _ORBIT_tmpvar_7 = *((CORBA_unsigned_long *) _ORBIT_curptr);
+ _ORBIT_curptr += 4;
+
+ (*_ORBIT_retval)._buffer[_ORBIT_tmpvar_5].name =
+ CORBA_string_alloc(_ORBIT_tmpvar_7);
+ memcpy((*_ORBIT_retval)._buffer[_ORBIT_tmpvar_5].name,
+ _ORBIT_curptr,
+ sizeof((*_ORBIT_retval)._buffer[_ORBIT_tmpvar_5].
+ name[_ORBIT_tmpvar_6]) * _ORBIT_tmpvar_7);
+ _ORBIT_curptr +=
+ sizeof((*_ORBIT_retval)._buffer[_ORBIT_tmpvar_5].
+ name[_ORBIT_tmpvar_6]) * _ORBIT_tmpvar_7;
+ }
+
+ }
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ return _ORBIT_retval;
+ _ORBIT_system_exception:
+ CORBA_exception_set_system(ev, _ORBIT_system_exception_minor,
+ _ORBIT_completion_status);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ giop_send_buffer_unuse(_ORBIT_send_buffer);
+ return _ORBIT_retval;
+ _ORBIT_msg_exception:
+ if (_ORBIT_recv_buffer->message.u.reply.reply_status ==
+ GIOP_LOCATION_FORWARD) {
+ if (_obj->forward_locations != NULL)
+ ORBit_delete_profiles(_obj->forward_locations);
+ _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer);
+ _cnx = ORBit_object_get_forwarded_connection(_obj);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+
+ goto _ORBIT_retry_request;
+ } else {
+ ORBit_handle_exception(_ORBIT_recv_buffer, ev, NULL, _obj->orb);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ return _ORBIT_retval;
+ }
+ }
+}
+CORBA_char *
+CorbaFS_FileSystem_readlink(CorbaFS_FileSystem _obj,
+ const CORBA_char * filename,
+ CORBA_Environment * ev)
+{
+ register GIOP_unsigned_long _ORBIT_request_id,
+ _ORBIT_system_exception_minor;
+ register CORBA_completion_status _ORBIT_completion_status;
+ register GIOPSendBuffer *_ORBIT_send_buffer;
+ register GIOPRecvBuffer *_ORBIT_recv_buffer;
+ register GIOPConnection *_cnx;
+ CORBA_char *_ORBIT_retval;
+ register CORBA_unsigned_long _ORBIT_tmpvar_4;
+ CORBA_unsigned_long _ORBIT_tmpvar_5;
+
+ if (_obj->servant && _obj->vepv && CorbaFS_FileSystem__classid) {
+ _ORBIT_retval =
+ ((POA_CorbaFS_FileSystem__epv *) _obj->
+ vepv[CorbaFS_FileSystem__classid])->readlink(_obj->servant,
+ filename, ev);
+ return _ORBIT_retval;
+ }
+ _cnx = ORBit_object_get_connection(_obj);
+ _ORBIT_retry_request:
+ _ORBIT_send_buffer = NULL;
+ _ORBIT_recv_buffer = NULL;
+ _ORBIT_completion_status = CORBA_COMPLETED_NO;
+ _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0));
+ { /* marshalling */
+ static const struct
+ {
+ CORBA_unsigned_long len;
+ char opname[9];
+ }
+ _ORBIT_operation_name_data =
+ {
+ 9, "readlink"};
+ static const struct iovec _ORBIT_operation_vec =
+ { (gpointer) & _ORBIT_operation_name_data, 13 };
+ register CORBA_unsigned_long _ORBIT_tmpvar_0;
+ CORBA_unsigned_long _ORBIT_tmpvar_1;
+
+ _ORBIT_send_buffer =
+ giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id,
+ CORBA_TRUE,
+ &(_obj->active_profile->object_key_vec),
+ &_ORBIT_operation_vec,
+ &ORBit_default_principal_iovec);
+
+ _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE;
+ if (!_ORBIT_send_buffer)
+ goto _ORBIT_system_exception;
+ _ORBIT_tmpvar_1 = strlen(filename) + 1;
+ giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER
+ (_ORBIT_send_buffer), 4);
+ {
+ guchar *_ORBIT_t;
+
+ _ORBIT_t = alloca(sizeof(_ORBIT_tmpvar_1));
+ memcpy(_ORBIT_t, &(_ORBIT_tmpvar_1), sizeof(_ORBIT_tmpvar_1));
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER
+ (_ORBIT_send_buffer), (_ORBIT_t),
+ sizeof(_ORBIT_tmpvar_1));
+ }
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer),
+ (filename),
+ sizeof(filename[_ORBIT_tmpvar_0]) *
+ _ORBIT_tmpvar_1);
+ giop_send_buffer_write(_ORBIT_send_buffer);
+ _ORBIT_completion_status = CORBA_COMPLETED_MAYBE;
+ giop_send_buffer_unuse(_ORBIT_send_buffer);
+ _ORBIT_send_buffer = NULL;
+ }
+ { /* demarshalling */
+ register guchar *_ORBIT_curptr;
+
+ _ORBIT_recv_buffer =
+ giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE);
+ if (!_ORBIT_recv_buffer)
+ goto _ORBIT_system_exception;
+ _ORBIT_completion_status = CORBA_COMPLETED_YES;
+ if (_ORBIT_recv_buffer->message.u.reply.reply_status !=
+ GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception;
+ _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur;
+ if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) {
+ _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4);
+
+ (*((guint32 *) & (_ORBIT_tmpvar_5))) =
+ GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr));
+ _ORBIT_curptr += 4;
+ _ORBIT_retval = CORBA_string_alloc(_ORBIT_tmpvar_5);
+ memcpy(_ORBIT_retval, _ORBIT_curptr,
+ sizeof(_ORBIT_retval[_ORBIT_tmpvar_4]) * _ORBIT_tmpvar_5);
+ _ORBIT_curptr +=
+ sizeof(_ORBIT_retval[_ORBIT_tmpvar_4]) * _ORBIT_tmpvar_5;
+ } else {
+ _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4);
+ _ORBIT_tmpvar_5 = *((CORBA_unsigned_long *) _ORBIT_curptr);
+ _ORBIT_curptr += 4;
+ _ORBIT_retval = CORBA_string_alloc(_ORBIT_tmpvar_5);
+ memcpy(_ORBIT_retval, _ORBIT_curptr,
+ sizeof(_ORBIT_retval[_ORBIT_tmpvar_4]) * _ORBIT_tmpvar_5);
+ _ORBIT_curptr +=
+ sizeof(_ORBIT_retval[_ORBIT_tmpvar_4]) * _ORBIT_tmpvar_5;
+ }
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ return _ORBIT_retval;
+ _ORBIT_system_exception:
+ CORBA_exception_set_system(ev, _ORBIT_system_exception_minor,
+ _ORBIT_completion_status);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ giop_send_buffer_unuse(_ORBIT_send_buffer);
+ return _ORBIT_retval;
+ _ORBIT_msg_exception:
+ if (_ORBIT_recv_buffer->message.u.reply.reply_status ==
+ GIOP_LOCATION_FORWARD) {
+ if (_obj->forward_locations != NULL)
+ ORBit_delete_profiles(_obj->forward_locations);
+ _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer);
+ _cnx = ORBit_object_get_forwarded_connection(_obj);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+
+ goto _ORBIT_retry_request;
+ } else {
+ ORBit_handle_exception(_ORBIT_recv_buffer, ev, NULL, _obj->orb);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ return _ORBIT_retval;
+ }
+ }
+}
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/client/CorbaFS-user-client.c linux-2.4.1-korbit/net/korbit/modules/CorbaFS/client/CorbaFS-user-client.c
--- linux-2.4.1/net/korbit/modules/CorbaFS/client/CorbaFS-user-client.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/client/CorbaFS-user-client.c Thu Feb 1 11:47:03 2001
@@ -0,0 +1,92 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <orb/orbit.h>
+
+#include "CorbaFS.h"
+
+CorbaFS_FileSystem fs;
+
+int
+main (int argc, char *argv[])
+{
+ CORBA_Environment ev;
+ CORBA_ORB orb;
+ CorbaFS_Inode inode;
+ CorbaFS_Buffer *buffer;
+ CorbaFS_DirEntSeq *dirents;
+ CorbaFS_dirent *dirent;
+
+ CORBA_unsigned_short mode;
+ CORBA_unsigned_long uid;
+ CORBA_unsigned_long gid;
+ CORBA_unsigned_long size;
+ CORBA_unsigned_long inodeNum;
+ CORBA_unsigned_short numLinks;
+ CORBA_long atime;
+ CORBA_long mtime;
+ CORBA_long ctime;
+
+ int i;
+
+ int niters = 10;
+
+ CORBA_exception_init(&ev);
+ orb = CORBA_ORB_init(&argc, argv, "orbit-local-orb", &ev);
+
+ if(argc < 2)
+ {
+ printf("Need a binding ID thing as argv[1]\n");
+ return 1;
+ }
+
+
+ fs = CORBA_ORB_string_to_object(orb, argv[1], &ev);
+ if (!fs) {
+ printf("Cannot bind to %s\n", argv[1]);
+ return 1;
+ }
+
+ if (argc >= 3)
+ inode = CorbaFS_FileSystem_getInode(fs, argv[2], &ev);
+ else
+ inode = CorbaFS_FileSystem_getInode(fs, "/proc/cpuinfo", &ev);
+
+ if (!inode)
+ {
+ printf("Cannot get inode\n");
+ }
+
+ CorbaFS_Inode_getStatus(inode,
+ &mode,
+ &uid,
+ &gid,
+ &size,
+ &inodeNum,
+ &numLinks,
+ &atime,
+ &mtime,
+ &ctime,
+ &ev);
+
+ printf("inode = %x\n", inode);
+ CorbaFS_Inode_readpage(inode, &buffer, 1000, 100, &ev);
+ printf("readpage got %d bytes\n", buffer->_length);
+ printf("readpage returned : %s\n", buffer->_buffer);
+
+ if (argc >= 3)
+ dirents = CorbaFS_FileSystem_readdir(fs, argv[2], &ev);
+ else
+ dirents = CorbaFS_FileSystem_readdir(fs, "/", &ev);
+
+ dirent = dirents->_buffer;
+ for (i = 0; i < dirents->_length; i++)
+ {
+ printf("%d = %s\n", dirent->inode, dirent->name);
+ dirent++;
+ }
+
+ CORBA_Object_release(fs, &ev);
+ CORBA_Object_release((CORBA_Object)orb, &ev);
+
+ return 0;
+}
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/client/CorbaFS.h linux-2.4.1-korbit/net/korbit/modules/CorbaFS/client/CorbaFS.h
--- linux-2.4.1/net/korbit/modules/CorbaFS/client/CorbaFS.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/client/CorbaFS.h Thu Feb 1 16:36:08 2001
@@ -0,0 +1,349 @@
+/*
+ * This file was generated by orbit-idl - DO NOT EDIT!
+ */
+
+#include <glib.h>
+#define ORBIT_IDL_SERIAL 9
+#include <orb/orbit.h>
+
+#ifndef CorbaFS_H
+#define CorbaFS_H 1
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+/** typedefs **/
+#if !defined(_CorbaFS_dirent_defined)
+#define _CorbaFS_dirent_defined 1
+ typedef struct
+ {
+ CORBA_long inode;
+ CORBA_char *name;
+ }
+ CorbaFS_dirent;
+
+#if !defined(TC_IMPL_TC_CorbaFS_dirent_0)
+#define TC_IMPL_TC_CorbaFS_dirent_0 'C'
+#define TC_IMPL_TC_CorbaFS_dirent_1 'o'
+#define TC_IMPL_TC_CorbaFS_dirent_2 'r'
+#define TC_IMPL_TC_CorbaFS_dirent_3 'b'
+#define TC_IMPL_TC_CorbaFS_dirent_4 'a'
+#define TC_IMPL_TC_CorbaFS_dirent_5 'F'
+#define TC_IMPL_TC_CorbaFS_dirent_6 'S'
+ extern const struct CORBA_TypeCode_struct TC_CorbaFS_dirent_struct;
+#define TC_CorbaFS_dirent ((CORBA_TypeCode)&TC_CorbaFS_dirent_struct)
+#endif
+ extern CorbaFS_dirent *CorbaFS_dirent__alloc(void);
+ extern gpointer CorbaFS_dirent__free(gpointer mem, gpointer dat,
+ CORBA_boolean free_strings); /* ORBit internal use */
+#endif
+#if !defined(ORBIT_DECL_CORBA_sequence_CorbaFS_dirent) && !defined(_CORBA_sequence_CorbaFS_dirent_defined)
+#define ORBIT_DECL_CORBA_sequence_CorbaFS_dirent 1
+#define _CORBA_sequence_CorbaFS_dirent_defined 1
+#define ORBIT_IMPL_CORBA_sequence_CorbaFS_dirent_0 'C'
+#define ORBIT_IMPL_CORBA_sequence_CorbaFS_dirent_1 'o'
+#define ORBIT_IMPL_CORBA_sequence_CorbaFS_dirent_2 'r'
+#define ORBIT_IMPL_CORBA_sequence_CorbaFS_dirent_3 'b'
+#define ORBIT_IMPL_CORBA_sequence_CorbaFS_dirent_4 'a'
+#define ORBIT_IMPL_CORBA_sequence_CorbaFS_dirent_5 'F'
+#define ORBIT_IMPL_CORBA_sequence_CorbaFS_dirent_6 'S'
+ typedef struct
+ {
+ CORBA_unsigned_long _maximum,
+ _length;
+ CorbaFS_dirent *_buffer;
+ CORBA_boolean _release;
+ }
+ CORBA_sequence_CorbaFS_dirent;
+#if !defined(TC_IMPL_TC_CORBA_sequence_CorbaFS_dirent_0)
+#define TC_IMPL_TC_CORBA_sequence_CorbaFS_dirent_0 'C'
+#define TC_IMPL_TC_CORBA_sequence_CorbaFS_dirent_1 'o'
+#define TC_IMPL_TC_CORBA_sequence_CorbaFS_dirent_2 'r'
+#define TC_IMPL_TC_CORBA_sequence_CorbaFS_dirent_3 'b'
+#define TC_IMPL_TC_CORBA_sequence_CorbaFS_dirent_4 'a'
+#define TC_IMPL_TC_CORBA_sequence_CorbaFS_dirent_5 'F'
+#define TC_IMPL_TC_CORBA_sequence_CorbaFS_dirent_6 'S'
+ extern const struct CORBA_TypeCode_struct
+ TC_CORBA_sequence_CorbaFS_dirent_struct;
+#define TC_CORBA_sequence_CorbaFS_dirent ((CORBA_TypeCode)&TC_CORBA_sequence_CorbaFS_dirent_struct)
+#endif
+ extern CORBA_sequence_CorbaFS_dirent
+ *CORBA_sequence_CorbaFS_dirent__alloc(void);
+ extern gpointer CORBA_sequence_CorbaFS_dirent__free(gpointer mem,
+ gpointer dat,
+ CORBA_boolean free_strings); /* ORBit internal use */
+ CorbaFS_dirent *CORBA_sequence_CorbaFS_dirent_allocbuf(CORBA_unsigned_long
+ len);
+#endif
+#if !defined(_CorbaFS_DirEntSeq_defined)
+#define _CorbaFS_DirEntSeq_defined 1
+ typedef CORBA_sequence_CorbaFS_dirent CorbaFS_DirEntSeq;
+#if !defined(TC_IMPL_TC_CorbaFS_DirEntSeq_0)
+#define TC_IMPL_TC_CorbaFS_DirEntSeq_0 'C'
+#define TC_IMPL_TC_CorbaFS_DirEntSeq_1 'o'
+#define TC_IMPL_TC_CorbaFS_DirEntSeq_2 'r'
+#define TC_IMPL_TC_CorbaFS_DirEntSeq_3 'b'
+#define TC_IMPL_TC_CorbaFS_DirEntSeq_4 'a'
+#define TC_IMPL_TC_CorbaFS_DirEntSeq_5 'F'
+#define TC_IMPL_TC_CorbaFS_DirEntSeq_6 'S'
+ extern const struct CORBA_TypeCode_struct TC_CorbaFS_DirEntSeq_struct;
+#define TC_CorbaFS_DirEntSeq ((CORBA_TypeCode)&TC_CorbaFS_DirEntSeq_struct)
+#endif
+ extern CorbaFS_DirEntSeq *CorbaFS_DirEntSeq__alloc(void);
+ extern gpointer CorbaFS_DirEntSeq__free(gpointer mem, gpointer dat,
+ CORBA_boolean free_strings); /* ORBit internal use */
+#endif
+#if !defined(ORBIT_DECL_CORBA_sequence_CORBA_octet) && !defined(_CORBA_sequence_CORBA_octet_defined)
+#define ORBIT_DECL_CORBA_sequence_CORBA_octet 1
+#define _CORBA_sequence_CORBA_octet_defined 1
+#define ORBIT_IMPL_CORBA_sequence_CORBA_octet_0 'C'
+#define ORBIT_IMPL_CORBA_sequence_CORBA_octet_1 'o'
+#define ORBIT_IMPL_CORBA_sequence_CORBA_octet_2 'r'
+#define ORBIT_IMPL_CORBA_sequence_CORBA_octet_3 'b'
+#define ORBIT_IMPL_CORBA_sequence_CORBA_octet_4 'a'
+#define ORBIT_IMPL_CORBA_sequence_CORBA_octet_5 'F'
+#define ORBIT_IMPL_CORBA_sequence_CORBA_octet_6 'S'
+ typedef struct
+ {
+ CORBA_unsigned_long _maximum,
+ _length;
+ CORBA_octet *_buffer;
+ CORBA_boolean _release;
+ }
+ CORBA_sequence_CORBA_octet;
+#if !defined(TC_IMPL_TC_CORBA_sequence_CORBA_octet_0)
+#define TC_IMPL_TC_CORBA_sequence_CORBA_octet_0 'C'
+#define TC_IMPL_TC_CORBA_sequence_CORBA_octet_1 'o'
+#define TC_IMPL_TC_CORBA_sequence_CORBA_octet_2 'r'
+#define TC_IMPL_TC_CORBA_sequence_CORBA_octet_3 'b'
+#define TC_IMPL_TC_CORBA_sequence_CORBA_octet_4 'a'
+#define TC_IMPL_TC_CORBA_sequence_CORBA_octet_5 'F'
+#define TC_IMPL_TC_CORBA_sequence_CORBA_octet_6 'S'
+ extern const struct CORBA_TypeCode_struct
+ TC_CORBA_sequence_CORBA_octet_struct;
+#define TC_CORBA_sequence_CORBA_octet ((CORBA_TypeCode)&TC_CORBA_sequence_CORBA_octet_struct)
+#endif
+ extern CORBA_sequence_CORBA_octet *CORBA_sequence_CORBA_octet__alloc(void);
+ extern gpointer CORBA_sequence_CORBA_octet__free(gpointer mem,
+ gpointer dat,
+ CORBA_boolean free_strings); /* ORBit internal use */
+ CORBA_octet *CORBA_sequence_CORBA_octet_allocbuf(CORBA_unsigned_long len);
+#endif
+#if !defined(_CorbaFS_Buffer_defined)
+#define _CorbaFS_Buffer_defined 1
+ typedef CORBA_sequence_CORBA_octet CorbaFS_Buffer;
+#if !defined(TC_IMPL_TC_CorbaFS_Buffer_0)
+#define TC_IMPL_TC_CorbaFS_Buffer_0 'C'
+#define TC_IMPL_TC_CorbaFS_Buffer_1 'o'
+#define TC_IMPL_TC_CorbaFS_Buffer_2 'r'
+#define TC_IMPL_TC_CorbaFS_Buffer_3 'b'
+#define TC_IMPL_TC_CorbaFS_Buffer_4 'a'
+#define TC_IMPL_TC_CorbaFS_Buffer_5 'F'
+#define TC_IMPL_TC_CorbaFS_Buffer_6 'S'
+ extern const struct CORBA_TypeCode_struct TC_CorbaFS_Buffer_struct;
+#define TC_CorbaFS_Buffer ((CORBA_TypeCode)&TC_CorbaFS_Buffer_struct)
+#endif
+ extern CorbaFS_Buffer *CorbaFS_Buffer__alloc(void);
+ extern gpointer CorbaFS_Buffer__free(gpointer mem, gpointer dat,
+ CORBA_boolean free_strings); /* ORBit internal use */
+#endif
+#if !defined(ORBIT_DECL_CorbaFS_Inode) && !defined(_CorbaFS_Inode_defined)
+#define ORBIT_DECL_CorbaFS_Inode 1
+#define _CorbaFS_Inode_defined 1
+#define CorbaFS_Inode__free CORBA_Object__free
+ typedef CORBA_Object CorbaFS_Inode;
+ extern CORBA_unsigned_long CorbaFS_Inode__classid;
+#if !defined(TC_IMPL_TC_CorbaFS_Inode_0)
+#define TC_IMPL_TC_CorbaFS_Inode_0 'C'
+#define TC_IMPL_TC_CorbaFS_Inode_1 'o'
+#define TC_IMPL_TC_CorbaFS_Inode_2 'r'
+#define TC_IMPL_TC_CorbaFS_Inode_3 'b'
+#define TC_IMPL_TC_CorbaFS_Inode_4 'a'
+#define TC_IMPL_TC_CorbaFS_Inode_5 'F'
+#define TC_IMPL_TC_CorbaFS_Inode_6 'S'
+ extern const struct CORBA_TypeCode_struct TC_CorbaFS_Inode_struct;
+#define TC_CorbaFS_Inode ((CORBA_TypeCode)&TC_CorbaFS_Inode_struct)
+#endif
+#endif
+#if !defined(ORBIT_DECL_CorbaFS_FileSystem) && !defined(_CorbaFS_FileSystem_defined)
+#define ORBIT_DECL_CorbaFS_FileSystem 1
+#define _CorbaFS_FileSystem_defined 1
+#define CorbaFS_FileSystem__free CORBA_Object__free
+ typedef CORBA_Object CorbaFS_FileSystem;
+ extern CORBA_unsigned_long CorbaFS_FileSystem__classid;
+#if !defined(TC_IMPL_TC_CorbaFS_FileSystem_0)
+#define TC_IMPL_TC_CorbaFS_FileSystem_0 'C'
+#define TC_IMPL_TC_CorbaFS_FileSystem_1 'o'
+#define TC_IMPL_TC_CorbaFS_FileSystem_2 'r'
+#define TC_IMPL_TC_CorbaFS_FileSystem_3 'b'
+#define TC_IMPL_TC_CorbaFS_FileSystem_4 'a'
+#define TC_IMPL_TC_CorbaFS_FileSystem_5 'F'
+#define TC_IMPL_TC_CorbaFS_FileSystem_6 'S'
+ extern const struct CORBA_TypeCode_struct TC_CorbaFS_FileSystem_struct;
+#define TC_CorbaFS_FileSystem ((CORBA_TypeCode)&TC_CorbaFS_FileSystem_struct)
+#endif
+#endif
+
+/** POA structures **/
+ typedef struct
+ {
+ void *_private;
+ void (*getStatus) (PortableServer_Servant _servant,
+ CORBA_unsigned_short * mode,
+ CORBA_unsigned_long * uid, CORBA_unsigned_long * gid,
+ CORBA_unsigned_long * size,
+ CORBA_unsigned_long * inodeNum,
+ CORBA_unsigned_short * numLinks, CORBA_long * atime,
+ CORBA_long * mtime, CORBA_long * ctime,
+ CORBA_Environment * ev);
+ void (*readpage) (PortableServer_Servant _servant,
+ CorbaFS_Buffer ** buffer, const CORBA_long size,
+ const CORBA_long offset, CORBA_Environment * ev);
+ void (*release) (PortableServer_Servant _servant,
+ CORBA_Environment * ev);
+ }
+ POA_CorbaFS_Inode__epv;
+ typedef struct
+ {
+ PortableServer_ServantBase__epv *_base_epv;
+ POA_CorbaFS_Inode__epv *CorbaFS_Inode_epv;
+ }
+ POA_CorbaFS_Inode__vepv;
+ typedef struct
+ {
+ void *_private;
+ POA_CorbaFS_Inode__vepv *vepv;
+ }
+ POA_CorbaFS_Inode;
+ extern void POA_CorbaFS_Inode__init(PortableServer_Servant servant,
+ CORBA_Environment * ev);
+ extern void POA_CorbaFS_Inode__fini(PortableServer_Servant servant,
+ CORBA_Environment * ev);
+ typedef struct
+ {
+ void *_private;
+
+ CorbaFS_Inode(*getInode) (PortableServer_Servant _servant,
+ const CORBA_char * path,
+ CORBA_Environment * ev);
+ CorbaFS_DirEntSeq *(*readdir) (PortableServer_Servant _servant,
+ const CORBA_char * path,
+ CORBA_Environment * ev);
+ CORBA_char *(*readlink) (PortableServer_Servant _servant,
+ const CORBA_char * filename,
+ CORBA_Environment * ev);
+ }
+ POA_CorbaFS_FileSystem__epv;
+ typedef struct
+ {
+ PortableServer_ServantBase__epv *_base_epv;
+ POA_CorbaFS_FileSystem__epv *CorbaFS_FileSystem_epv;
+ }
+ POA_CorbaFS_FileSystem__vepv;
+ typedef struct
+ {
+ void *_private;
+ POA_CorbaFS_FileSystem__vepv *vepv;
+ }
+ POA_CorbaFS_FileSystem;
+ extern void POA_CorbaFS_FileSystem__init(PortableServer_Servant servant,
+ CORBA_Environment * ev);
+ extern void POA_CorbaFS_FileSystem__fini(PortableServer_Servant servant,
+ CORBA_Environment * ev);
+
+/** prototypes **/
+ void CorbaFS_Inode_getStatus(CorbaFS_Inode _obj,
+ CORBA_unsigned_short * mode,
+ CORBA_unsigned_long * uid,
+ CORBA_unsigned_long * gid,
+ CORBA_unsigned_long * size,
+ CORBA_unsigned_long * inodeNum,
+ CORBA_unsigned_short * numLinks,
+ CORBA_long * atime, CORBA_long * mtime,
+ CORBA_long * ctime, CORBA_Environment * ev);
+ void CorbaFS_Inode_readpage(CorbaFS_Inode _obj, CorbaFS_Buffer ** buffer,
+ const CORBA_long size, const CORBA_long offset,
+ CORBA_Environment * ev);
+ void CorbaFS_Inode_release(CorbaFS_Inode _obj, CORBA_Environment * ev);
+ CorbaFS_Inode CorbaFS_FileSystem_getInode(CorbaFS_FileSystem _obj,
+ const CORBA_char * path,
+ CORBA_Environment * ev);
+ CorbaFS_DirEntSeq *CorbaFS_FileSystem_readdir(CorbaFS_FileSystem _obj,
+ const CORBA_char * path,
+ CORBA_Environment * ev);
+ CORBA_char *CorbaFS_FileSystem_readlink(CorbaFS_FileSystem _obj,
+ const CORBA_char * filename,
+ CORBA_Environment * ev);
+
+ void _ORBIT_skel_CorbaFS_Inode_getStatus(POA_CorbaFS_Inode *
+ _ORBIT_servant,
+ GIOPRecvBuffer *
+ _ORBIT_recv_buffer,
+ CORBA_Environment * ev,
+ void (*_impl_getStatus)
+ (PortableServer_Servant _servant,
+ CORBA_unsigned_short * mode,
+ CORBA_unsigned_long * uid,
+ CORBA_unsigned_long * gid,
+ CORBA_unsigned_long * size,
+ CORBA_unsigned_long * inodeNum,
+ CORBA_unsigned_short * numLinks,
+ CORBA_long * atime,
+ CORBA_long * mtime,
+ CORBA_long * ctime,
+ CORBA_Environment * ev));
+ void _ORBIT_skel_CorbaFS_Inode_readpage(POA_CorbaFS_Inode * _ORBIT_servant,
+ GIOPRecvBuffer *
+ _ORBIT_recv_buffer,
+ CORBA_Environment * ev,
+ void (*_impl_readpage)
+ (PortableServer_Servant _servant,
+ CorbaFS_Buffer ** buffer,
+ const CORBA_long size,
+ const CORBA_long offset,
+ CORBA_Environment * ev));
+ void _ORBIT_skel_CorbaFS_Inode_release(POA_CorbaFS_Inode * _ORBIT_servant,
+ GIOPRecvBuffer * _ORBIT_recv_buffer,
+ CORBA_Environment * ev,
+ void (*_impl_release)
+ (PortableServer_Servant _servant,
+ CORBA_Environment * ev));
+ void _ORBIT_skel_CorbaFS_FileSystem_getInode(POA_CorbaFS_FileSystem *
+ _ORBIT_servant,
+ GIOPRecvBuffer *
+ _ORBIT_recv_buffer,
+ CORBA_Environment * ev,
+ CorbaFS_Inode(*_impl_getInode)
+ (PortableServer_Servant
+ _servant,
+ const CORBA_char * path,
+ CORBA_Environment * ev));
+ void _ORBIT_skel_CorbaFS_FileSystem_readdir(POA_CorbaFS_FileSystem *
+ _ORBIT_servant,
+ GIOPRecvBuffer *
+ _ORBIT_recv_buffer,
+ CORBA_Environment * ev,
+ CorbaFS_DirEntSeq *
+ (*_impl_readdir)
+ (PortableServer_Servant
+ _servant,
+ const CORBA_char * path,
+ CORBA_Environment * ev));
+ void _ORBIT_skel_CorbaFS_FileSystem_readlink(POA_CorbaFS_FileSystem *
+ _ORBIT_servant,
+ GIOPRecvBuffer *
+ _ORBIT_recv_buffer,
+ CORBA_Environment * ev,
+ CORBA_char *
+ (*_impl_readlink)
+ (PortableServer_Servant
+ _servant,
+ const CORBA_char * filename,
+ CORBA_Environment * ev));
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
+#undef ORBIT_IDL_SERIAL
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/client/Makefile linux-2.4.1-korbit/net/korbit/modules/CorbaFS/client/Makefile
--- linux-2.4.1/net/korbit/modules/CorbaFS/client/Makefile Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/client/Makefile Thu Feb 1 11:47:03 2001
@@ -0,0 +1,20 @@
+#
+# Makefile for KORBit CorbaFS client
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
+# Note 2! The CFLAGS definition is now in the main makefile...
+
+O_TARGET := corba-corbafs-client.o
+
+obj-y := CorbaFS-common.o CorbaFS-stubs.o CorbaFS-client.o
+obj-m := $(O_TARGET)
+
+include ../../Makefile.module
+
+CorbaFS-client.c: CorbaFS.h
+
+CorbaFS.h CorbaFS-common.c CorbaFS-stubs.c: ../CorbaFS.idl
+ $(ORBIT_IDL) --noskels ../CorbaFS.idl
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/client/Makefile.user linux-2.4.1-korbit/net/korbit/modules/CorbaFS/client/Makefile.user
--- linux-2.4.1/net/korbit/modules/CorbaFS/client/Makefile.user Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/client/Makefile.user Thu Feb 1 11:47:03 2001
@@ -0,0 +1,32 @@
+#
+# Makefile for KORBit
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
+# Note 2! The CFLAGS definition is now in the main makefile...
+
+PROJECT = CorbaFS
+
+CFLAGS = -Wall `orbit-config --cflags client` -I../../..
+LDFLAGS = `orbit-config --libs client`
+OBJS = $(PROJECT)-common.o $(PROJECT)-stubs.o $(PROJECT)-user-client.o
+ORBIT-IDL = orbit-idl
+
+$(PROJECT)-user-client: $(OBJS)
+ gcc -o $(PROJECT)-user-client $(OBJS) $(LDFLAGS)
+
+$(PROJECT)-user-client.o: $(PROJECT).h
+
+$(PROJECT).h $(PROJECT)-common.c $(PROJECT)-stubs.c: ../$(PROJECT).idl
+ $(ORBIT-IDL) --noskels ../$(PROJECT).idl
+
+clean:
+ rm -f $(OBJS) $(PROJECT)-user-client
+
+realclean: clean
+ rm -f $(PROJECT).h
+ rm -f $(PROJECT)-common.c
+ rm -f $(PROJECT)-skels.c
+ rm -f *~
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/client/README linux-2.4.1-korbit/net/korbit/modules/CorbaFS/client/README
--- linux-2.4.1/net/korbit/modules/CorbaFS/client/README Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/client/README Thu Feb 1 11:47:03 2001
@@ -0,0 +1,4 @@
+This module implements the kernel VFS->kORBit interface. This is called a 'client'
+because it actually USES a CORBA object that is exported from someplace else.
+
+ORB: kORBit
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/server/CVS/Entries linux-2.4.1-korbit/net/korbit/modules/CorbaFS/server/CVS/Entries
--- linux-2.4.1/net/korbit/modules/CorbaFS/server/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/server/CVS/Entries Thu Feb 1 11:47:04 2001
@@ -0,0 +1,6 @@
+/CorbaFS-server.c/1.8/Thu Feb 1 09:47:03 2001//
+/CorbaFS-skelimpl.c/1.10/Thu Feb 1 09:47:04 2001//
+/Makefile/1.5/Thu Feb 1 09:47:04 2001//
+/README/1.2/Thu Feb 1 09:47:04 2001//
+/RunServer.sh/1.1/Thu Feb 1 09:47:04 2001//
+D
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/server/CVS/Repository linux-2.4.1-korbit/net/korbit/modules/CorbaFS/server/CVS/Repository
--- linux-2.4.1/net/korbit/modules/CorbaFS/server/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/server/CVS/Repository Thu Feb 1 11:47:03 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/modules/CorbaFS/server
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/server/CVS/Root linux-2.4.1-korbit/net/korbit/modules/CorbaFS/server/CVS/Root
--- linux-2.4.1/net/korbit/modules/CorbaFS/server/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/server/CVS/Root Thu Feb 1 11:47:03 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/server/CorbaFS-server.c linux-2.4.1-korbit/net/korbit/modules/CorbaFS/server/CorbaFS-server.c
--- linux-2.4.1/net/korbit/modules/CorbaFS/server/CorbaFS-server.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/server/CorbaFS-server.c Thu Feb 1 11:47:03 2001
@@ -0,0 +1,37 @@
+#include <stdio.h>
+#include "CorbaFS-skelimpl.c"
+
+CORBA_ORB orb;
+PortableServer_POA poa;
+CORBA_Environment *ev;
+PortableServer_ObjectId *objid;
+
+int main(int argc, char *argv[]) {
+ CorbaFS_FileSystem fs;
+ impl_POA_CorbaFS_FileSystem *fs_impl;
+
+ PortableServer_POAManager pm;
+ ev = g_new0(CORBA_Environment,1);
+
+ CORBA_exception_init(ev);
+ printf("Make sure you use TCP/IP and not Unix sockets!\n");
+
+ orb = CORBA_ORB_init(&argc, argv, "orbit-local-orb", ev);
+ poa = (PortableServer_POA)
+ CORBA_ORB_resolve_initial_references(orb,
+ "RootPOA",
+ ev);
+ fs = impl_CorbaFS_FileSystem__create(poa, ev);
+
+ pm = PortableServer_POA__get_the_POAManager(poa, ev);
+ PortableServer_POAManager_activate(pm, ev);
+
+ fs_impl = PortableServer_POA_reference_to_servant( poa, fs, ev );
+ objid = PortableServer_POA_servant_to_id( poa, fs_impl, ev );
+
+ printf("CorbaFS-server:\n%s\n", CORBA_ORB_object_to_string(orb, fs, ev));
+
+ CORBA_ORB_run(orb, ev);
+
+ return 0;
+}
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/server/CorbaFS-skelimpl.c linux-2.4.1-korbit/net/korbit/modules/CorbaFS/server/CorbaFS-skelimpl.c
--- linux-2.4.1/net/korbit/modules/CorbaFS/server/CorbaFS-skelimpl.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/server/CorbaFS-skelimpl.c Thu Feb 1 11:47:04 2001
@@ -0,0 +1,353 @@
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <dirent.h>
+
+#include "CorbaFS.h"
+
+/*** App-specific servant structures ***/
+
+#define printf(fmt, args...) fprintf(stderr, fmt, ##args);
+
+typedef struct
+{
+ POA_CorbaFS_Inode servant;
+ PortableServer_POA poa;
+
+ CORBA_char *path;
+#if 0
+ CORBA_unsigned_short mode;
+ CORBA_unsigned_long uid;
+ CORBA_unsigned_long gid;
+ CORBA_unsigned_long size;
+ CORBA_unsigned_long inodeNum;
+ CORBA_unsigned_short numLinks;
+ CORBA_long atime;
+ CORBA_long mtime;
+ CORBA_long ctime;
+#endif
+}
+impl_POA_CorbaFS_Inode;
+
+typedef struct
+{
+ POA_CorbaFS_FileSystem servant;
+ PortableServer_POA poa;
+
+}
+impl_POA_CorbaFS_FileSystem;
+
+/*** Implementation stub prototypes ***/
+
+static void impl_CorbaFS_Inode__destroy(impl_POA_CorbaFS_Inode * servant,
+ CORBA_Environment * ev);
+static void
+impl_CorbaFS_Inode_getStatus(impl_POA_CorbaFS_Inode * servant,
+ CORBA_unsigned_short * mode,
+ CORBA_unsigned_long * uid,
+ CORBA_unsigned_long * gid,
+ CORBA_unsigned_long * size,
+ CORBA_unsigned_long * inodeNum,
+ CORBA_unsigned_short * numLinks,
+ CORBA_long * atime,
+ CORBA_long * mtime,
+ CORBA_long * ctime, CORBA_Environment * ev);
+
+static void
+impl_CorbaFS_Inode_readpage(impl_POA_CorbaFS_Inode * servant,
+ CorbaFS_Buffer ** buffer,
+ CORBA_long size,
+ CORBA_long offset, CORBA_Environment * ev);
+
+static void
+impl_CorbaFS_Inode_release(impl_POA_CorbaFS_Inode * servant,
+ CORBA_Environment * ev);
+
+static void impl_CorbaFS_FileSystem__destroy(impl_POA_CorbaFS_FileSystem *
+ servant, CORBA_Environment * ev);
+static CorbaFS_Inode
+impl_CorbaFS_FileSystem_getInode(impl_POA_CorbaFS_FileSystem * servant,
+ CORBA_char * path, CORBA_Environment * ev);
+
+static CorbaFS_DirEntSeq
+ *impl_CorbaFS_FileSystem_readdir(impl_POA_CorbaFS_FileSystem * servant,
+ CORBA_char * path,
+
+ CORBA_Environment * ev);
+
+static CORBA_char
+ *impl_CorbaFS_FileSystem_readlink(impl_POA_CorbaFS_FileSystem * servant,
+ CORBA_char * filename,
+ CORBA_Environment * ev);
+
+/*** epv structures ***/
+
+static PortableServer_ServantBase__epv impl_CorbaFS_Inode_base_epv = {
+ NULL, /* _private data */
+ NULL, /* finalize routine */
+ NULL, /* default_POA routine */
+};
+static POA_CorbaFS_Inode__epv impl_CorbaFS_Inode_epv = {
+ NULL, /* _private */
+ (gpointer) & impl_CorbaFS_Inode_getStatus,
+
+ (gpointer) & impl_CorbaFS_Inode_readpage,
+
+ (gpointer) & impl_CorbaFS_Inode_release,
+
+};
+static PortableServer_ServantBase__epv impl_CorbaFS_FileSystem_base_epv = {
+ NULL, /* _private data */
+ NULL, /* finalize routine */
+ NULL, /* default_POA routine */
+};
+static POA_CorbaFS_FileSystem__epv impl_CorbaFS_FileSystem_epv = {
+ NULL, /* _private */
+ (gpointer) & impl_CorbaFS_FileSystem_getInode,
+
+ (gpointer) & impl_CorbaFS_FileSystem_readdir,
+
+ (gpointer) & impl_CorbaFS_FileSystem_readlink,
+
+};
+
+/*** vepv structures ***/
+
+static POA_CorbaFS_Inode__vepv impl_CorbaFS_Inode_vepv = {
+ &impl_CorbaFS_Inode_base_epv,
+ &impl_CorbaFS_Inode_epv,
+};
+static POA_CorbaFS_FileSystem__vepv impl_CorbaFS_FileSystem_vepv = {
+ &impl_CorbaFS_FileSystem_base_epv,
+ &impl_CorbaFS_FileSystem_epv,
+};
+
+/*** Stub implementations ***/
+
+static CorbaFS_Inode
+impl_CorbaFS_Inode__create(PortableServer_POA poa, CORBA_Environment * ev)
+{
+ CorbaFS_Inode retval;
+ impl_POA_CorbaFS_Inode *newservant;
+ PortableServer_ObjectId *objid;
+
+ newservant = g_new0(impl_POA_CorbaFS_Inode, 1);
+ newservant->servant.vepv = &impl_CorbaFS_Inode_vepv;
+ newservant->poa = poa;
+ POA_CorbaFS_Inode__init((PortableServer_Servant) newservant, ev);
+ objid = PortableServer_POA_activate_object(poa, newservant, ev);
+ CORBA_free(objid);
+ retval = PortableServer_POA_servant_to_reference(poa, newservant, ev);
+
+ return retval;
+}
+
+static void
+impl_CorbaFS_Inode__destroy(impl_POA_CorbaFS_Inode * servant,
+ CORBA_Environment * ev)
+{
+ PortableServer_ObjectId *objid;
+
+ objid = PortableServer_POA_servant_to_id(servant->poa, servant, ev);
+ PortableServer_POA_deactivate_object(servant->poa, objid, ev);
+ CORBA_free(objid);
+
+ POA_CorbaFS_Inode__fini((PortableServer_Servant) servant, ev);
+ g_free(servant);
+}
+
+static void
+impl_CorbaFS_Inode_getStatus(impl_POA_CorbaFS_Inode * servant,
+ CORBA_unsigned_short * mode,
+ CORBA_unsigned_long * uid,
+ CORBA_unsigned_long * gid,
+ CORBA_unsigned_long * size,
+ CORBA_unsigned_long * inodeNum,
+ CORBA_unsigned_short * numLinks,
+ CORBA_long * atime,
+ CORBA_long * mtime,
+ CORBA_long * ctime, CORBA_Environment * ev)
+{
+ struct stat buf;
+
+ printf("Inode_getStatus()\n");
+ printf("Inode path = %s\n", servant->path);
+ lstat(servant->path, &buf);
+
+ *mode = buf.st_mode;
+ *uid = buf.st_uid;
+ *gid = buf.st_gid;
+ *size = buf.st_size;
+ *inodeNum = buf.st_ino;
+ *numLinks = buf.st_nlink;
+ *atime = buf.st_atime;
+ *mtime = buf.st_mtime;
+ *ctime = buf.st_ctime;
+}
+
+static void
+impl_CorbaFS_Inode_readpage(impl_POA_CorbaFS_Inode * servant,
+ CorbaFS_Buffer ** buffer,
+ CORBA_long size,
+ CORBA_long offset, CORBA_Environment * ev)
+{
+ int fd = -1, c = 0;
+
+ printf("Inode_readpage(buffer, %d, %d)\n", size, offset);
+ printf("Inode_readpage : path = %s\n", servant->path);
+
+ *buffer = CorbaFS_Buffer__alloc();
+ (*buffer)->_maximum = size;
+ (*buffer)->_buffer = CORBA_octet_allocbuf(size);
+
+ memset((*buffer)->_buffer, size, 0);
+
+ fd = open(servant->path, O_RDONLY);
+ printf("Inode_readpage : fd = %d\n", fd);
+ lseek(fd, offset, SEEK_SET);
+ c = read(fd, (*buffer)->_buffer, size);
+ printf("Inode_readpage : read %d bytes\n", c);
+ (*buffer)->_length = c;
+ close(fd);
+}
+
+static void
+impl_CorbaFS_Inode_release(impl_POA_CorbaFS_Inode * servant,
+ CORBA_Environment * ev)
+{
+ printf("Inode_release()\n");
+}
+
+static CorbaFS_FileSystem
+impl_CorbaFS_FileSystem__create(PortableServer_POA poa,
+ CORBA_Environment * ev)
+{
+ CorbaFS_FileSystem retval;
+ impl_POA_CorbaFS_FileSystem *newservant;
+ PortableServer_ObjectId *objid;
+
+ newservant = g_new0(impl_POA_CorbaFS_FileSystem, 1);
+ newservant->servant.vepv = &impl_CorbaFS_FileSystem_vepv;
+ newservant->poa = poa;
+ POA_CorbaFS_FileSystem__init((PortableServer_Servant) newservant, ev);
+ objid = PortableServer_POA_activate_object(poa, newservant, ev);
+ CORBA_free(objid);
+ retval = PortableServer_POA_servant_to_reference(poa, newservant, ev);
+
+ return retval;
+}
+
+static void
+impl_CorbaFS_FileSystem__destroy(impl_POA_CorbaFS_FileSystem * servant,
+ CORBA_Environment * ev)
+{
+ PortableServer_ObjectId *objid;
+
+ objid = PortableServer_POA_servant_to_id(servant->poa, servant, ev);
+ PortableServer_POA_deactivate_object(servant->poa, objid, ev);
+ CORBA_free(objid);
+
+ POA_CorbaFS_FileSystem__fini((PortableServer_Servant) servant, ev);
+ g_free(servant);
+}
+
+static CorbaFS_Inode
+impl_CorbaFS_FileSystem_getInode(impl_POA_CorbaFS_FileSystem * servant,
+ CORBA_char * path, CORBA_Environment * ev)
+{
+ CorbaFS_Inode retval;
+ impl_POA_CorbaFS_Inode *inode;
+
+ printf("FileSystem_getInode(%s)\n", path);
+
+ retval = impl_CorbaFS_Inode__create(servant->poa, ev);
+
+ inode = PortableServer_POA_reference_to_servant( servant->poa, retval, ev );
+ inode->path = CORBA_string_dup(path);
+#if 0
+ inode->mode = 0040777; /* world-readable directory */
+ inode->uid = 0;
+ inode->gid = 0;
+ inode->size = 4096;
+ inode->inodeNum = inodeNum++;
+ inode->numLinks = 1;
+ inode->atime = 0;
+ inode->mtime = 100;
+ inode->ctime = 10000;
+#endif
+
+ return retval;
+}
+
+static CorbaFS_DirEntSeq *
+impl_CorbaFS_FileSystem_readdir(impl_POA_CorbaFS_FileSystem * servant,
+ CORBA_char * path, CORBA_Environment * ev)
+{
+ CorbaFS_DirEntSeq *retval;
+ CorbaFS_dirent *dirent;
+
+ DIR *dir;
+ struct dirent *dirp;
+ int c;
+
+ printf("FileSystem_readdir(%s)\n", path);
+
+ retval = CorbaFS_DirEntSeq__alloc();
+ retval->_maximum = 0;
+ retval->_length = 0;
+
+ dir = opendir(path);
+ if (dir == NULL)
+ return retval;
+
+ c = 0;
+ while ((dirp = readdir(dir)))
+ c++;
+
+ rewinddir(dir);
+
+ printf("%d directories\n", c);
+
+ retval->_buffer = CORBA_sequence_CorbaFS_dirent_allocbuf(c);
+ retval->_maximum = c;
+ dirent = retval->_buffer;
+
+ c = 0;
+ while ((dirp = readdir(dir)) && (c < retval->_maximum))
+ {
+ printf("Adding directory %d : %s (%d)\n", c, dirp->d_name, dirp->d_ino);
+
+ dirent[c].inode = dirp->d_ino;
+ dirent[c].name = CORBA_string_dup(dirp->d_name);
+ c++;
+ }
+ retval->_length = c;
+
+ closedir(dir);
+
+ return retval;
+}
+
+static CORBA_char *
+impl_CorbaFS_FileSystem_readlink(impl_POA_CorbaFS_FileSystem * servant,
+ CORBA_char * filename,
+ CORBA_Environment * ev)
+{
+ CORBA_char *retval = CORBA_OBJECT_NIL;
+ char tmp[MAXPATHLEN + 1];
+ int len;
+
+ printf("FileSystem_readlink(%s) = ", filename);
+ len = readlink(filename, tmp, MAXPATHLEN);
+ if (len != -1)
+ {
+ tmp[len] = '\0';
+ retval = CORBA_string_dup(tmp);
+ }
+
+ printf("%s\n", retval);
+
+ return retval;
+}
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/server/Makefile linux-2.4.1-korbit/net/korbit/modules/CorbaFS/server/Makefile
--- linux-2.4.1/net/korbit/modules/CorbaFS/server/Makefile Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/server/Makefile Thu Feb 1 11:47:04 2001
@@ -0,0 +1,32 @@
+#
+# Makefile for KORBit
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
+# Note 2! The CFLAGS definition is now in the main makefile...
+
+PROJECT = CorbaFS
+
+CFLAGS = -Wall `orbit-config --cflags server` -I../../..
+LDFLAGS = `orbit-config --libs server`
+OBJS = $(PROJECT)-common.o $(PROJECT)-skels.o $(PROJECT)-server.o
+ORBIT-IDL = orbit-idl
+
+$(PROJECT)-server: $(OBJS)
+ gcc -o $(PROJECT)-server $(OBJS) $(LDFLAGS)
+
+$(PROJECT)-server.o: $(PROJECT).h $(PROJECT)-skelimpl.c
+
+$(PROJECT).h $(PROJECT)-common.c $(PROJECT)-skels.c: ../$(PROJECT).idl
+ $(ORBIT-IDL) --nostubs ../$(PROJECT).idl
+
+clean:
+ rm -f $(OBJS) $(PROJECT)-server
+
+realclean: clean
+ rm -f $(PROJECT).h
+ rm -f $(PROJECT)-common.c
+ rm -f $(PROJECT)-skels.c
+ rm -f *~
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/server/README linux-2.4.1-korbit/net/korbit/modules/CorbaFS/server/README
--- linux-2.4.1/net/korbit/modules/CorbaFS/server/README Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/server/README Thu Feb 1 11:47:04 2001
@@ -0,0 +1,8 @@
+This server provides an NFS like capability of exporting an existing filesystem.
+
+ORB: ORBit
+Status: Working! (for readonly fs's)
+
+NOTE!!!!: When starting this server make sure you pass ORBit the options to
+ have it use ipv4 sockets and not unix domain sockets, or else bad
+ things will happen. You can use the included RunServer script.
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/server/RunServer.sh linux-2.4.1-korbit/net/korbit/modules/CorbaFS/server/RunServer.sh
--- linux-2.4.1/net/korbit/modules/CorbaFS/server/RunServer.sh Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/server/RunServer.sh Thu Feb 1 11:47:04 2001
@@ -0,0 +1 @@
+./CorbaFS-server -ORBIIOPUSock=0 -ORBIIOPIPv4=1
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/server-perl/CVS/Entries linux-2.4.1-korbit/net/korbit/modules/CorbaFS/server-perl/CVS/Entries
--- linux-2.4.1/net/korbit/modules/CorbaFS/server-perl/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/server-perl/CVS/Entries Thu Feb 1 11:47:04 2001
@@ -0,0 +1,3 @@
+/PerlServer/1.2/Thu Feb 1 09:47:04 2001//
+/README/1.1/Thu Feb 1 09:47:04 2001//
+D
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/server-perl/CVS/Repository linux-2.4.1-korbit/net/korbit/modules/CorbaFS/server-perl/CVS/Repository
--- linux-2.4.1/net/korbit/modules/CorbaFS/server-perl/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/server-perl/CVS/Repository Thu Feb 1 11:47:04 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/modules/CorbaFS/server-perl
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/server-perl/CVS/Root linux-2.4.1-korbit/net/korbit/modules/CorbaFS/server-perl/CVS/Root
--- linux-2.4.1/net/korbit/modules/CorbaFS/server-perl/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/server-perl/CVS/Root Thu Feb 1 11:47:04 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/server-perl/PerlServer linux-2.4.1-korbit/net/korbit/modules/CorbaFS/server-perl/PerlServer
--- linux-2.4.1/net/korbit/modules/CorbaFS/server-perl/PerlServer Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/server-perl/PerlServer Thu Feb 1 11:47:04 2001
@@ -0,0 +1,67 @@
+#!/usr/bin/perl -w
+use CORBA::ORBit idl => [ qw(../CorbaFS.idl) ];
+use Error qw(:try);
+use strict;
+
+
+package MyFSInode;
+@MyFSInode::ISA = qw(POA_CorbaFS::Inode);
+
+sub new {
+ my $self = bless { name => shift };
+ print "INODE CREATED: $self->{name}!\n";
+}
+
+sub getStatus {
+ my ($self) = @_;
+ print "$self->getStatus()\n";
+}
+
+sub readpage {
+ return "";
+}
+
+sub release {
+}
+
+
+package MyFileSystem;
+@MyFileSystem::ISA = qw(POA_CorbaFS::FileSystem);
+
+sub new {
+ my $self = bless { root => '/home' };
+}
+
+sub getInode {
+ my $path = shift;
+ print "getInode($path)\n";
+ return new MyFSInode($path);
+}
+
+sub readdir {
+ my $path = shift;
+ print "readdir($path)\n";
+ return [ { inode => 1, name => '...' } ];
+}
+
+sub readlink {
+ my $path = shift;
+ print "readlink($path)\n";
+ return "fredrik";
+}
+
+
+package Main;
+
+my $orb = CORBA::ORB_init("orbit-local-orb");
+my $poa = $orb->resolve_initial_references("RootPOA");
+
+my $Server = new MyFileSystem();
+my $id = $poa->activate_object($Server);
+my $ref = $orb->object_to_string($poa->id_to_reference($id));
+
+print "$ref\n";
+
+print "Running orb:\n";
+$orb->run();
+exit(0);
diff -urN linux-2.4.1/net/korbit/modules/CorbaFS/server-perl/README linux-2.4.1-korbit/net/korbit/modules/CorbaFS/server-perl/README
--- linux-2.4.1/net/korbit/modules/CorbaFS/server-perl/README Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/CorbaFS/server-perl/README Thu Feb 1 11:47:04 2001
@@ -0,0 +1,4 @@
+Test filesystem implementation in Perl.
+
+ORB: ORBit/Perl
+Status: horribly broken
diff -urN linux-2.4.1/net/korbit/modules/Echo/CVS/Entries linux-2.4.1-korbit/net/korbit/modules/Echo/CVS/Entries
--- linux-2.4.1/net/korbit/modules/Echo/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/CVS/Entries Thu Feb 1 11:47:05 2001
@@ -0,0 +1,4 @@
+/Makefile/1.3/Thu Feb 1 09:47:04 2001//
+/README/1.1/Thu Feb 1 09:47:05 2001//
+/echo.idl/1.1/Thu Feb 1 09:47:05 2001//
+D
diff -urN linux-2.4.1/net/korbit/modules/Echo/CVS/Entries.Log linux-2.4.1-korbit/net/korbit/modules/Echo/CVS/Entries.Log
--- linux-2.4.1/net/korbit/modules/Echo/CVS/Entries.Log Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/CVS/Entries.Log Thu Feb 1 11:47:06 2001
@@ -0,0 +1,3 @@
+A D/client////
+A D/client-perl////
+A D/server////
diff -urN linux-2.4.1/net/korbit/modules/Echo/CVS/Repository linux-2.4.1-korbit/net/korbit/modules/Echo/CVS/Repository
--- linux-2.4.1/net/korbit/modules/Echo/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/CVS/Repository Thu Feb 1 11:47:04 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/modules/Echo
diff -urN linux-2.4.1/net/korbit/modules/Echo/CVS/Root linux-2.4.1-korbit/net/korbit/modules/Echo/CVS/Root
--- linux-2.4.1/net/korbit/modules/Echo/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/CVS/Root Thu Feb 1 11:47:04 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/modules/Echo/Makefile linux-2.4.1-korbit/net/korbit/modules/Echo/Makefile
--- linux-2.4.1/net/korbit/modules/Echo/Makefile Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/Makefile Thu Feb 1 11:47:04 2001
@@ -0,0 +1,11 @@
+#
+# Makefile for KORBit/modules/Console
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+
+subdir-$(CONFIG_CORBA_ECHO) := client server
+
+include $(TOPDIR)/Rules.make
+
diff -urN linux-2.4.1/net/korbit/modules/Echo/README linux-2.4.1-korbit/net/korbit/modules/Echo/README
--- linux-2.4.1/net/korbit/modules/Echo/README Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/README Thu Feb 1 11:47:05 2001
@@ -0,0 +1,2 @@
+The Echo test is very similar to the console test, but it also "returns" a
+"random" number. The random number, in our case, is simply a constant.
diff -urN linux-2.4.1/net/korbit/modules/Echo/client/CVS/Entries linux-2.4.1-korbit/net/korbit/modules/Echo/client/CVS/Entries
--- linux-2.4.1/net/korbit/modules/Echo/client/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/client/CVS/Entries Thu Feb 1 11:47:05 2001
@@ -0,0 +1,6 @@
+/Makefile/1.4/Thu Feb 1 09:47:05 2001//
+/Makefile.user/1.1/Thu Feb 1 09:47:05 2001//
+/README/1.1/Thu Feb 1 09:47:05 2001//
+/RunClient.sh/1.1/Thu Feb 1 09:47:05 2001//
+/echo-client.c/1.6/Thu Feb 1 09:47:05 2001//
+D
diff -urN linux-2.4.1/net/korbit/modules/Echo/client/CVS/Repository linux-2.4.1-korbit/net/korbit/modules/Echo/client/CVS/Repository
--- linux-2.4.1/net/korbit/modules/Echo/client/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/client/CVS/Repository Thu Feb 1 11:47:05 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/modules/Echo/client
diff -urN linux-2.4.1/net/korbit/modules/Echo/client/CVS/Root linux-2.4.1-korbit/net/korbit/modules/Echo/client/CVS/Root
--- linux-2.4.1/net/korbit/modules/Echo/client/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/client/CVS/Root Thu Feb 1 11:47:05 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/modules/Echo/client/Makefile linux-2.4.1-korbit/net/korbit/modules/Echo/client/Makefile
--- linux-2.4.1/net/korbit/modules/Echo/client/Makefile Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/client/Makefile Thu Feb 1 11:47:05 2001
@@ -0,0 +1,20 @@
+#
+# Makefile for KORBit
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
+# Note 2! The CFLAGS definition is now in the main makefile...
+
+O_TARGET := corba-echo-client.o
+
+obj-y := echo-common.o echo-stubs.o echo-client.o
+obj-m := $(O_TARGET)
+
+include ../../Makefile.module
+
+echo-client.c: echo.h
+
+echo.h echo-common.c echo-stubs.c: ../echo.idl
+ $(ORBIT_IDL) --noskels ../echo.idl
diff -urN linux-2.4.1/net/korbit/modules/Echo/client/Makefile.user linux-2.4.1-korbit/net/korbit/modules/Echo/client/Makefile.user
--- linux-2.4.1/net/korbit/modules/Echo/client/Makefile.user Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/client/Makefile.user Thu Feb 1 11:47:05 2001
@@ -0,0 +1,32 @@
+#
+# Makefile for KORBit
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
+# Note 2! The CFLAGS definition is now in the main makefile...
+
+PROJECT = echo
+
+CFLAGS = -Wall `orbit-config --cflags client` -I../../..
+LDFLAGS = `orbit-config --libs client`
+OBJS = $(PROJECT)-common.o $(PROJECT)-stubs.o $(PROJECT)-client.o
+ORBIT-IDL = orbit-idl
+
+$(PROJECT)-client: $(OBJS)
+ gcc -o $(PROJECT)-client $(OBJS) $(LDFLAGS)
+
+$(PROJECT)-client.c: $(PROJECT).h
+
+$(PROJECT).h $(PROJECT)-common.c $(PROJECT)-stubs.c: ../$(PROJECT).idl
+ $(ORBIT-IDL) --noskels ../$(PROJECT).idl
+
+clean:
+ rm -f $(OBJS) $(PROJECT)-client
+
+realclean: clean
+ rm -f $(PROJECT).h
+ rm -f $(PROJECT)-common.c
+ rm -f $(PROJECT)-stubs.c
+ rm -f *~
diff -urN linux-2.4.1/net/korbit/modules/Echo/client/README linux-2.4.1-korbit/net/korbit/modules/Echo/client/README
--- linux-2.4.1/net/korbit/modules/Echo/client/README Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/client/README Thu Feb 1 11:47:05 2001
@@ -0,0 +1,4 @@
+This simply tests the Echo service.
+
+ORB: ORBit
+Status: working
diff -urN linux-2.4.1/net/korbit/modules/Echo/client/RunClient.sh linux-2.4.1-korbit/net/korbit/modules/Echo/client/RunClient.sh
--- linux-2.4.1/net/korbit/modules/Echo/client/RunClient.sh Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/client/RunClient.sh Thu Feb 1 11:47:05 2001
@@ -0,0 +1,3 @@
+#!/bin/sh
+date
+./echo-client `cat /proc/corba/echo-server` 5
diff -urN linux-2.4.1/net/korbit/modules/Echo/client/echo-client.c linux-2.4.1-korbit/net/korbit/modules/Echo/client/echo-client.c
--- linux-2.4.1/net/korbit/modules/Echo/client/echo-client.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/client/echo-client.c Thu Feb 1 11:47:05 2001
@@ -0,0 +1,119 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/time.h>
+#include <unistd.h>
+#include <orb/orbit.h>
+
+#ifdef __KERNEL__
+#include <linux/init.h>
+#include <linux/module.h>
+#include "korbit.h"
+#endif
+#include "echo.h"
+
+Echo echo_client, bec;
+
+#define BATCH_SIZE 1
+
+
+#ifndef __KERNEL__
+int main (int argc, char *argv[]) {
+#else
+int __init corba_echo_init(void) {
+ int argc = 1; char *argv[] = { "echo-client", 0, 0 };
+#endif
+ CORBA_Environment ev;
+ CORBA_ORB orb;
+ CORBA_long rv;
+ char buf[30];
+ int i, j;
+
+ int niters = 5;
+
+#ifndef __KERNEL__
+ struct timeval start, end;
+ long diff, diffsum = 0;
+#endif
+
+ CORBA_exception_init(&ev);
+ orb = CORBA_ORB_init(&argc, argv, "orbit-local-orb", &ev);
+
+#ifdef __KERNEL__
+ {
+ int c, fd = open("/tmp/echo-ior", O_RDONLY, 0);
+ if (fd == -1)
+ return -1;
+ printf("Reading IOR from /tmp/echo-ior\n");
+ argv[1] = malloc(501);
+ c = read(fd, argv[1], 500);
+ argv[1][c] = '\0';
+ printf("Reading %d bytes: %s\n", c, argv[1]);
+ }
+#else
+ if(argc < 2)
+ {
+ printf("Need an IOR as argv[1]\n");
+ return 1;
+ }
+
+ if(argc == 3)
+ niters = atoi(argv[2]);
+#endif
+
+ echo_client = CORBA_ORB_string_to_object(orb, argv[1], &ev);
+ if (!echo_client) {
+ printf("Cannot bind to %s\n", argv[1]);
+ return 1;
+ }
+
+ for(i = 0; i < niters; i++) {
+ g_snprintf(buf, sizeof(buf), "Hello, world [%d]", i);
+#ifdef __KERNEL__
+ bec = Echo_echoString(echo_client, buf, &rv, &ev);
+#else
+ gettimeofday(&start, NULL);
+ for (j = BATCH_SIZE; j > 0; j--) {
+ bec = Echo_echoString(echo_client, buf, &rv, &ev);
+ if (j != 1) CORBA_Object_release(bec, &ev);
+ }
+ gettimeofday(&end, NULL);
+ diff = (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_usec - start.tv_usec);
+ diff /= BATCH_SIZE;
+ diffsum += diff;
+
+ printf("duration = %d usec\t", diff);
+#endif
+
+ if(ev._major != CORBA_NO_EXCEPTION) {
+ printf("\nWe got exception %d from echoString!\n", ev._major);
+ return 1;
+ }
+
+ CORBA_Object_release(echo_client, &ev);
+ if(ev._major != CORBA_NO_EXCEPTION) {
+ printf("we got exception %d from release!\n", ev._major);
+ return 1;
+ }
+
+ printf("[client] %d\n", rv);
+
+ echo_client = bec; bec = CORBA_OBJECT_NIL;
+ }
+
+#ifndef __KERNEL__
+ printf("duration average = %d usec\n", diffsum / niters);
+ CORBA_Object_release(echo_client, &ev);
+ CORBA_Object_release((CORBA_Object)orb, &ev);
+#endif
+
+ return 0;
+}
+
+
+#ifdef __KERNEL__
+void corba_echo_exit(void) {
+}
+
+module_init(corba_echo_init)
+module_exit(corba_echo_exit)
+#endif
diff -urN linux-2.4.1/net/korbit/modules/Echo/client/echo-common.c linux-2.4.1-korbit/net/korbit/modules/Echo/client/echo-common.c
--- linux-2.4.1/net/korbit/modules/Echo/client/echo-common.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/client/echo-common.c Thu Feb 1 16:36:36 2001
@@ -0,0 +1,27 @@
+/*
+ * This file was generated by orbit-idl - DO NOT EDIT!
+ */
+
+#include <string.h>
+#include "echo.h"
+
+#if ( (TC_IMPL_TC_Echo_0 == 'e') \
+&& (TC_IMPL_TC_Echo_1 == 'c') \
+&& (TC_IMPL_TC_Echo_2 == 'h') \
+&& (TC_IMPL_TC_Echo_3 == 'o') \
+) && !defined(TC_DEF_TC_Echo)
+#define TC_DEF_TC_Echo 1
+const struct CORBA_TypeCode_struct TC_Echo_struct = {
+
+ {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1},
+ ORBIT_PSEUDO_TYPECODE},
+
+ CORBA_tk_objref, "Echo", "IDL:Echo:1.0",
+ 0, 0,
+ NULL,
+ NULL,
+ NULL,
+ CORBA_OBJECT_NIL, 0, -1, 0, 0
+};
+#endif
+CORBA_unsigned_long Echo__classid = 0;
diff -urN linux-2.4.1/net/korbit/modules/Echo/client/echo-stubs.c linux-2.4.1-korbit/net/korbit/modules/Echo/client/echo-stubs.c
--- linux-2.4.1/net/korbit/modules/Echo/client/echo-stubs.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/client/echo-stubs.c Thu Feb 1 16:36:36 2001
@@ -0,0 +1,134 @@
+/*
+ * This file was generated by orbit-idl - DO NOT EDIT!
+ */
+
+#include <string.h>
+#include "echo.h"
+
+Echo
+Echo_echoString(Echo _obj, const CORBA_char * astring, CORBA_long * anum,
+ CORBA_Environment * ev)
+{
+ register GIOP_unsigned_long _ORBIT_request_id,
+ _ORBIT_system_exception_minor;
+ register CORBA_completion_status _ORBIT_completion_status;
+ register GIOPSendBuffer *_ORBIT_send_buffer;
+ register GIOPRecvBuffer *_ORBIT_recv_buffer;
+ register GIOPConnection *_cnx;
+ Echo _ORBIT_retval;
+
+ if (_obj->servant && _obj->vepv && Echo__classid) {
+ _ORBIT_retval =
+ ((POA_Echo__epv *) _obj->vepv[Echo__classid])->echoString(_obj->
+ servant,
+ astring,
+ anum, ev);
+ return _ORBIT_retval;
+ }
+ _cnx = ORBit_object_get_connection(_obj);
+ _ORBIT_retry_request:
+ _ORBIT_send_buffer = NULL;
+ _ORBIT_recv_buffer = NULL;
+ _ORBIT_completion_status = CORBA_COMPLETED_NO;
+ _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0));
+ { /* marshalling */
+ static const struct
+ {
+ CORBA_unsigned_long len;
+ char opname[11];
+ }
+ _ORBIT_operation_name_data =
+ {
+ 11, "echoString"};
+ static const struct iovec _ORBIT_operation_vec =
+ { (gpointer) & _ORBIT_operation_name_data, 15 };
+ register CORBA_unsigned_long _ORBIT_tmpvar_0;
+ CORBA_unsigned_long _ORBIT_tmpvar_1;
+
+ _ORBIT_send_buffer =
+ giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id,
+ CORBA_TRUE,
+ &(_obj->active_profile->object_key_vec),
+ &_ORBIT_operation_vec,
+ &ORBit_default_principal_iovec);
+
+ _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE;
+ if (!_ORBIT_send_buffer)
+ goto _ORBIT_system_exception;
+ _ORBIT_tmpvar_1 = strlen(astring) + 1;
+ giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER
+ (_ORBIT_send_buffer), 4);
+ {
+ guchar *_ORBIT_t;
+
+ _ORBIT_t = alloca(sizeof(_ORBIT_tmpvar_1));
+ memcpy(_ORBIT_t, &(_ORBIT_tmpvar_1), sizeof(_ORBIT_tmpvar_1));
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER
+ (_ORBIT_send_buffer), (_ORBIT_t),
+ sizeof(_ORBIT_tmpvar_1));
+ }
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer),
+ (astring),
+ sizeof(astring[_ORBIT_tmpvar_0]) *
+ _ORBIT_tmpvar_1);
+ giop_send_buffer_write(_ORBIT_send_buffer);
+ _ORBIT_completion_status = CORBA_COMPLETED_MAYBE;
+ giop_send_buffer_unuse(_ORBIT_send_buffer);
+ _ORBIT_send_buffer = NULL;
+ }
+ { /* demarshalling */
+ register guchar *_ORBIT_curptr;
+
+ _ORBIT_recv_buffer =
+ giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE);
+ if (!_ORBIT_recv_buffer)
+ goto _ORBIT_system_exception;
+ _ORBIT_completion_status = CORBA_COMPLETED_YES;
+ if (_ORBIT_recv_buffer->message.u.reply.reply_status !=
+ GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception;
+ _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur;
+ if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) {
+ GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur = _ORBIT_curptr;
+ _ORBIT_retval =
+ ORBit_demarshal_object(_ORBIT_recv_buffer,
+ GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)->
+ connection->orb_data);
+ _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur;
+ _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4);
+
+ (*((guint32 *) & ((*anum)))) =
+ GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr));} else {
+ GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur = _ORBIT_curptr;
+ _ORBIT_retval =
+ ORBit_demarshal_object(_ORBIT_recv_buffer,
+ GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)->
+ connection->orb_data);
+ _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur;
+ _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4);
+ (*anum) = *((CORBA_long *) _ORBIT_curptr);
+ }
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ return _ORBIT_retval;
+ _ORBIT_system_exception:
+ CORBA_exception_set_system(ev, _ORBIT_system_exception_minor,
+ _ORBIT_completion_status);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ giop_send_buffer_unuse(_ORBIT_send_buffer);
+ return _ORBIT_retval;
+ _ORBIT_msg_exception:
+ if (_ORBIT_recv_buffer->message.u.reply.reply_status ==
+ GIOP_LOCATION_FORWARD) {
+ if (_obj->forward_locations != NULL)
+ ORBit_delete_profiles(_obj->forward_locations);
+ _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer);
+ _cnx = ORBit_object_get_forwarded_connection(_obj);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+
+ goto _ORBIT_retry_request;
+ } else {
+ ORBit_handle_exception(_ORBIT_recv_buffer, ev, NULL, _obj->orb);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ return _ORBIT_retval;
+ }
+ }
+}
diff -urN linux-2.4.1/net/korbit/modules/Echo/client/echo.h linux-2.4.1-korbit/net/korbit/modules/Echo/client/echo.h
--- linux-2.4.1/net/korbit/modules/Echo/client/echo.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/client/echo.h Thu Feb 1 16:36:36 2001
@@ -0,0 +1,77 @@
+/*
+ * This file was generated by orbit-idl - DO NOT EDIT!
+ */
+
+#include <glib.h>
+#define ORBIT_IDL_SERIAL 9
+#include <orb/orbit.h>
+
+#ifndef echo_H
+#define echo_H 1
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+/** typedefs **/
+#if !defined(ORBIT_DECL_Echo) && !defined(_Echo_defined)
+#define ORBIT_DECL_Echo 1
+#define _Echo_defined 1
+#define Echo__free CORBA_Object__free
+ typedef CORBA_Object Echo;
+ extern CORBA_unsigned_long Echo__classid;
+#if !defined(TC_IMPL_TC_Echo_0)
+#define TC_IMPL_TC_Echo_0 'e'
+#define TC_IMPL_TC_Echo_1 'c'
+#define TC_IMPL_TC_Echo_2 'h'
+#define TC_IMPL_TC_Echo_3 'o'
+ extern const struct CORBA_TypeCode_struct TC_Echo_struct;
+#define TC_Echo ((CORBA_TypeCode)&TC_Echo_struct)
+#endif
+#endif
+
+/** POA structures **/
+ typedef struct
+ {
+ void *_private;
+
+ Echo(*echoString) (PortableServer_Servant _servant,
+ const CORBA_char * astring, CORBA_long * anum,
+ CORBA_Environment * ev);
+ }
+ POA_Echo__epv;
+ typedef struct
+ {
+ PortableServer_ServantBase__epv *_base_epv;
+ POA_Echo__epv *Echo_epv;
+ }
+ POA_Echo__vepv;
+ typedef struct
+ {
+ void *_private;
+ POA_Echo__vepv *vepv;
+ }
+ POA_Echo;
+ extern void POA_Echo__init(PortableServer_Servant servant,
+ CORBA_Environment * ev);
+ extern void POA_Echo__fini(PortableServer_Servant servant,
+ CORBA_Environment * ev);
+
+/** prototypes **/
+ Echo Echo_echoString(Echo _obj, const CORBA_char * astring,
+ CORBA_long * anum, CORBA_Environment * ev);
+
+ void _ORBIT_skel_Echo_echoString(POA_Echo * _ORBIT_servant,
+ GIOPRecvBuffer * _ORBIT_recv_buffer,
+ CORBA_Environment * ev,
+ Echo(*_impl_echoString)
+ (PortableServer_Servant _servant,
+ const CORBA_char * astring,
+ CORBA_long * anum,
+ CORBA_Environment * ev));
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
+#undef ORBIT_IDL_SERIAL
diff -urN linux-2.4.1/net/korbit/modules/Echo/client-perl/CVS/Entries linux-2.4.1-korbit/net/korbit/modules/Echo/client-perl/CVS/Entries
--- linux-2.4.1/net/korbit/modules/Echo/client-perl/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/client-perl/CVS/Entries Thu Feb 1 11:47:06 2001
@@ -0,0 +1,3 @@
+/PerlTest/1.2/Thu Feb 1 09:47:06 2001//
+/README/1.1/Thu Feb 1 09:47:06 2001//
+D
diff -urN linux-2.4.1/net/korbit/modules/Echo/client-perl/CVS/Repository linux-2.4.1-korbit/net/korbit/modules/Echo/client-perl/CVS/Repository
--- linux-2.4.1/net/korbit/modules/Echo/client-perl/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/client-perl/CVS/Repository Thu Feb 1 11:47:06 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/modules/Echo/client-perl
diff -urN linux-2.4.1/net/korbit/modules/Echo/client-perl/CVS/Root linux-2.4.1-korbit/net/korbit/modules/Echo/client-perl/CVS/Root
--- linux-2.4.1/net/korbit/modules/Echo/client-perl/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/client-perl/CVS/Root Thu Feb 1 11:47:06 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/modules/Echo/client-perl/PerlTest linux-2.4.1-korbit/net/korbit/modules/Echo/client-perl/PerlTest
--- linux-2.4.1/net/korbit/modules/Echo/client-perl/PerlTest Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/client-perl/PerlTest Thu Feb 1 11:47:06 2001
@@ -0,0 +1,17 @@
+#!/usr/bin/perl -w
+
+use CORBA::ORBit idl => [ qw(../echo.idl) ];
+use Error qw(:try);
+use strict;
+
+my $orb = CORBA::ORB_init("orbit-local-orb");
+open IOR, "/proc/corba/echo-server" or die "no console server found!";
+my $ior = <IOR>;
+close IOR;
+chomp($ior); # Kill fredrik's newline...
+
+my $echo = $orb->string_to_object($ior);
+# Echo echoString(in string astring, out long anum);
+my ($echo2, $num) = $echo->echoString("Echo Strange World");
+
+print "Return Echo = $echo2\nnum = $num\n";
diff -urN linux-2.4.1/net/korbit/modules/Echo/client-perl/README linux-2.4.1-korbit/net/korbit/modules/Echo/client-perl/README
--- linux-2.4.1/net/korbit/modules/Echo/client-perl/README Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/client-perl/README Thu Feb 1 11:47:06 2001
@@ -0,0 +1,4 @@
+Another test of the echo server.
+
+ORB: ORBit/Perl
+Status: Working fine
diff -urN linux-2.4.1/net/korbit/modules/Echo/echo.idl linux-2.4.1-korbit/net/korbit/modules/Echo/echo.idl
--- linux-2.4.1/net/korbit/modules/Echo/echo.idl Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/echo.idl Thu Feb 1 11:47:05 2001
@@ -0,0 +1,3 @@
+interface Echo {
+ Echo echoString(in string astring, out long anum);
+};
diff -urN linux-2.4.1/net/korbit/modules/Echo/server/CVS/Entries linux-2.4.1-korbit/net/korbit/modules/Echo/server/CVS/Entries
--- linux-2.4.1/net/korbit/modules/Echo/server/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/server/CVS/Entries Thu Feb 1 11:47:06 2001
@@ -0,0 +1,6 @@
+/Makefile/1.2/Thu Feb 1 09:47:06 2001//
+/Makefile.user/1.3/Thu Feb 1 09:47:06 2001//
+/README/1.1/Thu Feb 1 09:47:06 2001//
+/RunServer.sh/1.1/Thu Feb 1 09:47:06 2001//
+/echo-server.c/1.8/Thu Feb 1 09:47:06 2001//
+D
diff -urN linux-2.4.1/net/korbit/modules/Echo/server/CVS/Repository linux-2.4.1-korbit/net/korbit/modules/Echo/server/CVS/Repository
--- linux-2.4.1/net/korbit/modules/Echo/server/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/server/CVS/Repository Thu Feb 1 11:47:06 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/modules/Echo/server
diff -urN linux-2.4.1/net/korbit/modules/Echo/server/CVS/Root linux-2.4.1-korbit/net/korbit/modules/Echo/server/CVS/Root
--- linux-2.4.1/net/korbit/modules/Echo/server/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/server/CVS/Root Thu Feb 1 11:47:06 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/modules/Echo/server/Makefile linux-2.4.1-korbit/net/korbit/modules/Echo/server/Makefile
--- linux-2.4.1/net/korbit/modules/Echo/server/Makefile Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/server/Makefile Thu Feb 1 11:47:06 2001
@@ -0,0 +1,21 @@
+#
+# Makefile for KORBit
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
+# Note 2! The CFLAGS definition is now in the main makefile...
+
+O_TARGET := corba-echo-server.o
+
+obj-y := echo-server.o echo-skels.o echo-common.o
+obj-m := $(O_TARGET)
+
+include ../../Makefile.module
+
+echo-server.c: echo.h echo-skels.c
+
+
+echo.h echo-common.c echo-skels.c: ../echo.idl
+ $(ORBIT_IDL) ../echo.idl
diff -urN linux-2.4.1/net/korbit/modules/Echo/server/Makefile.user linux-2.4.1-korbit/net/korbit/modules/Echo/server/Makefile.user
--- linux-2.4.1/net/korbit/modules/Echo/server/Makefile.user Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/server/Makefile.user Thu Feb 1 11:47:06 2001
@@ -0,0 +1,27 @@
+#
+# Makefile for user level server
+#
+
+PROJECT = echo
+
+CFLAGS = -Wall `orbit-config --cflags server` -I../../..
+LDFLAGS = `orbit-config --libs server`
+OBJS = $(PROJECT)-common.o $(PROJECT)-skels.o $(PROJECT)-server.o
+ORBIT-IDL = orbit-idl
+
+$(PROJECT)-server: $(OBJS)
+ gcc -o $(PROJECT)-server $(OBJS) $(LDFLAGS)
+
+$(PROJECT)-server.c: $(PROJECT).h
+
+$(PROJECT).h $(PROJECT)-common.c $(PROJECT)-skels.c: ../$(PROJECT).idl
+ $(ORBIT-IDL) --nostubs ../$(PROJECT).idl
+
+clean:
+ rm -f $(OBJS) $(PROJECT)-server
+
+realclean: clean
+ rm -f $(PROJECT).h
+ rm -f $(PROJECT)-common.c
+ rm -f $(PROJECT)-skels.c
+ rm -f *~
diff -urN linux-2.4.1/net/korbit/modules/Echo/server/README linux-2.4.1-korbit/net/korbit/modules/Echo/server/README
--- linux-2.4.1/net/korbit/modules/Echo/server/README Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/server/README Thu Feb 1 11:47:06 2001
@@ -0,0 +1,5 @@
+This server implements the kernel side interface in terms of printk.
+
+This server also builds in user space with ORBit. Build with
+ make -f Makefile.user
+
diff -urN linux-2.4.1/net/korbit/modules/Echo/server/RunServer.sh linux-2.4.1-korbit/net/korbit/modules/Echo/server/RunServer.sh
--- linux-2.4.1/net/korbit/modules/Echo/server/RunServer.sh Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/server/RunServer.sh Thu Feb 1 11:47:06 2001
@@ -0,0 +1 @@
+./echo-server -ORBIIOPUSock=0 -ORBIIOPIPv4=1
diff -urN linux-2.4.1/net/korbit/modules/Echo/server/echo-common.c linux-2.4.1-korbit/net/korbit/modules/Echo/server/echo-common.c
--- linux-2.4.1/net/korbit/modules/Echo/server/echo-common.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/server/echo-common.c Thu Feb 1 16:36:57 2001
@@ -0,0 +1,27 @@
+/*
+ * This file was generated by orbit-idl - DO NOT EDIT!
+ */
+
+#include <string.h>
+#include "echo.h"
+
+#if ( (TC_IMPL_TC_Echo_0 == 'e') \
+&& (TC_IMPL_TC_Echo_1 == 'c') \
+&& (TC_IMPL_TC_Echo_2 == 'h') \
+&& (TC_IMPL_TC_Echo_3 == 'o') \
+) && !defined(TC_DEF_TC_Echo)
+#define TC_DEF_TC_Echo 1
+const struct CORBA_TypeCode_struct TC_Echo_struct = {
+
+ {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1},
+ ORBIT_PSEUDO_TYPECODE},
+
+ CORBA_tk_objref, "Echo", "IDL:Echo:1.0",
+ 0, 0,
+ NULL,
+ NULL,
+ NULL,
+ CORBA_OBJECT_NIL, 0, -1, 0, 0
+};
+#endif
+CORBA_unsigned_long Echo__classid = 0;
diff -urN linux-2.4.1/net/korbit/modules/Echo/server/echo-server.c linux-2.4.1-korbit/net/korbit/modules/Echo/server/echo-server.c
--- linux-2.4.1/net/korbit/modules/Echo/server/echo-server.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/server/echo-server.c Thu Feb 1 11:47:06 2001
@@ -0,0 +1,103 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+#include <orb/orbit.h>
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include "echo.h"
+#include "glib.h"
+#include "korbit.h"
+
+Echo echo_client = CORBA_OBJECT_NIL;
+
+static CORBA_Object
+do_echoString(PortableServer_Servant servant,
+ CORBA_char *astring,
+ CORBA_long *outnum,
+ CORBA_Environment *ev);
+
+PortableServer_ServantBase__epv base_epv = {
+ NULL,
+ NULL,
+ NULL
+};
+POA_Echo__epv echo_epv = { NULL, do_echoString };
+POA_Echo__vepv poa_echo_vepv = { &base_epv, &echo_epv };
+POA_Echo poa_echo_servant = { NULL, &poa_echo_vepv };
+
+PortableServer_ObjectId objid = {0, sizeof("myEchoString"), "myEchoString"};
+PortableServer_POA poa;
+CORBA_Environment *ev;
+
+#ifdef __KERNEL__
+int __init corba_echo_init(void)
+#else
+int main(int argc, char *argv[])
+#endif
+{
+#ifdef __KERNEL__
+ int argc = 1; char *argv[] = { "server", 0 };
+#endif
+ CORBA_ORB orb;
+ ev = g_new0(CORBA_Environment, 1);
+ orb = CORBA_ORB_init(&argc, argv, "orbit-local-orb", ev);
+ if (!orb) {
+ printf("Error getting ORB!\n");
+ return 1;
+ }
+
+ poa = (PortableServer_POA)
+ CORBA_ORB_resolve_initial_references(orb, "RootPOA", ev);
+ if (!poa) {
+ printf("Error getting POA!\n");
+ return 1;
+ }
+
+ PortableServer_POAManager_activate(
+ PortableServer_POA__get_the_POAManager(poa, ev), ev);
+
+
+ POA_Echo__init(&poa_echo_servant, ev);
+ PortableServer_POA_activate_object_with_id(poa,
+ &objid, &poa_echo_servant, ev);
+
+ echo_client = PortableServer_POA_servant_to_reference(poa,
+ &poa_echo_servant,
+ ev);
+ if (!echo_client) {
+ printf("Cannot get objref\n");
+ return 1;
+ }
+
+ korbit_register_ior("echo-server", echo_client, orb, ev);
+
+ CORBA_ORB_run(orb, ev);
+ return 0;
+}
+
+#ifdef __KERNEL__
+void corba_echo_exit(void) {
+ PortableServer_POA_deactivate_object(poa, &objid, ev);
+ remove_proc_entry("corba/echo-server", 0);
+}
+
+module_init(corba_echo_init)
+module_exit(corba_echo_exit)
+#endif
+
+static CORBA_Object
+do_echoString(PortableServer_Servant servant,
+ CORBA_char *astring,
+ CORBA_long *outnum,
+ CORBA_Environment *ev)
+{
+ *outnum = 12345678;
+
+#if 1
+ g_message("[server] %s -> %d", astring, *outnum);
+#endif
+
+ return CORBA_Object_duplicate(echo_client, ev);
+}
diff -urN linux-2.4.1/net/korbit/modules/Echo/server/echo-skels.c linux-2.4.1-korbit/net/korbit/modules/Echo/server/echo-skels.c
--- linux-2.4.1/net/korbit/modules/Echo/server/echo-skels.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/server/echo-skels.c Thu Feb 1 16:36:57 2001
@@ -0,0 +1,115 @@
+/*
+ * This file was generated by orbit-idl - DO NOT EDIT!
+ */
+
+#include <string.h>
+#include "echo.h"
+
+void
+_ORBIT_skel_Echo_echoString(POA_Echo * _ORBIT_servant,
+ GIOPRecvBuffer * _ORBIT_recv_buffer,
+ CORBA_Environment * ev,
+ Echo(*_impl_echoString) (PortableServer_Servant
+ _servant,
+ const CORBA_char *
+ astring,
+ CORBA_long * anum,
+ CORBA_Environment * ev))
+{
+ Echo _ORBIT_retval;
+ CORBA_char *astring;
+ CORBA_long anum;
+
+ { /* demarshalling */
+ guchar *_ORBIT_curptr;
+ register CORBA_unsigned_long _ORBIT_tmpvar_2;
+ CORBA_unsigned_long _ORBIT_tmpvar_3;
+
+ _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur;
+ if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) {
+ _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4);
+
+ (*((guint32 *) & (_ORBIT_tmpvar_3))) =
+ GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr));
+ _ORBIT_curptr += 4;
+ astring = (void *) _ORBIT_curptr;
+ _ORBIT_curptr += sizeof(astring[_ORBIT_tmpvar_2]) * _ORBIT_tmpvar_3;
+ } else {
+ _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4);
+ _ORBIT_tmpvar_3 = *((CORBA_unsigned_long *) _ORBIT_curptr);
+ _ORBIT_curptr += 4;
+ astring = (void *) _ORBIT_curptr;
+ _ORBIT_curptr += sizeof(astring[_ORBIT_tmpvar_2]) * _ORBIT_tmpvar_3;
+ }
+ }
+ _ORBIT_retval = _impl_echoString(_ORBIT_servant, astring, &(anum), ev);
+ { /* marshalling */
+ register GIOPSendBuffer *_ORBIT_send_buffer;
+
+ _ORBIT_send_buffer =
+ giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)->
+ connection, NULL,
+ _ORBIT_recv_buffer->message.u.request.
+ request_id, ev->_major);
+ if (_ORBIT_send_buffer) {
+ if (ev->_major == CORBA_NO_EXCEPTION) {
+ ORBit_marshal_object(_ORBIT_send_buffer, _ORBIT_retval);
+ giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER
+ (_ORBIT_send_buffer), 4);
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER
+ (_ORBIT_send_buffer), &(anum),
+ sizeof(anum));
+ } else
+ ORBit_send_system_exception(_ORBIT_send_buffer, ev);
+ giop_send_buffer_write(_ORBIT_send_buffer);
+ giop_send_buffer_unuse(_ORBIT_send_buffer);
+ }
+ if (ev->_major == CORBA_NO_EXCEPTION)
+ CORBA_Object_release(_ORBIT_retval, ev);
+ }
+}
+static ORBitSkeleton
+get_skel_Echo(POA_Echo * servant,
+ GIOPRecvBuffer * _ORBIT_recv_buffer, gpointer * impl)
+{
+ gchar *opname = _ORBIT_recv_buffer->message.u.request.operation;
+
+ switch (opname[0]) {
+ case 'e':
+ if (strcmp((opname + 1), "choString"))
+ break;
+ *impl = (gpointer) servant->vepv->Echo_epv->echoString;
+ return (ORBitSkeleton) _ORBIT_skel_Echo_echoString;
+ break;
+ default:
+ break;
+ }
+ return NULL;
+}
+
+static void
+init_local_objref_Echo(CORBA_Object obj, POA_Echo * servant)
+{
+ obj->vepv[Echo__classid] = servant->vepv->Echo_epv;
+}
+
+void
+POA_Echo__init(PortableServer_Servant servant, CORBA_Environment * env)
+{
+ static const PortableServer_ClassInfo class_info =
+ { (ORBit_impl_finder) & get_skel_Echo, "IDL:Echo:1.0",
+ (ORBit_local_objref_init) & init_local_objref_Echo };
+
+ PortableServer_ServantBase__init(((PortableServer_ServantBase *) servant),
+ env);
+ ORBIT_OBJECT_KEY(((PortableServer_ServantBase *) servant)->_private)->
+ class_info = (PortableServer_ClassInfo *) & class_info;
+ if (!Echo__classid)
+ Echo__classid = ORBit_register_class(&class_info);
+}
+
+void
+POA_Echo__fini(PortableServer_Servant servant, CORBA_Environment * env)
+{
+ PortableServer_ServantBase__fini(servant, env);
+}
diff -urN linux-2.4.1/net/korbit/modules/Echo/server/echo-stubs.c linux-2.4.1-korbit/net/korbit/modules/Echo/server/echo-stubs.c
--- linux-2.4.1/net/korbit/modules/Echo/server/echo-stubs.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/server/echo-stubs.c Thu Feb 1 16:36:57 2001
@@ -0,0 +1,134 @@
+/*
+ * This file was generated by orbit-idl - DO NOT EDIT!
+ */
+
+#include <string.h>
+#include "echo.h"
+
+Echo
+Echo_echoString(Echo _obj, const CORBA_char * astring, CORBA_long * anum,
+ CORBA_Environment * ev)
+{
+ register GIOP_unsigned_long _ORBIT_request_id,
+ _ORBIT_system_exception_minor;
+ register CORBA_completion_status _ORBIT_completion_status;
+ register GIOPSendBuffer *_ORBIT_send_buffer;
+ register GIOPRecvBuffer *_ORBIT_recv_buffer;
+ register GIOPConnection *_cnx;
+ Echo _ORBIT_retval;
+
+ if (_obj->servant && _obj->vepv && Echo__classid) {
+ _ORBIT_retval =
+ ((POA_Echo__epv *) _obj->vepv[Echo__classid])->echoString(_obj->
+ servant,
+ astring,
+ anum, ev);
+ return _ORBIT_retval;
+ }
+ _cnx = ORBit_object_get_connection(_obj);
+ _ORBIT_retry_request:
+ _ORBIT_send_buffer = NULL;
+ _ORBIT_recv_buffer = NULL;
+ _ORBIT_completion_status = CORBA_COMPLETED_NO;
+ _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0));
+ { /* marshalling */
+ static const struct
+ {
+ CORBA_unsigned_long len;
+ char opname[11];
+ }
+ _ORBIT_operation_name_data =
+ {
+ 11, "echoString"};
+ static const struct iovec _ORBIT_operation_vec =
+ { (gpointer) & _ORBIT_operation_name_data, 15 };
+ register CORBA_unsigned_long _ORBIT_tmpvar_0;
+ CORBA_unsigned_long _ORBIT_tmpvar_1;
+
+ _ORBIT_send_buffer =
+ giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id,
+ CORBA_TRUE,
+ &(_obj->active_profile->object_key_vec),
+ &_ORBIT_operation_vec,
+ &ORBit_default_principal_iovec);
+
+ _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE;
+ if (!_ORBIT_send_buffer)
+ goto _ORBIT_system_exception;
+ _ORBIT_tmpvar_1 = strlen(astring) + 1;
+ giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER
+ (_ORBIT_send_buffer), 4);
+ {
+ guchar *_ORBIT_t;
+
+ _ORBIT_t = alloca(sizeof(_ORBIT_tmpvar_1));
+ memcpy(_ORBIT_t, &(_ORBIT_tmpvar_1), sizeof(_ORBIT_tmpvar_1));
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER
+ (_ORBIT_send_buffer), (_ORBIT_t),
+ sizeof(_ORBIT_tmpvar_1));
+ }
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer),
+ (astring),
+ sizeof(astring[_ORBIT_tmpvar_0]) *
+ _ORBIT_tmpvar_1);
+ giop_send_buffer_write(_ORBIT_send_buffer);
+ _ORBIT_completion_status = CORBA_COMPLETED_MAYBE;
+ giop_send_buffer_unuse(_ORBIT_send_buffer);
+ _ORBIT_send_buffer = NULL;
+ }
+ { /* demarshalling */
+ register guchar *_ORBIT_curptr;
+
+ _ORBIT_recv_buffer =
+ giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE);
+ if (!_ORBIT_recv_buffer)
+ goto _ORBIT_system_exception;
+ _ORBIT_completion_status = CORBA_COMPLETED_YES;
+ if (_ORBIT_recv_buffer->message.u.reply.reply_status !=
+ GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception;
+ _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur;
+ if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) {
+ GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur = _ORBIT_curptr;
+ _ORBIT_retval =
+ ORBit_demarshal_object(_ORBIT_recv_buffer,
+ GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)->
+ connection->orb_data);
+ _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur;
+ _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4);
+
+ (*((guint32 *) & ((*anum)))) =
+ GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr));} else {
+ GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur = _ORBIT_curptr;
+ _ORBIT_retval =
+ ORBit_demarshal_object(_ORBIT_recv_buffer,
+ GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)->
+ connection->orb_data);
+ _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur;
+ _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4);
+ (*anum) = *((CORBA_long *) _ORBIT_curptr);
+ }
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ return _ORBIT_retval;
+ _ORBIT_system_exception:
+ CORBA_exception_set_system(ev, _ORBIT_system_exception_minor,
+ _ORBIT_completion_status);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ giop_send_buffer_unuse(_ORBIT_send_buffer);
+ return _ORBIT_retval;
+ _ORBIT_msg_exception:
+ if (_ORBIT_recv_buffer->message.u.reply.reply_status ==
+ GIOP_LOCATION_FORWARD) {
+ if (_obj->forward_locations != NULL)
+ ORBit_delete_profiles(_obj->forward_locations);
+ _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer);
+ _cnx = ORBit_object_get_forwarded_connection(_obj);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+
+ goto _ORBIT_retry_request;
+ } else {
+ ORBit_handle_exception(_ORBIT_recv_buffer, ev, NULL, _obj->orb);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ return _ORBIT_retval;
+ }
+ }
+}
diff -urN linux-2.4.1/net/korbit/modules/Echo/server/echo.h linux-2.4.1-korbit/net/korbit/modules/Echo/server/echo.h
--- linux-2.4.1/net/korbit/modules/Echo/server/echo.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Echo/server/echo.h Thu Feb 1 16:36:57 2001
@@ -0,0 +1,77 @@
+/*
+ * This file was generated by orbit-idl - DO NOT EDIT!
+ */
+
+#include <glib.h>
+#define ORBIT_IDL_SERIAL 9
+#include <orb/orbit.h>
+
+#ifndef echo_H
+#define echo_H 1
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+/** typedefs **/
+#if !defined(ORBIT_DECL_Echo) && !defined(_Echo_defined)
+#define ORBIT_DECL_Echo 1
+#define _Echo_defined 1
+#define Echo__free CORBA_Object__free
+ typedef CORBA_Object Echo;
+ extern CORBA_unsigned_long Echo__classid;
+#if !defined(TC_IMPL_TC_Echo_0)
+#define TC_IMPL_TC_Echo_0 'e'
+#define TC_IMPL_TC_Echo_1 'c'
+#define TC_IMPL_TC_Echo_2 'h'
+#define TC_IMPL_TC_Echo_3 'o'
+ extern const struct CORBA_TypeCode_struct TC_Echo_struct;
+#define TC_Echo ((CORBA_TypeCode)&TC_Echo_struct)
+#endif
+#endif
+
+/** POA structures **/
+ typedef struct
+ {
+ void *_private;
+
+ Echo(*echoString) (PortableServer_Servant _servant,
+ const CORBA_char * astring, CORBA_long * anum,
+ CORBA_Environment * ev);
+ }
+ POA_Echo__epv;
+ typedef struct
+ {
+ PortableServer_ServantBase__epv *_base_epv;
+ POA_Echo__epv *Echo_epv;
+ }
+ POA_Echo__vepv;
+ typedef struct
+ {
+ void *_private;
+ POA_Echo__vepv *vepv;
+ }
+ POA_Echo;
+ extern void POA_Echo__init(PortableServer_Servant servant,
+ CORBA_Environment * ev);
+ extern void POA_Echo__fini(PortableServer_Servant servant,
+ CORBA_Environment * ev);
+
+/** prototypes **/
+ Echo Echo_echoString(Echo _obj, const CORBA_char * astring,
+ CORBA_long * anum, CORBA_Environment * ev);
+
+ void _ORBIT_skel_Echo_echoString(POA_Echo * _ORBIT_servant,
+ GIOPRecvBuffer * _ORBIT_recv_buffer,
+ CORBA_Environment * ev,
+ Echo(*_impl_echoString)
+ (PortableServer_Servant _servant,
+ const CORBA_char * astring,
+ CORBA_long * anum,
+ CORBA_Environment * ev));
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
+#undef ORBIT_IDL_SERIAL
diff -urN linux-2.4.1/net/korbit/modules/FileServer/CVS/Entries linux-2.4.1-korbit/net/korbit/modules/FileServer/CVS/Entries
--- linux-2.4.1/net/korbit/modules/FileServer/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/CVS/Entries Thu Feb 1 11:47:07 2001
@@ -0,0 +1,4 @@
+/FileServer.idl/1.3/Thu Feb 1 09:47:07 2001//
+/Makefile/1.2/Thu Feb 1 09:47:07 2001//
+/README/1.1/Thu Feb 1 09:47:07 2001//
+D
diff -urN linux-2.4.1/net/korbit/modules/FileServer/CVS/Entries.Log linux-2.4.1-korbit/net/korbit/modules/FileServer/CVS/Entries.Log
--- linux-2.4.1/net/korbit/modules/FileServer/CVS/Entries.Log Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/CVS/Entries.Log Thu Feb 1 11:47:09 2001
@@ -0,0 +1,4 @@
+A D/client////
+A D/server////
+A D/server-user////
+A D/wrapper////
diff -urN linux-2.4.1/net/korbit/modules/FileServer/CVS/Repository linux-2.4.1-korbit/net/korbit/modules/FileServer/CVS/Repository
--- linux-2.4.1/net/korbit/modules/FileServer/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/CVS/Repository Thu Feb 1 11:47:07 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/modules/FileServer
diff -urN linux-2.4.1/net/korbit/modules/FileServer/CVS/Root linux-2.4.1-korbit/net/korbit/modules/FileServer/CVS/Root
--- linux-2.4.1/net/korbit/modules/FileServer/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/CVS/Root Thu Feb 1 11:47:07 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/modules/FileServer/FileServer.idl linux-2.4.1-korbit/net/korbit/modules/FileServer/FileServer.idl
--- linux-2.4.1/net/korbit/modules/FileServer/FileServer.idl Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/FileServer.idl Thu Feb 1 11:47:07 2001
@@ -0,0 +1,158 @@
+// -----------------------------------------------------------------------------
+// FileServer.idl
+// -----------------------------------------------------------------------------
+//
+// This file is used to define the Kernel CORBA API for accessing the filesystem
+// on a machine. This defines mappings both to access the files in the kernel
+// and to implement a filesystem for the kernel. This should probably be split
+// into two files eventually.
+//
+// Currently unimplemented: KernelAccessAPI::FileSystem::ReadDirectory
+// KernelAccessAPI::FileSystem::Select
+// KernelImplementationAPI::SuperBlock::getDiskQuotaOps
+//
+// -----------------------------------------------------------------------------
+
+
+// These are the exceptions that may be thrown and what they map to in the
+// Linux kernel. This interface is extended by other interfaces so that the
+// names don't have to be typedef'd into each interface that wants to use these
+// errors.
+//
+interface Errors {
+ exception IsDirectory {}; // EISDIR
+ exception PermissionDenied {}; // EACCES
+ exception FileExists {}; // EEXIST
+ exception FileNotFound {}; // ENOENT
+ exception IsNotDirectory {}; // ENOTDIR
+ exception ReadOnlyFile {}; // EROFS, ETXTBSY
+ exception RecursiveSymlink {}; // ELOOP
+ exception IsBusy {}; // EBUSY
+ exception OtherError{}; // Misc other ones...
+};
+
+
+// -----------------------------------------------------------------------------
+// KernelAccessAPI Module - Allow user level programs to call into the kernel
+// -----------------------------------------------------------------------------
+
+module FileServer {
+ struct FileStatus { // Corba equilivant of struct stat
+ long DeviceNum; // st_dev
+ long InodeNum; // st_ino
+ short Mode; // st_mode
+ short NumLinks; // st_nlink
+ long UserID; // st_uid
+ long GroupID; // st_gid
+ long DeviceType; // st_rdev
+ unsigned long Size; // st_size
+ unsigned long BlockSize; // st_blksize
+ unsigned long NumBlocks; // st_blocks;
+ unsigned long AccessTime; // st_blocks;
+ unsigned long ModifiedTime; // st_blocks;
+ unsigned long ChangeTime; // st_blocks;
+ };
+
+ typedef sequence<octet> buffer;
+
+ // ---------------------------------------------------------------------------
+ // FileSystem Interface - Access to filesystem and File object factory
+ // ---------------------------------------------------------------------------
+
+ interface File : Errors {
+ void Read(in long count, out buffer buf)
+ raises (IsDirectory, OtherError);
+ void Write(in buffer buf)
+ raises (OtherError);
+ void Close();
+
+ long FileControl(in long command) raises (OtherError);
+
+ FileStatus GetStatus() raises (OtherError);
+
+ void ChangeDirectoryTo() // This implements fchdir...
+ raises (IsNotDirectory, PermissionDenied, OtherError);
+
+ enum SeekDirection { FromStart, FromCurrent, FromEnd };
+ long Seek(in long Offset, in SeekDirection Direction) raises (OtherError);
+
+ File Duplicate() raises (OtherError);
+ };
+
+
+
+ // ---------------------------------------------------------------------------
+ // FileSystem Interface - Access to filesystem and File object factory
+ // ---------------------------------------------------------------------------
+
+ interface FileSystem : Errors {
+
+ // -------------------------------------------------------------------------
+ // File Manipulation Routines
+ // -------------------------------------------------------------------------
+
+ File Open(in string Filename, in long openFlags, in short mode)
+ raises (FileExists, IsDirectory, PermissionDenied, FileNotFound,
+ IsNotDirectory, ReadOnlyFile, RecursiveSymlink, OtherError);
+
+ File Create(in string Filename, in short mode)
+ raises (FileExists, IsDirectory, PermissionDenied, FileNotFound,
+ IsNotDirectory, ReadOnlyFile, RecursiveSymlink, OtherError);
+
+ void Link(in string FromPath, in string ToPath)
+ raises (PermissionDenied, IsNotDirectory, RecursiveSymlink, FileExists);
+
+ void Unlink(in string Filename)
+ raises (PermissionDenied, FileNotFound, IsNotDirectory, IsDirectory);
+
+ void Rename(in string OldName, in string NewName)
+ raises (IsDirectory, FileExists, IsBusy, IsNotDirectory, PermissionDenied,
+ RecursiveSymlink);
+
+ void ReadLink(in string Linkname, out string LinkValue)
+ raises (FileNotFound, PermissionDenied, RecursiveSymlink, OtherError);
+
+
+ FileStatus GetStatus(in string Filename)
+ raises (FileNotFound, PermissionDenied, RecursiveSymlink, IsNotDirectory,
+ OtherError);
+
+ FileStatus GetLinkStatus(in string Filename)
+ raises (FileNotFound, PermissionDenied, RecursiveSymlink, IsNotDirectory,
+ OtherError);
+
+
+ // -------------------------------------------------------------------------
+ // Directory Manipulation Routines
+ // -------------------------------------------------------------------------
+
+ void MakeDirectory(in string PathName, in short mode)
+ raises (FileExists, PermissionDenied, FileNotFound, IsNotDirectory,
+ ReadOnlyFile, RecursiveSymlink, OtherError);
+
+ void RemoveDirectory(in string PathName)
+ raises (PermissionDenied, FileNotFound, IsNotDirectory);
+
+ // ChangeDirectory returns CWD so that you can implement getcwd as
+ // { return ChangeDirectory("."); }
+ string ChangeDirectory(in string PathName)
+ raises (IsNotDirectory, PermissionDenied, FileNotFound, RecursiveSymlink);
+
+
+ // -------------------------------------------------------------------------
+ // Special Purpose Routines...
+ // -------------------------------------------------------------------------
+
+ void MakeNode(in string FileName, in short Mode, in long DeviceNum)
+ raises (PermissionDenied, FileExists, FileNotFound, IsNotDirectory,
+ RecursiveSymlink);
+
+ void Mount(in string DeviceFile, in string Location, in string FSType,
+ in long Flags)
+ raises (PermissionDenied, FileNotFound, IsBusy, IsNotDirectory);
+
+ void Unmount(in string Filename)
+ raises (PermissionDenied, FileNotFound, IsBusy);
+ };
+
+};
diff -urN linux-2.4.1/net/korbit/modules/FileServer/Makefile linux-2.4.1-korbit/net/korbit/modules/FileServer/Makefile
--- linux-2.4.1/net/korbit/modules/FileServer/Makefile Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/Makefile Thu Feb 1 11:47:07 2001
@@ -0,0 +1,11 @@
+#
+# Makefile for KORBit/modules/CorbaFS
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+
+subdir-$(CONFIG_CORBA_FILESERVER) := server
+
+include $(TOPDIR)/Rules.make
+
diff -urN linux-2.4.1/net/korbit/modules/FileServer/README linux-2.4.1-korbit/net/korbit/modules/FileServer/README
--- linux-2.4.1/net/korbit/modules/FileServer/README Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/README Thu Feb 1 11:47:07 2001
@@ -0,0 +1,8 @@
+This interface lets you export file related syscalls through CORBA. This is
+genuinely useful, however, when you use the 'wrapper' library, that can be
+LD_PRELOADED before you run your application. This allows you to forward
+filesystem calls through CORBA without having to modify your application.
+
+Being able to forward filesystem calls though CORBA, of course, means that
+you can attach to any remote machine you want. :)
+
diff -urN linux-2.4.1/net/korbit/modules/FileServer/client/CVS/Entries linux-2.4.1-korbit/net/korbit/modules/FileServer/client/CVS/Entries
--- linux-2.4.1/net/korbit/modules/FileServer/client/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/client/CVS/Entries Thu Feb 1 11:47:07 2001
@@ -0,0 +1,4 @@
+/FileServer-client.cpp/1.1/Thu Feb 1 09:47:07 2001//
+/Makefile/1.1/Thu Feb 1 09:47:07 2001//
+/README/1.1/Thu Feb 1 09:47:07 2001//
+D
diff -urN linux-2.4.1/net/korbit/modules/FileServer/client/CVS/Repository linux-2.4.1-korbit/net/korbit/modules/FileServer/client/CVS/Repository
--- linux-2.4.1/net/korbit/modules/FileServer/client/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/client/CVS/Repository Thu Feb 1 11:47:07 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/modules/FileServer/client
diff -urN linux-2.4.1/net/korbit/modules/FileServer/client/CVS/Root linux-2.4.1-korbit/net/korbit/modules/FileServer/client/CVS/Root
--- linux-2.4.1/net/korbit/modules/FileServer/client/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/client/CVS/Root Thu Feb 1 11:47:07 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/modules/FileServer/client/FileServer-client.cpp linux-2.4.1-korbit/net/korbit/modules/FileServer/client/FileServer-client.cpp
--- linux-2.4.1/net/korbit/modules/FileServer/client/FileServer-client.cpp Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/client/FileServer-client.cpp Thu Feb 1 11:47:07 2001
@@ -0,0 +1,78 @@
+#include <OB/CORBA.h>
+#include <OB/Util.h>
+#include <OB/CosNaming.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include "FileServer.h"
+
+int main(int argc, char* argv[])
+{
+ if (argc < 3)
+ {
+ cout << "Usage : " << argv[0] << " ior filename" << endl;
+ exit(1);
+ }
+
+ cout << "FileServer client initializing" << endl;
+
+ CORBA_ORB_var orb = CORBA_ORB_init(argc, argv);
+ cout << "ORB initialized" << endl;
+
+ try
+ {
+ CORBA_Object_var obj = orb->string_to_object( argv[1] );
+ assert(!CORBA_is_nil(obj));
+ cout << "got object... " << orb->object_to_string(obj) << endl;
+
+ FileServer_FileSystem_var fs = FileServer_FileSystem::_narrow(obj);
+ assert(!CORBA_is_nil(fs));
+ cout << "it's a FileServer!" << endl;
+
+ obj = fs->Open(argv[2], O_RDONLY, 0);
+ assert(!CORBA_is_nil(obj));
+ cout << "got object... " << orb->object_to_string(obj) << endl;
+
+ FileServer_File_var file = FileServer_File::_narrow(obj);
+ assert(!CORBA_is_nil(file));
+ cout << "it's a FileServer_File!" << endl;
+
+ FileServer_buffer *buf = new FileServer_buffer;
+ cout << "reading 1000 bytes" << endl;
+ file->Read(1000, buf);
+
+ cout << "got " << buf->length() << " bytes" << endl;
+ cout << buf->data() << endl;
+
+ file->Close();
+
+ delete buf;
+ }
+ catch (const CORBA_SystemException& ex) {
+ OBPrintException(ex);
+ return 1;
+ }
+ catch (const Errors::FileNotFound& ex) {
+ cout << "ERROR : File not found" << endl;
+ return 1;
+ }
+ catch (const Errors::PermissionDenied& ex) {
+ cout << "ERROR : Permission denied" << endl;
+ return 1;
+ }
+ catch (const Errors::IsDirectory& ex) {
+ cout << "ERROR : Is directory" << endl;
+ return 1;
+ }
+ catch (const Errors::OtherError& ex) {
+ cout << "ERROR : Other error" << endl;
+ return 1;
+ }
+ catch (const CORBA_UserException& ex)
+ {
+ cout << "ERROR : Uncaught exception" << endl;
+ return 1;
+ }
+}
diff -urN linux-2.4.1/net/korbit/modules/FileServer/client/Makefile linux-2.4.1-korbit/net/korbit/modules/FileServer/client/Makefile
--- linux-2.4.1/net/korbit/modules/FileServer/client/Makefile Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/client/Makefile Thu Feb 1 11:47:07 2001
@@ -0,0 +1,32 @@
+CC = CC -mt -pta
+OBDIR = /home/class/cs423/local
+IDL = $(OBDIR)/bin/idl
+CPPFLAGS = -I. -I$(OBDIR)/include
+LDFLAGS = -L$(OBDIR)/lib
+LIBS = -lCosNaming -lOB -lJTC -lsocket -lnsl -lposix4
+
+all: FileServer-client
+
+FileServer-client: FileServer.o FileServer-client.o
+ $(CC) $(LDFLAGS) -o FileServer-client FileServer-client.o FileServer.o $(LIBS)
+
+nameserv:
+ nameserv -i -OAport 10000
+
+FileServer.h FileServer.cpp: ../FileServer.idl
+ rm -f FileServer.cpp FileServer.h
+ rm -f FileServer_skel.h FileServer_skel.cpp
+ $(IDL) ../FileServer.idl
+
+FileServer_skel.cpp FileServer_skel.h: FileServer.cpp
+
+%.o: %.cpp
+ $(CC) $(CPPFLAGS) -c $<
+
+clean:
+ rm -f FileServer-client *.o *~
+
+realclean: clean
+ rm -f FileServer.h FileServer.cpp
+ rm -f FileServer_skel.h FileServer_skel.cpp
+ rm -rf SunWS_cache
diff -urN linux-2.4.1/net/korbit/modules/FileServer/client/README linux-2.4.1-korbit/net/korbit/modules/FileServer/client/README
--- linux-2.4.1/net/korbit/modules/FileServer/client/README Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/client/README Thu Feb 1 11:47:07 2001
@@ -0,0 +1,4 @@
+Very minimal test of the FileServer capability.
+
+ORB: Orbacus
+
diff -urN linux-2.4.1/net/korbit/modules/FileServer/server/CVS/Entries linux-2.4.1-korbit/net/korbit/modules/FileServer/server/CVS/Entries
--- linux-2.4.1/net/korbit/modules/FileServer/server/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/server/CVS/Entries Thu Feb 1 11:47:08 2001
@@ -0,0 +1,6 @@
+/FileServer-server.c/1.2/Thu Feb 1 09:47:08 2001//
+/FileServer-skelimpl.c/1.8/Thu Feb 1 09:47:08 2001//
+/Makefile/1.3/Thu Feb 1 09:47:08 2001//
+/Makefile.user/1.4/Thu Feb 1 09:47:08 2001//
+/README/1.1/Thu Feb 1 09:47:08 2001//
+D
diff -urN linux-2.4.1/net/korbit/modules/FileServer/server/CVS/Repository linux-2.4.1-korbit/net/korbit/modules/FileServer/server/CVS/Repository
--- linux-2.4.1/net/korbit/modules/FileServer/server/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/server/CVS/Repository Thu Feb 1 11:47:08 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/modules/FileServer/server
diff -urN linux-2.4.1/net/korbit/modules/FileServer/server/CVS/Root linux-2.4.1-korbit/net/korbit/modules/FileServer/server/CVS/Root
--- linux-2.4.1/net/korbit/modules/FileServer/server/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/server/CVS/Root Thu Feb 1 11:47:08 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/modules/FileServer/server/FileServer-server.c linux-2.4.1-korbit/net/korbit/modules/FileServer/server/FileServer-server.c
--- linux-2.4.1/net/korbit/modules/FileServer/server/FileServer-server.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/server/FileServer-server.c Thu Feb 1 11:47:08 2001
@@ -0,0 +1,57 @@
+#include <stdio.h>
+#include "FileServer-skelimpl.c"
+#include "korbit.h"
+
+CORBA_ORB orb;
+PortableServer_POA poa;
+CORBA_Environment *ev;
+PortableServer_ObjectId *objid;
+
+#ifdef __KERNEL__
+int __init FileServer_init(void) {
+#else
+int main(int argc, char *argv[]) {
+#endif
+ FileServer_FileSystem fs;
+ impl_POA_FileServer_FileSystem *fs_impl;
+
+ PortableServer_POAManager pm;
+#ifdef __KERNEL__
+ int argc = 1;
+ char *argv[] = { "server", 0 };
+#endif
+ ev = g_new0(CORBA_Environment,1);
+
+ CORBA_exception_init(ev);
+
+ orb = CORBA_ORB_init(&argc, argv, "orbit-local-orb", ev);
+ poa = (PortableServer_POA)
+ CORBA_ORB_resolve_initial_references(orb,
+ "RootPOA",
+ ev);
+ fs = impl_FileServer_FileSystem__create(poa, ev);
+
+ pm = PortableServer_POA__get_the_POAManager(poa, ev);
+ PortableServer_POAManager_activate(pm, ev);
+
+ fs_impl = PortableServer_POA_reference_to_servant( poa, fs, ev );
+ objid = PortableServer_POA_servant_to_id( poa, fs_impl, ev );
+
+ korbit_register_ior("FileServer-server", fs, orb, ev);
+
+ CORBA_ORB_run(orb, ev);
+
+ return 0;
+}
+
+#ifdef __KERNEL__
+void FileServer_exit(void)
+{
+ PortableServer_POA_deactivate_object(poa, objid, ev);
+ remove_proc_entry("corba/FileServer-server", 0);
+ printf("FileServer_exit()\n");
+}
+
+module_init(FileServer_init)
+module_exit(FileServer_exit)
+#endif
diff -urN linux-2.4.1/net/korbit/modules/FileServer/server/FileServer-skelimpl.c linux-2.4.1-korbit/net/korbit/modules/FileServer/server/FileServer-skelimpl.c
--- linux-2.4.1/net/korbit/modules/FileServer/server/FileServer-skelimpl.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/server/FileServer-skelimpl.c Thu Feb 1 11:47:08 2001
@@ -0,0 +1,804 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+
+#include "FileServer.h"
+
+static void set_exception(int errno, CORBA_Environment *ev)
+{
+ switch (errno)
+ {
+ case ENOENT:
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_Errors_FileNotFound,
+ Errors_FileNotFound__alloc());
+ break;
+ case EEXIST:
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_Errors_FileExists,
+ Errors_FileExists__alloc());
+ break;
+ case EACCES:
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_Errors_PermissionDenied,
+ Errors_PermissionDenied__alloc());
+ break;
+ case EISDIR:
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_Errors_IsDirectory,
+ Errors_IsDirectory__alloc());
+ break;
+ case ENOTDIR:
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_Errors_IsNotDirectory,
+ Errors_IsNotDirectory__alloc());
+ break;
+ case EROFS:
+ case ETXTBSY:
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_Errors_ReadOnlyFile,
+ Errors_ReadOnlyFile__alloc());
+ break;
+ case ELOOP:
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_Errors_RecursiveSymlink,
+ Errors_RecursiveSymlink__alloc());
+ break;
+ case EBUSY:
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_Errors_IsBusy,
+ Errors_IsBusy__alloc());
+ break;
+ default:
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_Errors_OtherError,
+ Errors_OtherError__alloc());
+ break;
+ }
+}
+
+
+/*** App-specific servant structures ***/
+typedef struct
+{
+ POA_Errors servant;
+ PortableServer_POA poa;
+
+}
+impl_POA_Errors;
+
+typedef struct
+{
+ POA_FileServer_File servant;
+ PortableServer_POA poa;
+
+ int fd;
+}
+impl_POA_FileServer_File;
+
+typedef struct
+{
+ POA_FileServer_FileSystem servant;
+ PortableServer_POA poa;
+
+}
+impl_POA_FileServer_FileSystem;
+
+/*** Implementation stub prototypes ***/
+static void impl_Errors__destroy(impl_POA_Errors * servant,
+ CORBA_Environment * ev);
+
+static void impl_FileServer_File__destroy(impl_POA_FileServer_File * servant,
+ CORBA_Environment * ev);
+static void
+impl_FileServer_File_Read(impl_POA_FileServer_File * servant,
+ CORBA_long count,
+ FileServer_buffer ** buf, CORBA_Environment * ev);
+
+static void
+impl_FileServer_File_Write(impl_POA_FileServer_File * servant,
+ FileServer_buffer * buf, CORBA_Environment * ev);
+
+static void
+impl_FileServer_File_Close(impl_POA_FileServer_File * servant,
+ CORBA_Environment * ev);
+
+static CORBA_long
+impl_FileServer_File_FileControl(impl_POA_FileServer_File * servant,
+ CORBA_long command, CORBA_Environment * ev);
+
+static FileServer_FileStatus
+impl_FileServer_File_GetStatus(impl_POA_FileServer_File * servant,
+ CORBA_Environment * ev);
+
+static void
+impl_FileServer_File_ChangeDirectoryTo(impl_POA_FileServer_File * servant,
+ CORBA_Environment * ev);
+
+static CORBA_long
+impl_FileServer_File_Seek(impl_POA_FileServer_File * servant,
+ CORBA_long Offset,
+ FileServer_File_SeekDirection Direction,
+ CORBA_Environment * ev);
+
+static FileServer_File
+impl_FileServer_File_Duplicate(impl_POA_FileServer_File * servant,
+ CORBA_Environment * ev);
+
+static void impl_FileServer_FileSystem__destroy(impl_POA_FileServer_FileSystem
+ * servant,
+
+ CORBA_Environment * ev);
+static FileServer_File
+impl_FileServer_FileSystem_Open(impl_POA_FileServer_FileSystem * servant,
+ CORBA_char * Filename, CORBA_long openFlags,
+ CORBA_short mode, CORBA_Environment * ev);
+
+static FileServer_File
+impl_FileServer_FileSystem_Create(impl_POA_FileServer_FileSystem * servant,
+ CORBA_char * Filename,
+ CORBA_short mode, CORBA_Environment * ev);
+
+static void
+impl_FileServer_FileSystem_Link(impl_POA_FileServer_FileSystem * servant,
+ CORBA_char * FromPath,
+ CORBA_char * ToPath, CORBA_Environment * ev);
+
+static void
+impl_FileServer_FileSystem_Unlink(impl_POA_FileServer_FileSystem * servant,
+ CORBA_char * Filename,
+
+ CORBA_Environment * ev);
+
+static void
+impl_FileServer_FileSystem_Rename(impl_POA_FileServer_FileSystem * servant,
+ CORBA_char * OldName,
+ CORBA_char * NewName,
+
+ CORBA_Environment * ev);
+
+static void
+impl_FileServer_FileSystem_ReadLink(impl_POA_FileServer_FileSystem * servant,
+ CORBA_char * Linkname,
+ CORBA_char ** LinkValue,
+ CORBA_Environment * ev);
+
+static FileServer_FileStatus
+impl_FileServer_FileSystem_GetStatus(impl_POA_FileServer_FileSystem * servant,
+ CORBA_char * Filename,
+ CORBA_Environment * ev);
+
+static FileServer_FileStatus
+impl_FileServer_FileSystem_GetLinkStatus(impl_POA_FileServer_FileSystem *
+ servant, CORBA_char * Filename,
+ CORBA_Environment * ev);
+
+static void
+impl_FileServer_FileSystem_MakeDirectory(impl_POA_FileServer_FileSystem *
+ servant, CORBA_char * PathName,
+ CORBA_short mode,
+ CORBA_Environment * ev);
+
+static void
+impl_FileServer_FileSystem_RemoveDirectory(impl_POA_FileServer_FileSystem *
+ servant, CORBA_char * PathName,
+ CORBA_Environment * ev);
+
+static CORBA_char
+ *impl_FileServer_FileSystem_ChangeDirectory(impl_POA_FileServer_FileSystem
+ * servant,
+ CORBA_char * PathName,
+ CORBA_Environment * ev);
+
+static void
+impl_FileServer_FileSystem_MakeNode(impl_POA_FileServer_FileSystem * servant,
+ CORBA_char * FileName,
+ CORBA_short Mode,
+ CORBA_long DeviceNum,
+
+ CORBA_Environment * ev);
+
+static void
+impl_FileServer_FileSystem_Mount(impl_POA_FileServer_FileSystem * servant,
+ CORBA_char * DeviceFile,
+ CORBA_char * Location,
+ CORBA_char * FSType,
+ CORBA_long Flags, CORBA_Environment * ev);
+
+static void
+impl_FileServer_FileSystem_Unmount(impl_POA_FileServer_FileSystem * servant,
+ CORBA_char * Filename,
+
+ CORBA_Environment * ev);
+
+/*** epv structures ***/
+static PortableServer_ServantBase__epv impl_Errors_base_epv = {
+ NULL, /* _private data */
+ NULL, /* finalize routine */
+ NULL, /* default_POA routine */
+};
+static POA_Errors__epv impl_Errors_epv = {
+ NULL, /* _private */
+
+};
+
+static PortableServer_ServantBase__epv impl_FileServer_File_base_epv = {
+ NULL, /* _private data */
+ NULL, /* finalize routine */
+ NULL, /* default_POA routine */
+};
+static POA_FileServer_File__epv impl_FileServer_File_epv = {
+ NULL, /* _private */
+ (gpointer) & impl_FileServer_File_Read,
+
+ (gpointer) & impl_FileServer_File_Write,
+
+ (gpointer) & impl_FileServer_File_Close,
+
+ (gpointer) & impl_FileServer_File_FileControl,
+
+ (gpointer) & impl_FileServer_File_GetStatus,
+
+ (gpointer) & impl_FileServer_File_ChangeDirectoryTo,
+
+ (gpointer) & impl_FileServer_File_Seek,
+
+ (gpointer) & impl_FileServer_File_Duplicate,
+
+};
+static POA_Errors__epv impl_FileServer_File_Errors_epv = {
+ NULL, /* _private */
+};
+static PortableServer_ServantBase__epv impl_FileServer_FileSystem_base_epv = {
+ NULL, /* _private data */
+ NULL, /* finalize routine */
+ NULL, /* default_POA routine */
+};
+static POA_FileServer_FileSystem__epv impl_FileServer_FileSystem_epv = {
+ NULL, /* _private */
+ (gpointer) & impl_FileServer_FileSystem_Open,
+
+ (gpointer) & impl_FileServer_FileSystem_Create,
+
+ (gpointer) & impl_FileServer_FileSystem_Link,
+
+ (gpointer) & impl_FileServer_FileSystem_Unlink,
+
+ (gpointer) & impl_FileServer_FileSystem_Rename,
+
+ (gpointer) & impl_FileServer_FileSystem_ReadLink,
+
+ (gpointer) & impl_FileServer_FileSystem_GetStatus,
+
+ (gpointer) & impl_FileServer_FileSystem_GetLinkStatus,
+
+ (gpointer) & impl_FileServer_FileSystem_MakeDirectory,
+
+ (gpointer) & impl_FileServer_FileSystem_RemoveDirectory,
+
+ (gpointer) & impl_FileServer_FileSystem_ChangeDirectory,
+
+ (gpointer) & impl_FileServer_FileSystem_MakeNode,
+
+ (gpointer) & impl_FileServer_FileSystem_Mount,
+
+ (gpointer) & impl_FileServer_FileSystem_Unmount,
+
+};
+static POA_Errors__epv impl_FileServer_FileSystem_Errors_epv = {
+ NULL, /* _private */
+};
+
+/*** vepv structures ***/
+static POA_Errors__vepv impl_Errors_vepv = {
+ &impl_Errors_base_epv,
+ &impl_Errors_epv,
+};
+
+static POA_FileServer_File__vepv impl_FileServer_File_vepv = {
+ &impl_FileServer_File_base_epv,
+ &impl_FileServer_File_Errors_epv,
+ &impl_FileServer_File_epv,
+};
+static POA_FileServer_FileSystem__vepv impl_FileServer_FileSystem_vepv = {
+ &impl_FileServer_FileSystem_base_epv,
+ &impl_FileServer_FileSystem_Errors_epv,
+ &impl_FileServer_FileSystem_epv,
+};
+
+/*** Stub implementations ***/
+static Errors
+impl_Errors__create(PortableServer_POA poa, CORBA_Environment * ev)
+{
+ Errors retval;
+ impl_POA_Errors *newservant;
+ PortableServer_ObjectId *objid;
+
+ newservant = g_new0(impl_POA_Errors, 1);
+ newservant->servant.vepv = &impl_Errors_vepv;
+ newservant->poa = poa;
+ POA_Errors__init((PortableServer_Servant) newservant, ev);
+ objid = PortableServer_POA_activate_object(poa, newservant, ev);
+ CORBA_free(objid);
+ retval = PortableServer_POA_servant_to_reference(poa, newservant, ev);
+
+ return retval;
+}
+
+static void
+impl_Errors__destroy(impl_POA_Errors * servant, CORBA_Environment * ev)
+{
+ PortableServer_ObjectId *objid;
+
+ objid = PortableServer_POA_servant_to_id(servant->poa, servant, ev);
+ PortableServer_POA_deactivate_object(servant->poa, objid, ev);
+ CORBA_free(objid);
+
+ POA_Errors__fini((PortableServer_Servant) servant, ev);
+ g_free(servant);
+}
+
+static FileServer_File
+impl_FileServer_File__create(PortableServer_POA poa, CORBA_Environment * ev)
+{
+ FileServer_File retval;
+ impl_POA_FileServer_File *newservant;
+ PortableServer_ObjectId *objid;
+
+ newservant = g_new0(impl_POA_FileServer_File, 1);
+ newservant->servant.vepv = &impl_FileServer_File_vepv;
+ newservant->poa = poa;
+ newservant->fd = -1;
+
+ POA_FileServer_File__init((PortableServer_Servant) newservant, ev);
+ objid = PortableServer_POA_activate_object(poa, newservant, ev);
+ CORBA_free(objid);
+ retval = PortableServer_POA_servant_to_reference(poa, newservant, ev);
+
+ return retval;
+}
+
+static void
+impl_FileServer_File__destroy(impl_POA_FileServer_File * servant,
+ CORBA_Environment * ev)
+{
+ PortableServer_ObjectId *objid;
+
+ objid = PortableServer_POA_servant_to_id(servant->poa, servant, ev);
+ PortableServer_POA_deactivate_object(servant->poa, objid, ev);
+ CORBA_free(objid);
+
+ POA_FileServer_File__fini((PortableServer_Servant) servant, ev);
+ g_free(servant);
+}
+
+static void
+impl_FileServer_File_Read(impl_POA_FileServer_File * servant,
+ CORBA_long count,
+ FileServer_buffer ** buf, CORBA_Environment * ev)
+{
+ size_t num_read;
+
+ *buf = FileServer_buffer__alloc();
+ (*buf)->_maximum = count;
+ (*buf)->_buffer = CORBA_octet_allocbuf(count);
+ (*buf)->_length = 0;
+
+ printf("File->Read(%d, char *buf)\n", count);
+
+ if (servant->fd == -1) /* Trying to read from a closed file */
+ {
+ printf("File->Read ERROR : fd == -1\n");
+ set_exception(EBADF, ev);
+ return;
+ }
+
+ num_read = read(servant->fd, (*buf)->_buffer, count);
+ if (num_read == -1)
+ {
+ printf("File->Read ERROR : %d\n", errno);
+ set_exception(errno, ev);
+ return;
+ }
+
+ (*buf)->_length = num_read;
+}
+
+static void
+impl_FileServer_File_Write(impl_POA_FileServer_File * servant,
+ FileServer_buffer * buf, CORBA_Environment * ev)
+{
+ printf("UNIMP: FileServer::File::Write called and unimplemented\n");
+}
+
+static void
+impl_FileServer_File_Close(impl_POA_FileServer_File * servant,
+ CORBA_Environment * ev)
+{
+ printf("File->Close()\n");
+
+ if (servant->fd == -1) /* This should never happen !?! */
+ {
+ printf("File->Close ERROR : fd == -1\n");
+ set_exception(EBADF, ev);
+ return;
+ }
+
+ close(servant->fd);
+ servant->fd = 0;
+ impl_FileServer_File__destroy(servant, ev);
+}
+
+static CORBA_long
+impl_FileServer_File_FileControl(impl_POA_FileServer_File * servant,
+ CORBA_long command, CORBA_Environment * ev)
+{
+ CORBA_long retval;
+
+ if (servant->fd == -1)
+ {
+ printf("File->FileControl ERROR : fd == -1\n");
+ set_exception(EBADF, ev);
+ return -1;
+ }
+
+ retval = fcntl(servant->fd, command, 0); /* FIXME arg? */
+ if (retval == -1)
+ {
+ printf("File->FileControl ERROR : %d\n", errno);
+ set_exception(errno, ev);
+ }
+
+ return retval;
+}
+
+
+FileServer_FileStatus
+stat2FileStatus(struct stat buf)
+{
+ FileServer_FileStatus retval;
+
+ retval.DeviceNum = buf.st_dev;
+ retval.InodeNum = buf.st_ino;
+ retval.Mode = buf.st_mode;
+ retval.NumLinks = buf.st_nlink;
+ retval.UserID = buf.st_uid;
+ retval.GroupID = buf.st_gid;
+ retval.DeviceType = buf.st_rdev;
+ retval.Size = buf.st_size;
+ retval.BlockSize = buf.st_blksize;
+ retval.NumBlocks = buf.st_blocks;
+ retval.AccessTime = buf.st_atime;
+ retval.ModifiedTime = buf.st_mtime;
+ retval.ChangeTime = buf.st_ctime;
+
+ return retval;
+}
+
+
+static FileServer_FileStatus
+impl_FileServer_File_GetStatus(impl_POA_FileServer_File * servant,
+ CORBA_Environment * ev)
+{
+ FileServer_FileStatus retval;
+
+ struct stat buf;
+ int res;
+
+ if (servant->fd == -1)
+ {
+ printf("File->GetStatus ERROR : fd == -1\n");
+ set_exception(EBADF, ev);
+ return retval;
+ }
+
+ res = fstat(servant->fd, &buf);
+ if (res == -1)
+ {
+ printf("File->GetStatus ERROR : %d\n", errno);
+ set_exception(errno, ev);
+ return retval;
+ }
+
+ retval = stat2FileStatus(buf);
+
+ return retval;
+}
+
+static void
+impl_FileServer_File_ChangeDirectoryTo(impl_POA_FileServer_File * servant,
+ CORBA_Environment * ev)
+{
+ printf("UNIMP: impl_FileServer_File_ChangeDirectoryTo\n");
+}
+
+static CORBA_long
+impl_FileServer_File_Seek(impl_POA_FileServer_File * servant,
+ CORBA_long Offset,
+ FileServer_File_SeekDirection Direction,
+ CORBA_Environment * ev)
+{
+ CORBA_long retval = -1;
+ int whence;
+
+ if (servant->fd == -1)
+ {
+ printf("File->Seek ERROR : fd == -1\n");
+ set_exception(EBADF, ev);
+ return retval;
+ }
+
+ switch (Direction)
+ {
+ case FileServer_File_FromStart :
+ whence = SEEK_SET;
+ break;
+ case FileServer_File_FromCurrent :
+ whence = SEEK_CUR;
+ break;
+ case FileServer_File_FromEnd :
+ whence = SEEK_END;
+ break;
+ default :
+ set_exception(EINVAL, ev);
+ return retval;
+ }
+
+ retval = lseek(servant->fd, Offset, whence);
+ if (retval == -1)
+ {
+ printf("File->Seek ERROR : %d\n", errno);
+ set_exception(errno, ev);
+ }
+
+ return retval;
+}
+
+static FileServer_File
+impl_FileServer_File_Duplicate(impl_POA_FileServer_File * servant,
+ CORBA_Environment * ev)
+{
+ FileServer_File retval;
+ printf("UNIMP: impl_FileServer_File_Duplicate\n");
+ return retval;
+}
+
+static FileServer_FileSystem
+impl_FileServer_FileSystem__create(PortableServer_POA poa,
+ CORBA_Environment * ev)
+{
+ FileServer_FileSystem retval;
+ impl_POA_FileServer_FileSystem *newservant;
+ PortableServer_ObjectId *objid;
+
+ newservant = g_new0(impl_POA_FileServer_FileSystem, 1);
+ newservant->servant.vepv = &impl_FileServer_FileSystem_vepv;
+ newservant->poa = poa;
+ POA_FileServer_FileSystem__init((PortableServer_Servant) newservant, ev);
+ objid = PortableServer_POA_activate_object(poa, newservant, ev);
+ CORBA_free(objid);
+ retval = PortableServer_POA_servant_to_reference(poa, newservant, ev);
+
+ return retval;
+}
+
+static void
+impl_FileServer_FileSystem__destroy(impl_POA_FileServer_FileSystem * servant,
+ CORBA_Environment * ev)
+{
+ PortableServer_ObjectId *objid;
+
+ objid = PortableServer_POA_servant_to_id(servant->poa, servant, ev);
+ PortableServer_POA_deactivate_object(servant->poa, objid, ev);
+ CORBA_free(objid);
+
+ POA_FileServer_FileSystem__fini((PortableServer_Servant) servant, ev);
+ g_free(servant);
+}
+
+static FileServer_File
+impl_FileServer_FileSystem_Open(impl_POA_FileServer_FileSystem * servant,
+ CORBA_char * Filename,
+ CORBA_long openFlags,
+ CORBA_short mode, CORBA_Environment * ev)
+{
+ FileServer_File retval = CORBA_OBJECT_NIL;
+
+ impl_POA_FileServer_File *file;
+
+ printf("FileSystem->Open(%s,%x)\n", Filename, openFlags);
+
+ retval = impl_FileServer_File__create(servant->poa, ev);
+
+ file = PortableServer_POA_reference_to_servant( servant->poa, retval, ev );
+ file->fd = open(Filename, openFlags, mode);
+
+ if (file->fd == -1) {
+ printf("FileSystem->Open ERROR : %d\n", errno);
+ set_exception(errno, ev);
+ }
+
+ return retval;
+}
+
+static FileServer_File
+impl_FileServer_FileSystem_Create(impl_POA_FileServer_FileSystem * servant,
+ CORBA_char * Filename,
+ CORBA_short mode, CORBA_Environment * ev)
+{
+ FileServer_File retval = CORBA_OBJECT_NIL;
+
+ impl_POA_FileServer_File *file;
+
+ printf("FileSystem->Create(%s,%x)\n", Filename, mode);
+
+ retval = impl_FileServer_File__create(servant->poa, ev);
+
+ file = PortableServer_POA_reference_to_servant( servant->poa, retval, ev );
+ file->fd = creat(Filename, mode);
+
+ if (file->fd == -1) {
+ printf("FileSystem->Create ERROR : %d\n", errno);
+ set_exception(errno, ev);
+ }
+
+ return retval;
+}
+
+static void
+impl_FileServer_FileSystem_Link(impl_POA_FileServer_FileSystem * servant,
+ CORBA_char * FromPath,
+ CORBA_char * ToPath, CORBA_Environment * ev)
+{
+ printf("UNIMP: impl_FileServer_FileSystem_Link\n");
+}
+
+static void
+impl_FileServer_FileSystem_Unlink(impl_POA_FileServer_FileSystem * servant,
+ CORBA_char * Filename,
+ CORBA_Environment * ev)
+{
+ printf("UNIMP: impl_FileServer_FileSystem_Unlink\n");
+}
+
+static void
+impl_FileServer_FileSystem_Rename(impl_POA_FileServer_FileSystem * servant,
+ CORBA_char * OldName,
+ CORBA_char * NewName,
+ CORBA_Environment * ev)
+{
+ printf("UNIMP: impl_FileServer_FileSystem_Rename\n");
+}
+
+static void
+impl_FileServer_FileSystem_ReadLink(impl_POA_FileServer_FileSystem * servant,
+ CORBA_char * Linkname,
+ CORBA_char ** LinkValue,
+ CORBA_Environment * ev)
+{
+ char tmp[PATH_MAX + 1];
+ int res, len;
+
+ printf("FileSystem->ReadLink(%s, value)\n", Linkname);
+
+ res = readlink(Linkname, tmp, PATH_MAX);
+ if (res == -1)
+ {
+ set_exception(errno, ev);
+ return;
+ }
+
+ len = strlen(tmp);
+ *LinkValue = (char *)malloc(len * sizeof(char));
+ memcpy(*LinkValue, tmp, len);
+ (*LinkValue)[len] = '\0';
+}
+
+static FileServer_FileStatus
+impl_FileServer_FileSystem_GetStatus(impl_POA_FileServer_FileSystem * servant,
+ CORBA_char * Filename,
+ CORBA_Environment * ev)
+{
+ FileServer_FileStatus retval;
+ struct stat buf;
+ int res;
+
+ printf("FileSystem->GetStatus(%s)\n", Filename);
+
+ res = stat(Filename, &buf);
+
+ if (res == -1)
+ {
+ printf("FileSystem->GetStatus(%s)\n", Filename);
+ set_exception(errno, ev);
+ return retval;
+ }
+
+ retval = stat2FileStatus(buf);
+
+ return retval;
+}
+
+static FileServer_FileStatus
+impl_FileServer_FileSystem_GetLinkStatus(impl_POA_FileServer_FileSystem *
+ servant, CORBA_char * Filename,
+ CORBA_Environment * ev)
+{
+ FileServer_FileStatus retval;
+ struct stat buf;
+ int res;
+
+ printf("FileSystem->GetLinkStatus(%s)\n", Filename);
+
+ res = lstat(Filename, &buf);
+
+ if (res == -1)
+ {
+ printf("FileSystem->GetLinkStatus(%s)\n", Filename);
+ set_exception(errno, ev);
+ return retval;
+ }
+
+ retval = stat2FileStatus(buf);
+
+ return retval;
+}
+
+static void
+impl_FileServer_FileSystem_MakeDirectory(impl_POA_FileServer_FileSystem *
+ servant, CORBA_char * PathName,
+ CORBA_short mode,
+ CORBA_Environment * ev)
+{
+ printf("UNIMP: impl_FileServer_FileSystem_MakeDirectory\n");
+}
+
+static void
+impl_FileServer_FileSystem_RemoveDirectory(impl_POA_FileServer_FileSystem *
+ servant, CORBA_char * PathName,
+ CORBA_Environment * ev)
+{
+ printf("UNIMP: impl_FileServer_FileSystem_RemoveDirectory\n");
+}
+
+static CORBA_char *
+impl_FileServer_FileSystem_ChangeDirectory(impl_POA_FileServer_FileSystem *
+ servant, CORBA_char * PathName,
+ CORBA_Environment * ev)
+{
+ CORBA_char *retval;
+ printf("UNIMP: impl_FileServer_FileSystem_ChangeDirectory\n");
+ return retval;
+}
+
+static void
+impl_FileServer_FileSystem_MakeNode(impl_POA_FileServer_FileSystem * servant,
+ CORBA_char * FileName,
+ CORBA_short Mode,
+ CORBA_long DeviceNum,
+ CORBA_Environment * ev)
+{
+ printf("UNIMP: impl_FileServer_FileSystem_MakeNode\n");
+}
+
+static void
+impl_FileServer_FileSystem_Mount(impl_POA_FileServer_FileSystem * servant,
+ CORBA_char * DeviceFile,
+ CORBA_char * Location,
+ CORBA_char * FSType,
+ CORBA_long Flags, CORBA_Environment * ev)
+{
+ printf("UNIMP: impl_FileServer_FileSystem_Mount: ARE YOU CRAZY!?!?\n");
+}
+
+static void
+impl_FileServer_FileSystem_Unmount(impl_POA_FileServer_FileSystem * servant,
+ CORBA_char * Filename,
+ CORBA_Environment * ev)
+{
+ printf("UNIMP: impl_FileServer_FileSystem_Unmount: Ha ha ha funny guy!\n");
+}
diff -urN linux-2.4.1/net/korbit/modules/FileServer/server/Makefile linux-2.4.1-korbit/net/korbit/modules/FileServer/server/Makefile
--- linux-2.4.1/net/korbit/modules/FileServer/server/Makefile Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/server/Makefile Thu Feb 1 11:47:08 2001
@@ -0,0 +1,20 @@
+#
+# Makefile for KORBit / FileServer
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
+# Note 2! The CFLAGS definition is now in the main makefile...
+
+O_TARGET := corba-fileserver-server.o
+
+obj-y := FileServer-common.o FileServer-skels.o FileServer-server.o
+obj-m := $(O_TARGET)
+
+include ../../Makefile.module
+
+FileServer-server.c: FileServer.h FileServer-common.c FileServer-skels.c FileServer-skelimpl.c
+
+FileServer.h FileServer-skels.c FileServer-common.c: ../FileServer.idl
+ $(ORBIT_IDL) ../FileServer.idl
diff -urN linux-2.4.1/net/korbit/modules/FileServer/server/Makefile.user linux-2.4.1-korbit/net/korbit/modules/FileServer/server/Makefile.user
--- linux-2.4.1/net/korbit/modules/FileServer/server/Makefile.user Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/server/Makefile.user Thu Feb 1 11:47:08 2001
@@ -0,0 +1,32 @@
+#
+# Makefile for KORBit
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
+# Note 2! The CFLAGS definition is now in the main makefile...
+
+PROJECT = FileServer
+
+CFLAGS = -Wall `orbit-config --cflags server` -I../../..
+LDFLAGS = `orbit-config --libs server`
+OBJS = $(PROJECT)-common.o $(PROJECT)-skels.o $(PROJECT)-server.o
+ORBIT-IDL = orbit-idl
+
+$(PROJECT)-server: $(OBJS)
+ gcc -o $(PROJECT)-server $(OBJS) $(LDFLAGS)
+
+$(PROJECT)-server.c: $(PROJECT).h $(PROJECT)-skelimpl.c
+
+$(PROJECT).h $(PROJECT)-common.c $(PROJECT)-skels.c $(PROJECT)-skelimpl.c: ../$(PROJECT).idl
+ $(ORBIT-IDL) --nostubs ../$(PROJECT).idl
+
+clean:
+ rm -f $(OBJS) $(PROJECT)-server
+
+realclean: clean
+ rm -f $(PROJECT).h
+ rm -f $(PROJECT)-common.c
+ rm -f $(PROJECT)-skels.c
+ rm -f *~
diff -urN linux-2.4.1/net/korbit/modules/FileServer/server/README linux-2.4.1-korbit/net/korbit/modules/FileServer/server/README
--- linux-2.4.1/net/korbit/modules/FileServer/server/README Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/server/README Thu Feb 1 11:47:08 2001
@@ -0,0 +1,4 @@
+Kernel side implementation of the file server functionality.
+
+ORB: kORBit
+Status: Mostly unimplemented.
diff -urN linux-2.4.1/net/korbit/modules/FileServer/server-user/CVS/Entries linux-2.4.1-korbit/net/korbit/modules/FileServer/server-user/CVS/Entries
--- linux-2.4.1/net/korbit/modules/FileServer/server-user/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/server-user/CVS/Entries Thu Feb 1 11:47:08 2001
@@ -0,0 +1,4 @@
+/FileServer-server.c/1.1/Thu Feb 1 09:47:08 2001//
+/Makefile/1.1/Thu Feb 1 09:47:08 2001//
+/README/1.1/Thu Feb 1 09:47:08 2001//
+D
diff -urN linux-2.4.1/net/korbit/modules/FileServer/server-user/CVS/Repository linux-2.4.1-korbit/net/korbit/modules/FileServer/server-user/CVS/Repository
--- linux-2.4.1/net/korbit/modules/FileServer/server-user/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/server-user/CVS/Repository Thu Feb 1 11:47:08 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/modules/FileServer/server-user
diff -urN linux-2.4.1/net/korbit/modules/FileServer/server-user/CVS/Root linux-2.4.1-korbit/net/korbit/modules/FileServer/server-user/CVS/Root
--- linux-2.4.1/net/korbit/modules/FileServer/server-user/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/server-user/CVS/Root Thu Feb 1 11:47:08 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/modules/FileServer/server-user/FileServer-server.c linux-2.4.1-korbit/net/korbit/modules/FileServer/server-user/FileServer-server.c
--- linux-2.4.1/net/korbit/modules/FileServer/server-user/FileServer-server.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/server-user/FileServer-server.c Thu Feb 1 11:47:08 2001
@@ -0,0 +1,234 @@
+#include <OB/CORBA.h>
+#include <OB/Util.h>
+#include <OB/CosNaming.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+
+#include "FileServer_skel.h"
+
+static void ThrowErr() {
+ switch (errno) {
+ case 0: return;
+ case EISDIR:
+ throw Errors::IsDirectory();
+ case EPERM:
+ throw Errors::PermissionDenied();
+ case EEXIST:
+ throw Errors::FileExists();
+ case ENOENT:
+ throw Errors::FileNotFound();
+ case ENOTDIR:
+ throw Errors::IsNotDirectory();
+ case EROFS:
+ case ETXTBSY:
+ throw Errors::ReadOnlyFile();
+ case ELOOP:
+ throw Errors::RecursiveSymlink();
+ case EBUSY:
+ throw Errors::IsBusy();
+ default:
+ throw Errors::OtherError();
+ }
+}
+
+
+class FileServer_File_impl : public FileServer_File_skel {
+ int FD;
+ public:
+ FileServer_File_impl(int fd) { FD = fd; }
+
+ virtual void Read(CORBA_Long count, FileServer_buffer*& buf) {
+ errno = 0;
+ cout << "Read\n";
+ buf = new FileServer_buffer();
+ ThrowErr();
+ }
+
+ virtual void Write(const FileServer_buffer& buf) {
+ errno = 0;
+ cout << "Write\n";
+ ThrowErr();
+ }
+
+ virtual void Close() {
+ errno = 0;
+ close(FD);
+ cout << "Close()\n";
+ ThrowErr();
+ }
+
+ virtual CORBA_Long FileControl(CORBA_Long command) {
+ errno = 0;
+ cout << "filecontrol\n";
+ ThrowErr();
+ return 0;
+ }
+
+ virtual FileServer_FileStatus GetStatus() {
+ errno = 0;
+ cout << "stat\n";
+ FileServer_FileStatus Stat;
+ ThrowErr();
+ return Stat;
+ }
+
+ virtual void ChangeDirectoryTo() {
+ errno = 0;
+ cout << "ChangeDirectoryTo()\n";
+ ThrowErr();
+ }
+
+ virtual CORBA_Long Seek(CORBA_Long Offset, SeekDirection Direction) {
+ errno = 0;
+ cout << "Seek(" << Offset << ")\n";
+ ThrowErr();
+ return -1;
+ }
+
+ virtual FileServer_File_ptr Duplicate() {
+ errno = 0;
+ cout << "Duplicate!\n";
+ ThrowErr();
+ return 0;
+ }
+};
+
+
+class FileServer_impl : public FileServer_FileSystem_skel {
+ public :
+ virtual FileServer_File_ptr Open(const char* Filename,
+ CORBA_Long openFlags,
+ CORBA_Short mode) {
+ errno = 0;
+ int fd = open(Filename, openFlags, mode);
+ if (fd != -1) return new FileServer_File_impl(fd);
+ cout << "open\n";
+ ThrowErr();
+ return 0;
+ }
+
+ virtual FileServer_File_ptr Create(const char* Filename,
+ CORBA_Short mode) {
+ errno = 0;
+ cout << "create\n";
+ ThrowErr();
+ return 0;
+ }
+
+
+ virtual void Link(const char* FromPath,
+ const char* ToPath) {
+ errno = 0;
+ cout << "link\n";
+ ThrowErr();
+ }
+
+ virtual void Unlink(const char* Filename) {
+ errno = 0;
+ cout << "unlink\n";
+ ThrowErr();
+ }
+
+ virtual void Rename(const char* OldName,
+ const char* NewName) {
+ errno = 0;
+ cout << "rename\n";
+ ThrowErr();
+ }
+
+
+ virtual void ReadLink(const char* Linkname,
+ char*& LinkValue) {
+ errno = 0;
+ cout << "readlink\n";
+ ThrowErr();
+ }
+
+ virtual FileServer_FileStatus GetStatus(const char* Filename) {
+ errno = 0;
+ cout << "stat\n";
+ FileServer_FileStatus Stat;
+ ThrowErr();
+ return Stat;
+ }
+
+
+ virtual FileServer_FileStatus GetLinkStatus(const char* Filename) {
+ errno = 0;
+ cout << "lstat\n";
+ FileServer_FileStatus Stat;
+ ThrowErr();
+ return Stat;
+ }
+
+
+ virtual void MakeDirectory(const char* PathName,
+ CORBA_Short mode) {
+ errno = 0;
+ cout << "mkdir\n";
+ ThrowErr();
+ }
+
+ virtual void RemoveDirectory(const char* PathName) {
+ errno = 0;
+ cout << "rmdir\n";
+ ThrowErr();
+ }
+
+
+ virtual char* ChangeDirectory(const char* PathName) {
+ errno = 0;
+ cout << "chdir\n";
+ ThrowErr();
+ return CORBA_string_dup("hello");
+ }
+
+ virtual void MakeNode(const char* FileName,
+ CORBA_Short Mode,
+ CORBA_Long DeviceNum) {
+ errno = 0;
+ cout << "mknod\n";
+ ThrowErr();
+ }
+
+
+ virtual void Mount(const char* DeviceFile,
+ const char* Location,
+ const char* FSType,
+ CORBA_Long Flags) {
+ errno = 0;
+ cout << "Mount\n";
+ ThrowErr();
+ }
+
+ virtual void Unmount(const char* Filename) {
+ errno = 0;
+ cout << "Unmount\n";
+ ThrowErr();
+ }
+};
+
+
+int main(int argc, char* argv[]) {
+ cout << "FileServer UserSpace Server initializing" << endl;
+
+ try {
+ CORBA_ORB_var orb = CORBA_ORB_init(argc, argv);
+ CORBA_BOA_var boa = orb->BOA_init(argc, argv);
+
+ FileServer_FileSystem_var FS = new FileServer_impl();
+
+ cout << orb->object_to_string(FS) << endl;
+
+ //
+ // Run implementation
+ //
+ boa -> impl_is_ready(CORBA_ImplementationDef::_nil());
+ } catch(CORBA_SystemException& ex) {
+ OBPrintException(ex);
+ return 1;
+ }
+}
diff -urN linux-2.4.1/net/korbit/modules/FileServer/server-user/Makefile linux-2.4.1-korbit/net/korbit/modules/FileServer/server-user/Makefile
--- linux-2.4.1/net/korbit/modules/FileServer/server-user/Makefile Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/server-user/Makefile Thu Feb 1 11:47:08 2001
@@ -0,0 +1,29 @@
+CC = CC -mt -pta
+OBDIR = /home/class/cs423/local
+IDL = $(OBDIR)/bin/idl
+CPPFLAGS = -I. -I$(OBDIR)/include
+LDFLAGS = -L$(OBDIR)/lib
+LIBS = -lCosNaming -lOB -lJTC -lsocket -lnsl -lposix4
+
+all: FileServer
+
+FileServer: FileServer.o FileServer-server.o FileServer_skel.o
+ $(CC) $(LDFLAGS) -o FileServer FileServer-server.o FileServer.o FileServer_skel.o $(LIBS)
+
+FileServer.h FileServer.cpp: ../FileServer.idl
+ rm -f FileServer.cpp FileServer.h
+ rm -f FileServer_skel.h FileServer_skel.cpp
+ $(IDL) ../FileServer.idl
+
+FileServer_skel.cpp FileServer_skel.h: FileServer.cpp
+
+%.o: %.cpp
+ $(CC) $(CPPFLAGS) -c $<
+
+clean:
+ rm -f FileServer *.o *~
+
+realclean: clean
+ rm -f FileServer.h FileServer.cpp
+ rm -f FileServer_skel.h FileServer_skel.cpp
+ rm -rf SunWS_cache
diff -urN linux-2.4.1/net/korbit/modules/FileServer/server-user/README linux-2.4.1-korbit/net/korbit/modules/FileServer/server-user/README
--- linux-2.4.1/net/korbit/modules/FileServer/server-user/README Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/server-user/README Thu Feb 1 11:47:08 2001
@@ -0,0 +1 @@
+This is a user space implementation of the FileServer interface.
diff -urN linux-2.4.1/net/korbit/modules/FileServer/wrapper/CVS/Entries linux-2.4.1-korbit/net/korbit/modules/FileServer/wrapper/CVS/Entries
--- linux-2.4.1/net/korbit/modules/FileServer/wrapper/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/wrapper/CVS/Entries Thu Feb 1 11:47:09 2001
@@ -0,0 +1,6 @@
+/FileServer_wrapper.cpp/1.2/Thu Feb 1 09:47:09 2001//
+/FileServer_wrapper.h/1.2/Thu Feb 1 09:47:09 2001//
+/Makefile/1.1/Thu Feb 1 09:47:09 2001//
+/README/1.1/Thu Feb 1 09:47:09 2001//
+/test.c/1.2/Thu Feb 1 09:47:09 2001//
+D
diff -urN linux-2.4.1/net/korbit/modules/FileServer/wrapper/CVS/Repository linux-2.4.1-korbit/net/korbit/modules/FileServer/wrapper/CVS/Repository
--- linux-2.4.1/net/korbit/modules/FileServer/wrapper/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/wrapper/CVS/Repository Thu Feb 1 11:47:09 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/modules/FileServer/wrapper
diff -urN linux-2.4.1/net/korbit/modules/FileServer/wrapper/CVS/Root linux-2.4.1-korbit/net/korbit/modules/FileServer/wrapper/CVS/Root
--- linux-2.4.1/net/korbit/modules/FileServer/wrapper/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/wrapper/CVS/Root Thu Feb 1 11:47:09 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/modules/FileServer/wrapper/FileServer_wrapper.cpp linux-2.4.1-korbit/net/korbit/modules/FileServer/wrapper/FileServer_wrapper.cpp
--- linux-2.4.1/net/korbit/modules/FileServer/wrapper/FileServer_wrapper.cpp Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/wrapper/FileServer_wrapper.cpp Thu Feb 1 11:47:09 2001
@@ -0,0 +1,135 @@
+/*
+ * FileServer_wrapper.cpp
+ *
+ * We want to intercept *all* file I/O, so that once the LD_PRELOAD
+ * variable is set, everything you see is on the remote side.
+ *
+ * Needed environment variables:
+ * LD_PRELOAD - duh (what's the lib name?)
+ * KORBIT_IOR - IOR of the file servin' ORB to connect to.
+ *
+ */
+
+#include <stdio.h>
+#include <dlfcn.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <dirent.h>
+#include <errno.h>
+
+#include "OB/CORBA.h"
+//#include "OB/Util.h"
+//#include "OB/CosNaming.h"
+
+#include "FileServer.h"
+#include "FileServer_wrapper.h"
+
+#define DEBUG
+
+#ifdef DEBUG
+#define debugOut(X) cerr << X << flush;
+#else
+#define debugOut(X)
+#endif
+
+
+FileSystemState::FileSystemState() {
+ char *argv[] = { (char*)"/usr/bin/mkdir", 0 };
+ int argc = 1;
+
+ debugOut ("FS_wrapper: InitializeOrb(): start.\n");
+
+ /* Set 'PerformingInitialization = true'? */
+
+ orb = CORBA_ORB_init(argc, argv);
+ if (CORBA_is_nil(orb)) {
+ cerr << "Error initializing ORB!\n";
+ exit(1);
+ }
+ debugOut ("\tORB initialized successfully.\n");
+
+ const char *env = getenv("KORBIT_IOR");
+ if (!env) {
+ // This should check /proc/corba/FileServer-server also!
+ cerr << "InitializeOrb Error: KORBIT_IOR not found in environment!\n";
+ exit(1);
+ }
+
+ cout << "IOR = " << env << endl;
+
+ // WHY DO I HANG IN string_to_object??
+ CORBA_Object_var obj = orb->string_to_object(env);
+ debugOut("\tORB initialized successfully.\n");
+
+ if (CORBA_is_nil(obj)) {
+ cerr << "InitializeOrb Error: IOR is invalid: " << env << endl;
+ exit (1);
+ }
+
+ debugOut ("\tORB initialized successfully.\n");
+ try {
+ FS = FileServer_FileSystem::_narrow(obj);
+ } catch (...) {
+ cerr << "InitializeOrb Error: Got an exception from _narrow().\n";
+ exit (1);
+ }
+
+ /* Initialize my data structure 'o file descriptors. */
+
+ // Set up mapping for stdin, stdout, stderr. Set up a new fd, #4 for
+ // console/debug output
+
+ // stderr can go to console for now.
+
+ debugOut ("FS_wrapper: InitializeOrb(): finished successfully.\n");
+} /* End InitializeOrb(). */
+
+
+FileSystemState::~FileSystemState() (void) {
+} /* End CleanupOrb(). */
+
+
+void HandleException(CORBA_UserException &Exception) {
+ try {
+ throw Exception; // get the type back...
+ } catch (Errors::FileExists &) {
+ errno = EEXIST;
+ } catch (Errors::PermissionDenied &) {
+ errno = EACCES;
+ } catch (Errors::FileNotFound &) {
+ errno = ENOENT;
+ } catch (Errors::IsNotDirectory &) {
+ errno = ENOTDIR;
+ } catch (Errors::ReadOnlyFile &) {
+ errno = EROFS;
+ } catch (Errors::RecursiveSymlink &) {
+ errno = ELOOP;
+ } catch (Errors::OtherError &) {
+ errno = EIO; /* I/O error */
+ } catch (CORBA_UserException &Exception) {
+ cerr << "unknown exception occurred! \n";
+ }
+}
+
+//int open(const char *path, int oflag, mode_t mode) {
+
+
+// return -1;
+//}
+
+int mkdir(const char *pathname, mode_t mode) {
+ debugOut("FS_wrapper: mkdir(" << pathname << "): start.\n");
+
+ try {
+ FileSystemState::get().getFS()->MakeDirectory(pathname, mode);
+ } catch (CORBA_UserException &ex) {
+ HandleException(ex);
+ return -1;
+ }
+
+ // Success!
+ debugOut("FS wrapper: mkdir(): finish successfully.\n");
+ return 0;
+} // End mkdir()
+
diff -urN linux-2.4.1/net/korbit/modules/FileServer/wrapper/FileServer_wrapper.h linux-2.4.1-korbit/net/korbit/modules/FileServer/wrapper/FileServer_wrapper.h
--- linux-2.4.1/net/korbit/modules/FileServer/wrapper/FileServer_wrapper.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/wrapper/FileServer_wrapper.h Thu Feb 1 11:47:09 2001
@@ -0,0 +1,81 @@
+// The KORBit FileServer wrapper, which is a shared library that gets
+// hit with the LD_PRELOAD action, so as to redirect all FS calls
+// out the CORBA hole.
+//
+// Note that most of these functions have the side effect of modifying errno.
+//
+#ifndef FILESERVER_WRAPPER_H
+#define FILESERVER_WRAPPER_H
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+// This class contains all the global variables for this file. It is very
+// important that we use this mechanism so that our library is initialized as
+// early as possible, but no earlier. In particular this means that we cannot
+// be initialized before iostreams are, which we use for debugging. This scheme
+// the only way to that we are constructed and descructed on demand.
+//
+class FileSystemState {
+private:
+ FileSystemState(); // private ctor/dtor. The only way to get one of these is
+ ~FileSystemState(); // to call FileSystemState::get()
+
+ FileSystemState(const FileSystemState &); // do not implement
+ FileSystemState &operator=(const FileSystemState &); // do not implement
+
+
+ CORBA_ORB_var orb; // Global reference to the orb.
+ FileServer_FileSystem_var FS; // Global reference to FS object...
+public:
+ static FileSystemState &get() {
+ // Static objects like this are intialized the first time they are used, and
+ // destroyed when the project shuts down. This is exactly the semantics we
+ // want.
+ static FileSystemState FSS;
+ return FSS;
+ }
+
+ CORBA_ORB_var getORB() { return orb; }
+ FileServer_FileSystem_var getFS() { return FS; }
+};
+
+extern "C" {
+
+ //
+ // interface File
+ //
+ // pread, readv, pwrite, writev
+ int read(int FD, void *Buffer, size_t NumBytes);
+ int write(int FD, void *Buffer, size_t NumBytes);
+ int close(int FD);
+ // fcntl
+ // fstat
+ // fchdir
+ // seek
+ int dup(int FD);
+ int dup2(int FDFrom, int FDTo);
+
+ //
+ // interface FileSystem
+ //
+ // int open(const char *path, int oflag, mode_t mode);
+ int creat(const char *path, mode_t mode);
+
+// link
+// unlink
+// rename
+// readlink
+// stat
+// lstat
+ int mkdir(const char *Path, mode_t Mode);
+// rmdir
+ int chdir(const char *Path);
+}
+
+//
+// Local function prototypes.
+//
+
+#endif
diff -urN linux-2.4.1/net/korbit/modules/FileServer/wrapper/Makefile linux-2.4.1-korbit/net/korbit/modules/FileServer/wrapper/Makefile
--- linux-2.4.1/net/korbit/modules/FileServer/wrapper/Makefile Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/wrapper/Makefile Thu Feb 1 11:47:09 2001
@@ -0,0 +1,29 @@
+CC = CC -mt -pta -g
+OBDIR = /home/class/cs423/local
+IDL = $(OBDIR)/bin/idl
+CPPFLAGS = -I. -I$(OBDIR)/include
+LDFLAGS = -L$(OBDIR)/lib -G -fPIC
+LIBS = -lCosNaming -lOB -lJTC -lsocket -lnsl -lposix4 -lCstd -lCrun
+
+all: libfswrapper.so
+
+libfswrapper.so: FileServer.o FileServer_wrapper.o
+ CC $(LDFLAGS) -o $@ FileServer_wrapper.o FileServer.o $(LIBS)
+
+FileServer.h FileServer.cpp: ../FileServer.idl
+ rm -f FileServer.cpp FileServer.h
+ rm -f FileServer_skel.h FileServer_skel.cpp
+ $(IDL) ../FileServer.idl
+
+FileServer_skel.cpp FileServer_skel.h: FileServer.cpp
+
+%.o: %.cpp
+ $(CC) $(CPPFLAGS) -c $<
+
+clean:
+ rm -f libfswrapper.so *.o *~
+
+realclean: clean
+ rm -f FileServer.h FileServer.cpp
+ rm -f FileServer_skel.h FileServer_skel.cpp
+ rm -rf SunWS_cache
diff -urN linux-2.4.1/net/korbit/modules/FileServer/wrapper/README linux-2.4.1-korbit/net/korbit/modules/FileServer/wrapper/README
--- linux-2.4.1/net/korbit/modules/FileServer/wrapper/README Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/wrapper/README Thu Feb 1 11:47:09 2001
@@ -0,0 +1,5 @@
+This is a library that may be LD_PRELOAD'd to forward filesystem related calls
+through the FileServer interface.
+
+ORB: ORBacus
+Status: Mostly not working
diff -urN linux-2.4.1/net/korbit/modules/FileServer/wrapper/test.c linux-2.4.1-korbit/net/korbit/modules/FileServer/wrapper/test.c
--- linux-2.4.1/net/korbit/modules/FileServer/wrapper/test.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/FileServer/wrapper/test.c Thu Feb 1 11:47:09 2001
@@ -0,0 +1,15 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+int main(void)
+{
+ if (mkdir("test", 0666) == -1)
+ {
+ perror ("mkdir failed because: ");
+ return (1);
+ }
+
+ return (0);
+}
diff -urN linux-2.4.1/net/korbit/modules/Makefile linux-2.4.1-korbit/net/korbit/modules/Makefile
--- linux-2.4.1/net/korbit/modules/Makefile Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Makefile Thu Feb 1 11:46:58 2001
@@ -0,0 +1,15 @@
+#
+# Makefile for KORBit/modules
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+
+subdir-$(CONFIG_CORBA_CONSOLE) += Console
+subdir-$(CONFIG_CORBA_ECHO) += Echo
+subdir-$(CONFIG_CORBA_FILESERVER) += FileServer
+subdir-$(CONFIG_CORBA_CORBAFS) += CorbaFS
+subdir-$(CONFIG_CORBA_CHARDEV) += CharDev
+
+include $(TOPDIR)/Rules.make
+
diff -urN linux-2.4.1/net/korbit/modules/Makefile.module linux-2.4.1-korbit/net/korbit/modules/Makefile.module
--- linux-2.4.1/net/korbit/modules/Makefile.module Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/Makefile.module Thu Feb 1 11:46:58 2001
@@ -0,0 +1,9 @@
+M_OBJS := $(O_TARGET)
+
+EXTRA_CFLAGS = -D__KORBIT__ -DHAVE_CONFIG_H -I. -I../../.. -I../../../include -I../../../kglib -nostdinc
+
+
+ORBIT_IDL = orbit-idl
+
+include $(TOPDIR)/Rules.make
+
diff -urN linux-2.4.1/net/korbit/modules/README linux-2.4.1-korbit/net/korbit/modules/README
--- linux-2.4.1/net/korbit/modules/README Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/README Thu Feb 1 11:46:58 2001
@@ -0,0 +1,7 @@
+Modules included so far:
+
+CharDev : Implement Linux character device drivers
+Console : Print strings to the Linux console
+CorbaFS : Implement Linux filesystems through the VFS layer
+Echo : Testcase to test orb two-way communication
+FileServer: Access a filesystem through CORBA
diff -urN linux-2.4.1/net/korbit/modules/UserFS/CVS/Entries linux-2.4.1-korbit/net/korbit/modules/UserFS/CVS/Entries
--- linux-2.4.1/net/korbit/modules/UserFS/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/UserFS/CVS/Entries Thu Feb 1 11:47:09 2001
@@ -0,0 +1 @@
+D
diff -urN linux-2.4.1/net/korbit/modules/UserFS/CVS/Entries.Log linux-2.4.1-korbit/net/korbit/modules/UserFS/CVS/Entries.Log
--- linux-2.4.1/net/korbit/modules/UserFS/CVS/Entries.Log Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/UserFS/CVS/Entries.Log Thu Feb 1 11:47:10 2001
@@ -0,0 +1 @@
+A D/client////
diff -urN linux-2.4.1/net/korbit/modules/UserFS/CVS/Repository linux-2.4.1-korbit/net/korbit/modules/UserFS/CVS/Repository
--- linux-2.4.1/net/korbit/modules/UserFS/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/UserFS/CVS/Repository Thu Feb 1 11:47:09 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/modules/UserFS
diff -urN linux-2.4.1/net/korbit/modules/UserFS/CVS/Root linux-2.4.1-korbit/net/korbit/modules/UserFS/CVS/Root
--- linux-2.4.1/net/korbit/modules/UserFS/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/UserFS/CVS/Root Thu Feb 1 11:47:09 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/modules/UserFS/client/CVS/Entries linux-2.4.1-korbit/net/korbit/modules/UserFS/client/CVS/Entries
--- linux-2.4.1/net/korbit/modules/UserFS/client/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/UserFS/client/CVS/Entries Thu Feb 1 11:47:10 2001
@@ -0,0 +1 @@
+D
diff -urN linux-2.4.1/net/korbit/modules/UserFS/client/CVS/Repository linux-2.4.1-korbit/net/korbit/modules/UserFS/client/CVS/Repository
--- linux-2.4.1/net/korbit/modules/UserFS/client/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/UserFS/client/CVS/Repository Thu Feb 1 11:47:10 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/modules/UserFS/client
diff -urN linux-2.4.1/net/korbit/modules/UserFS/client/CVS/Root linux-2.4.1-korbit/net/korbit/modules/UserFS/client/CVS/Root
--- linux-2.4.1/net/korbit/modules/UserFS/client/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/modules/UserFS/client/CVS/Root Thu Feb 1 11:47:10 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/orb/CVS/Entries linux-2.4.1-korbit/net/korbit/orb/CVS/Entries
--- linux-2.4.1/net/korbit/orb/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/CVS/Entries Thu Feb 1 11:47:14 2001
@@ -0,0 +1,60 @@
+/Makefile/1.6/Thu Feb 1 09:47:10 2001//
+/allocator-defs.h/1.1.1.1/Thu Feb 1 09:47:10 2001//
+/allocators.c/1.2/Thu Feb 1 09:47:10 2001//
+/allocators.h/1.1.1.1/Thu Feb 1 09:47:10 2001//
+/cdr.c/1.1.1.1/Thu Feb 1 09:47:10 2001//
+/cdr.h/1.1.1.1/Thu Feb 1 09:47:10 2001//
+/corba_any.c/1.3/Thu Feb 1 09:47:10 2001//
+/corba_any.h/1.1.1.1/Thu Feb 1 09:47:10 2001//
+/corba_any_proto.h/1.1.1.1/Thu Feb 1 09:47:11 2001//
+/corba_any_type.h/1.1.1.1/Thu Feb 1 09:47:11 2001//
+/corba_basic_sequences_type.h/1.1.1.1/Thu Feb 1 09:47:11 2001//
+/corba_context.c/1.1.1.1/Thu Feb 1 09:47:11 2001//
+/corba_context.h/1.1.1.1/Thu Feb 1 09:47:11 2001//
+/corba_env.h/1.1.1.1/Thu Feb 1 09:47:11 2001//
+/corba_env_type.h/1.1.1.1/Thu Feb 1 09:47:11 2001//
+/corba_object.c/1.7/Thu Feb 1 09:47:11 2001//
+/corba_object.h/1.1.1.1/Thu Feb 1 09:47:11 2001//
+/corba_object_type.h/1.1.1.1/Thu Feb 1 09:47:11 2001//
+/corba_orb.h/1.1.1.1/Thu Feb 1 09:47:11 2001//
+/corba_orb_type.h/1.1.1.1/Thu Feb 1 09:47:11 2001//
+/corba_portableserver.h/1.1.1.1/Thu Feb 1 09:47:11 2001//
+/corba_portableserver_type.h/1.1.1.1/Thu Feb 1 09:47:11 2001//
+/corba_sequences.h/1.1.1.1/Thu Feb 1 09:47:12 2001//
+/corba_sequences_type.h/1.1.1.1/Thu Feb 1 09:47:12 2001//
+/corba_typecode.h/1.1.1.1/Thu Feb 1 09:47:12 2001//
+/corba_typecode_type.h/1.3/Thu Feb 1 09:47:12 2001//
+/dii.c/1.2/Thu Feb 1 09:47:12 2001//
+/dii.h/1.2/Thu Feb 1 09:47:12 2001//
+/env.c/1.2/Thu Feb 1 09:47:12 2001//
+/env.h/1.2/Thu Feb 1 09:47:12 2001//
+/genrand.c/1.4/Thu Feb 1 09:47:12 2001//
+/genrand.h/1.1.1.1/Thu Feb 1 09:47:12 2001//
+/iop.h/1.1.1.1/Thu Feb 1 09:47:12 2001//
+/ir.c/1.1.1.1/Thu Feb 1 09:47:12 2001//
+/ir.h/1.1.1.1/Thu Feb 1 09:47:12 2001//
+/options.c/1.2/Thu Feb 1 09:47:12 2001//
+/options.h/1.2/Thu Feb 1 09:47:13 2001//
+/orb.c/1.13/Thu Feb 1 09:47:13 2001//
+/orb.h/1.2/Thu Feb 1 09:47:13 2001//
+/orbit.c/1.1.1.1/Thu Feb 1 09:47:13 2001//
+/orbit.h/1.2/Thu Feb 1 09:47:13 2001//
+/orbit.h.in/1.1.1.1/Thu Feb 1 09:47:13 2001//
+/orbit_config.h/1.1.1.1/Thu Feb 1 09:47:13 2001//
+/orbit_object.c/1.1.1.1/Thu Feb 1 09:47:13 2001//
+/orbit_object.h/1.1.1.1/Thu Feb 1 09:47:13 2001//
+/orbit_object_type.h/1.1.1.1/Thu Feb 1 09:47:13 2001//
+/orbit_poa.c/1.1.1.1/Thu Feb 1 09:47:13 2001//
+/orbit_poa.h/1.3/Thu Feb 1 09:47:13 2001//
+/orbit_poa_type.h/1.1.1.1/Thu Feb 1 09:47:13 2001//
+/orbit_typecode.c/1.1.1.1/Thu Feb 1 09:47:14 2001//
+/orbit_typecode.h/1.1.1.1/Thu Feb 1 09:47:14 2001//
+/orbit_types.h/1.1.1.1/Thu Feb 1 09:47:14 2001//
+/poa.c/1.1.1.1/Thu Feb 1 09:47:14 2001//
+/poa.h/1.1.1.1/Thu Feb 1 09:47:14 2001//
+/sequences.c/1.1.1.1/Thu Feb 1 09:47:14 2001//
+/sequences.h/1.1.1.1/Thu Feb 1 09:47:14 2001//
+/server.c/1.5/Thu Feb 1 09:47:14 2001//
+/typecode.c/1.1.1.1/Thu Feb 1 09:47:14 2001//
+/typecode.h/1.1.1.1/Thu Feb 1 09:47:14 2001//
+D
diff -urN linux-2.4.1/net/korbit/orb/CVS/Repository linux-2.4.1-korbit/net/korbit/orb/CVS/Repository
--- linux-2.4.1/net/korbit/orb/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/CVS/Repository Thu Feb 1 11:47:10 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/orb
diff -urN linux-2.4.1/net/korbit/orb/CVS/Root linux-2.4.1-korbit/net/korbit/orb/CVS/Root
--- linux-2.4.1/net/korbit/orb/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/CVS/Root Thu Feb 1 11:47:10 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit
diff -urN linux-2.4.1/net/korbit/orb/Makefile linux-2.4.1-korbit/net/korbit/orb/Makefile
--- linux-2.4.1/net/korbit/orb/Makefile Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/Makefile Thu Feb 1 11:47:10 2001
@@ -0,0 +1,25 @@
+#
+# Makefile for KORBit/orb
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .o file).
+#
+# Note 2! The CFLAGS definition is now in the main makefile...
+
+O_TARGET := orblib.o
+
+#obj-m := $(O_TARGET)
+obj-y := allocators.o options.o poa.o \
+ cdr.o env.o orb.o sequences.o \
+ corba_any.o genrand.o orbit.o server.o \
+ corba_context.o orbit_object.o typecode.o \
+ corba_object.o orbit_poa.o \
+ dii.o ir.o orbit_typecode.o
+
+EXTRA_CFLAGS = -D__KORBIT__ -DHAVE_CONFIG_H -I. -I.. -I../include -I../kglib -I../ORBitutil -nostdinc \
+ -DORBit_SYSRC=\"/etc/orbitrc\" \
+ -DORBIT_MAJOR_VERSION="0" -DORBIT_MINOR_VERSION="5" -DORBIT_MICRO_VERSION="3" -DORBIT_VERSION=\"0.5.3\"
+
+include $(TOPDIR)/Rules.make
+
diff -urN linux-2.4.1/net/korbit/orb/allocator-defs.h linux-2.4.1-korbit/net/korbit/orb/allocator-defs.h
--- linux-2.4.1/net/korbit/orb/allocator-defs.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/allocator-defs.h Thu Feb 1 11:47:10 2001
@@ -0,0 +1,40 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/* By Elliot Lee. Copyright (c) 1998 Red Hat Software */
+
+
+/********************************************************
+ * Never include this header file directly. Only allocators.[ch]
+ * should do this
+ ********************************************************/
+
+/* Macro crap */
+
+#ifdef ALLOCATOR_DEFINITION
+
+#define ORBIT_DEFINE_CHUNK(x, xsize) \
+DEFINE_LOCK(x##_allocator); \
+GMemChunk *x##_allocator = NULL
+
+#elif defined(ALLOCATOR_INITIALIZATION)
+
+#define ORBIT_DEFINE_CHUNK(x, xsize) INIT_LOCK(x##_allocator); \
+x##_allocator = g_mem_chunk_new(#x, (xsize), \
+(xsize) * ORBIT_CHUNKS_PREALLOC, G_ALLOC_AND_FREE)
+
+#else
+
+#define ORBIT_DEFINE_CHUNK(x, xsize) \
+EXTERN_LOCK(x##_allocator); \
+extern GMemChunk *x##_allocator
+
+#endif
+
+/*****************************************************
+ * Here's where we define the actual chunks that are used
+ *****************************************************/
+ORBIT_DEFINE_CHUNK(CORBA_TypeCode, sizeof(struct CORBA_TypeCode_struct));
+ORBIT_DEFINE_CHUNK(CORBA_Object, sizeof(struct CORBA_Object_struct));
+ORBIT_DEFINE_CHUNK(CORBA_NVList, sizeof(struct CORBA_NVList_type));
+
+#undef ORBIT_DEFINE_CHUNK
diff -urN linux-2.4.1/net/korbit/orb/allocators.c linux-2.4.1-korbit/net/korbit/orb/allocators.c
--- linux-2.4.1/net/korbit/orb/allocators.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/allocators.c Thu Feb 1 11:47:10 2001
@@ -0,0 +1,241 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/* By Elliot Lee. Copyright (c) 1998 Red Hat Software */
+
+#include "orbit.h"
+
+#if 0
+#define CORBA_Object_release(x, y) ({ g_message(__FILE__ ":%d Releasing object %#x from %d", __LINE__, \
+x, ORBIT_ROOT_OBJECT(x)->refs); CORBA_Object_release(x, y); })
+#define CORBA_Object_duplicate(x, y) ({ g_message(__FILE__ ":%d Duping object %#x from %d", __LINE__, \
+x, ORBIT_ROOT_OBJECT(x)->refs); CORBA_Object_duplicate(x, y); })
+#endif
+
+/* The memory chunk stuff */
+
+#define ALLOCATOR_DEFINITION
+#include "allocator-defs.h"
+#undef ALLOCATOR_DEFINITION
+
+void
+ORBit_chunks_init(void)
+{
+#define ALLOCATOR_INITIALIZATION
+#include "allocator-defs.h"
+#undef ALLOCATOR_INTIALIZATION
+}
+
+gpointer
+ORBit_chunk_alloc(GMemChunk *chunk,
+ PARAM_LOCK(chunk))
+{
+ gpointer retval;
+
+ GET_LOCK(chunk);
+ retval = g_mem_chunk_alloc(chunk);
+ RELEASE_LOCK(chunk);
+
+ return retval;
+}
+
+void
+ORBit_chunk_free(GMemChunk *chunk,
+ PARAM_LOCK(chunk),
+ gpointer mem)
+{
+ GET_LOCK(chunk);
+ g_mem_chunk_free(chunk, mem);
+ RELEASE_LOCK(chunk);
+}
+
+/* end memory chunk routines */
+
+/****************************************************************/
+
+/************* begin funky memory alloc/free system */
+
+/****** functions */
+
+gpointer ORBit_alloc(size_t block_size,
+ ORBit_free_childvals freefunc,
+ gpointer func_data)
+{
+ return ORBit_alloc_2(block_size, freefunc, func_data, 0);
+}
+
+gpointer
+ORBit_alloc_2(size_t block_size,
+ ORBit_free_childvals freefunc,
+ gpointer func_data,
+ size_t before_size)
+{
+ ORBit_mem_info *block;
+
+ if(block_size == 0) return NULL;
+
+ block = (ORBit_mem_info *)((char *)
+ g_malloc(block_size + sizeof(ORBit_mem_info) + before_size)
+ + before_size);
+
+#ifdef ORBIT_DEBUG
+ block->magic = 0xdeadbeef;
+#endif
+ block->free = freefunc;
+ block->func_data = func_data;
+
+ return MEMINFO_TO_PTR(block);
+}
+
+/*
+ ORBit_free
+ ----------
+
+ Frees a corba primitive type.
+
+ mem = pointer to the memory block. (must have a preceeding pointer to a meminfo block)
+
+ 1)obtains a pointer to the preceeding meminfo structure
+ 2)Uses the meminfo structure to find the number of elements in the memory block
+ 3)iterates through the memory block, calling the free function for each item.
+
+ */
+
+void
+ORBit_free(gpointer mem, CORBA_boolean free_strings)
+{
+ ORBit_mem_info *block;
+
+ if(!mem)
+ return;
+
+ block = PTR_TO_MEMINFO(mem);
+
+#ifdef ORBIT_DEBUG
+ g_assert(block->magic == 0xdeadbeef);
+#endif
+
+ if(block->free) {
+ int i;
+ gpointer x;
+ gpointer my_data;
+
+ if((gpointer)block->free == (gpointer)ORBit_free_via_TypeCode)
+ my_data = ((guchar *)block) - sizeof(CORBA_TypeCode);
+ else
+ my_data = NULL;
+
+#ifdef ORBIT_DEBUG
+ if(block->func_data == NULL)
+ g_warning("block with freefunc %p has no items", block->free);
+#endif
+
+ for(i = 0, x = mem; i < (gulong)block->func_data; i++)
+ x = block->free(x, my_data, free_strings);
+
+ if((gpointer)block->free == (gpointer)ORBit_free_via_TypeCode)
+ /* ((guchar *)block) -= sizeof(CORBA_TypeCode); */
+ block = (ORBit_mem_info *)
+ (((guchar *)block) - sizeof(CORBA_TypeCode));
+ g_free(block);
+ } else
+ g_free(block);
+}
+
+/******************************************************************/
+/* These aren't currently used... */
+
+gpointer
+ORBit_free_via_TypeCode(gpointer mem, gpointer tcp, gboolean free_strings)
+{
+ CORBA_TypeCode tc = *(CORBA_TypeCode *)tcp, subtc;
+ int i;
+ guchar *retval = NULL;
+
+ switch(tc->kind) {
+ case CORBA_tk_any:
+ {
+ CORBA_any *anyval = mem;
+ if(anyval->_release)
+ CORBA_free(anyval->_value);
+ retval = (guchar *)(anyval + 1);
+ }
+ break;
+ case CORBA_tk_TypeCode:
+ case CORBA_tk_objref:
+ {
+ CORBA_Object_release(*(CORBA_Object *)mem, NULL);
+
+ retval = (guchar *)mem + sizeof(CORBA_Object);
+ }
+ break;
+ case CORBA_tk_Principal:
+ {
+ CORBA_Principal *pval = mem;
+ if(pval->_release)
+ CORBA_free(pval->_buffer);
+ retval = (guchar *)(pval + 1);
+ }
+ break;
+ case CORBA_tk_except:
+ case CORBA_tk_struct:
+ mem = ALIGN_ADDRESS(mem, ORBit_find_alignment(tc));
+ for(i = 0; i < tc->sub_parts; i++) {
+ subtc = (CORBA_TypeCode)CORBA_Object_duplicate((CORBA_Object)tc->subtypes[i], NULL);
+ mem = ORBit_free_via_TypeCode(mem, &subtc,
+ free_strings);
+ }
+ retval = mem;
+ break;
+ case CORBA_tk_union:
+ subtc = (CORBA_TypeCode)CORBA_Object_duplicate(
+ (CORBA_Object)ORBit_get_union_tag(tc, &mem, TRUE), NULL);
+ {
+ int sz = 0;
+ int al = 1;
+ for(i = 0; i < tc->sub_parts; i++) {
+ al = MAX(al, ORBit_find_alignment(tc->subtypes[i]));
+ sz = MAX(sz, ORBit_gather_alloc_info(tc->subtypes[i]));
+ }
+ mem = ALIGN_ADDRESS(mem, al);
+ ORBit_free_via_TypeCode(mem, &subtc, free_strings);
+ /* the end of the body (subtc) may not be the
+ * same as the end of the union */
+ retval = mem + sz;
+ }
+ break;
+ case CORBA_tk_wstring:
+ case CORBA_tk_string:
+ if(free_strings)
+ CORBA_free(*(char **)mem);
+ retval = (guchar *)mem + sizeof(char *);
+ break;
+ case CORBA_tk_sequence:
+ {
+ CORBA_sequence_octet *pval = mem;
+ if(pval->_release)
+ CORBA_free(pval->_buffer);
+
+ retval = (guchar *)mem + sizeof(CORBA_sequence_octet);
+ }
+ break;
+ case CORBA_tk_array:
+ for(i = 0; i < tc->length; i++) {
+ subtc = (CORBA_TypeCode)CORBA_Object_duplicate((CORBA_Object)tc->subtypes[0], NULL);
+ mem = ORBit_free_via_TypeCode(mem, &subtc,
+ free_strings);
+ }
+ retval = mem;
+ break;
+ case CORBA_tk_alias:
+ subtc = (CORBA_TypeCode)CORBA_Object_duplicate((CORBA_Object)tc->subtypes[0], NULL);
+ retval = ORBit_free_via_TypeCode(mem, &subtc, free_strings);
+ break;
+ default:
+ retval = ((guchar *)mem) + ORBit_gather_alloc_info(tc);
+ break;
+ }
+
+ CORBA_Object_release((CORBA_Object)tc, NULL);
+
+ return (gpointer)retval;
+}
diff -urN linux-2.4.1/net/korbit/orb/allocators.h linux-2.4.1-korbit/net/korbit/orb/allocators.h
--- linux-2.4.1/net/korbit/orb/allocators.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/allocators.h Thu Feb 1 11:47:10 2001
@@ -0,0 +1,61 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/* By Elliot Lee. Copyright (c) 1998 Red Hat Software */
+
+#ifndef ALLOCATORS_H
+#define ALLOCATORS_H 1
+
+#include <orb/orbit.h>
+
+#include <orb/allocator-defs.h>
+
+#define ORBIT_CHUNK_ALLOC(typename) \
+ORBit_chunk_alloc(typename##_allocator, LOCK_NAME(typename##_allocator))
+
+#define ORBIT_CHUNK_FREE(typename, mem) \
+ORBit_chunk_free(typename##_allocator, LOCK_NAME(typename##_allocator), (mem))
+
+void ORBit_chunks_init(void);
+
+gpointer ORBit_chunk_alloc(GMemChunk *chunk,
+ PARAM_LOCK(chunk_lock));
+
+void ORBit_chunk_free(GMemChunk *chunk,
+ PARAM_LOCK(chunk_lock),
+ gpointer mem);
+
+/* General memory allocation routines */
+
+#define PTR_TO_MEMINFO(x) (((ORBit_mem_info *)(x)) - 1)
+#define MEMINFO_TO_PTR(x) ((gpointer)((x) + 1))
+
+typedef gpointer (*ORBit_free_childvals)(gpointer mem,
+ gpointer func_data,
+ CORBA_boolean free_strings);
+
+typedef struct {
+#ifdef ORBIT_DEBUG
+ gulong magic;
+#endif
+ /* If this routine returns FALSE, it indicates that it already free'd
+ the memory block itself */
+ ORBit_free_childvals free; /* function pointer to free function */
+ gpointer func_data;
+} ORBit_mem_info;
+
+gpointer ORBit_alloc(size_t block_size,
+ ORBit_free_childvals freefunc,
+ gpointer func_data);
+gpointer ORBit_alloc_2(size_t block_size,
+ ORBit_free_childvals freefunc,
+ gpointer func_data,
+ size_t before_size);
+
+void ORBit_free(gpointer mem, CORBA_boolean free_strings);
+
+/* internal stuff */
+gpointer ORBit_free_via_TypeCode(gpointer mem,
+ gpointer tcp,
+ gboolean free_strings);
+
+#endif /* ALLOCATORS_H */
diff -urN linux-2.4.1/net/korbit/orb/cdr.c linux-2.4.1-korbit/net/korbit/orb/cdr.c
--- linux-2.4.1/net/korbit/orb/cdr.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/cdr.c Thu Feb 1 11:47:10 2001
@@ -0,0 +1,643 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#include "config.h"
+#include "../IIOP/iiop-endianP.h"
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+#include "orbit.h"
+
+#define CDR_GROW_AMOUNT 128
+
+static CORBA_boolean CDR_buffer_grow(CDR_Codec *codec, const unsigned int growth)
+{
+ unsigned int real_growth;
+ div_t divvy;
+
+ if(codec->release_buffer) {
+ divvy=div(growth, CDR_GROW_AMOUNT);
+ real_growth=CDR_GROW_AMOUNT * (divvy.quot+1);
+
+ codec->buffer=(CORBA_octet *)g_realloc(codec->buffer,
+ codec->buf_len
+ +real_growth);
+ }
+
+ return CORBA_TRUE;
+}
+
+static void CDR_buffer_puts(CDR_Codec *codec, const void *data, const unsigned int len)
+{
+ if(codec->wptr+len > codec->buf_len) {
+ CORBA_boolean res=CDR_buffer_grow(codec, len);
+
+ if(res==CORBA_FALSE) {
+ /* just bail out for now */
+ g_assert(!"Malloc error");
+ }
+ }
+
+ memcpy(&codec->buffer[codec->wptr], data, len);
+ codec->wptr+=len;
+}
+
+CORBA_boolean CDR_buffer_gets(CDR_Codec *codec, void *dest, const unsigned int len)
+{
+ if(codec->rptr+len > codec->buf_len) {
+ ORBit_Trace(TraceMod_CDR, TraceLevel_Debug, "CDR_buffer_gets: attempt to read past end of buffer\n");
+ return(CORBA_FALSE);
+ }
+
+ memcpy(dest, &codec->buffer[codec->rptr], len);
+ codec->rptr+=len;
+
+ return(CORBA_TRUE);
+}
+
+static void CDR_buffer_put(CDR_Codec *codec, void *datum)
+{
+ if(codec->wptr+1 > codec->buf_len) {
+ CORBA_boolean res=CDR_buffer_grow(codec, 1);
+
+ if(res==CORBA_FALSE) {
+ /* just bail out for now */
+ g_assert(!"Malloc error");
+ }
+ }
+
+ codec->buffer[codec->wptr++]=*(unsigned char *)datum;
+}
+
+static CORBA_boolean CDR_buffer_get(CDR_Codec *codec, void *dest)
+{
+ if(codec->rptr+1 > codec->buf_len) {
+ ORBit_Trace(TraceMod_CDR, TraceLevel_Debug, "CDR_buffer_get: attempt to read past end of buffer\n");
+ return(CORBA_FALSE);
+ }
+
+ *(CORBA_octet *)dest=codec->buffer[codec->rptr++];
+ return(CORBA_TRUE);
+}
+
+#ifdef lame_slow_code
+static void CDR_buffer_put2(CDR_Codec *codec, void *datum)
+{
+ unsigned long align;
+
+ g_assert(codec!=NULL);
+ g_assert(codec->readonly!=CORBA_TRUE);
+ g_assert(codec->wptr<=codec->buf_len);
+
+ align=((codec->wptr+1)&~1L);
+
+ if(align+2 > codec->buf_len) {
+ CORBA_boolean res=CDR_buffer_grow(codec, align+2-codec->wptr);
+
+ if(res==CORBA_FALSE) {
+ /* just bail out for now */
+ g_assert(!"Malloc error");
+ }
+ }
+
+ while(codec->wptr < align) {
+ codec->buffer[codec->wptr++]='\0';
+ }
+
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[0];
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[1];
+}
+
+static CORBA_boolean CDR_buffer_get2(CDR_Codec *codec, void *dest)
+{
+ unsigned long align;
+
+ g_assert(codec!=NULL);
+ g_assert(dest!=NULL);
+ g_assert(codec->rptr<=codec->buf_len);
+
+ align=((codec->rptr+1)&~1L);
+
+ if(align+2 > codec->buf_len) {
+ ORBit_Trace(TraceMod_CDR, TraceLevel_Debug, "CDR_buffer_get2: attempt to read past end of buffer\n");
+ return(CORBA_FALSE);
+ }
+
+ codec->rptr=align;
+
+ ((CORBA_octet *)dest)[0]=codec->buffer[codec->rptr++];
+ ((CORBA_octet *)dest)[1]=codec->buffer[codec->rptr++];
+
+ return(CORBA_TRUE);
+}
+
+static void CDR_buffer_put4(CDR_Codec *codec, void *datum)
+{
+ unsigned long align;
+
+ g_assert(codec!=NULL);
+ g_assert(codec->readonly!=CORBA_TRUE);
+ g_assert(codec->wptr<=codec->buf_len);
+
+ align=((codec->wptr+3)&~3L);
+
+ if(align+4 > codec->buf_len) {
+ CORBA_boolean res=CDR_buffer_grow(codec, align+4-codec->wptr);
+
+ if(res==CORBA_FALSE) {
+ /* just bail out for now */
+ g_assert(!"Malloc error");
+ }
+ }
+
+ while(codec->wptr < align) {
+ codec->buffer[codec->wptr++]='\0';
+ }
+
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[0];
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[1];
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[2];
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[3];
+}
+
+static CORBA_boolean CDR_buffer_get4(CDR_Codec *codec, void *dest)
+{
+ unsigned long align;
+
+ g_assert(codec!=NULL);
+ g_assert(dest!=NULL);
+ g_assert(codec->rptr<=codec->buf_len);
+
+ align=((codec->rptr+3)&~3L);
+
+ if(align+4 > codec->buf_len) {
+ ORBit_Trace(TraceMod_CDR, TraceLevel_Debug, "CDR_buffer_get4: attempt to read past end of buffer\n");
+ return(CORBA_FALSE);
+ }
+
+ codec->rptr=align;
+
+ ((CORBA_octet *)dest)[0]=codec->buffer[codec->rptr++];
+ ((CORBA_octet *)dest)[1]=codec->buffer[codec->rptr++];
+ ((CORBA_octet *)dest)[2]=codec->buffer[codec->rptr++];
+ ((CORBA_octet *)dest)[3]=codec->buffer[codec->rptr++];
+
+ return(CORBA_TRUE);
+}
+
+static void CDR_buffer_put8(CDR_Codec *codec, void *datum)
+{
+ unsigned long align;
+
+ g_assert(codec!=NULL);
+ g_assert(codec->readonly!=CORBA_TRUE);
+ g_assert(codec->wptr<=codec->buf_len);
+
+ align=((codec->wptr+7)&~7L);
+
+ if(align+8 > codec->buf_len) {
+ CORBA_boolean res=CDR_buffer_grow(codec, align+8-codec->wptr);
+
+ if(res==CORBA_FALSE) {
+ /* just bail out for now */
+ g_assert(!"Malloc error");
+ }
+ }
+
+ while(codec->wptr < align) {
+ codec->buffer[codec->wptr++]='\0';
+ }
+
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[0];
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[1];
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[2];
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[3];
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[4];
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[5];
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[6];
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[7];
+}
+
+#if 0
+static CORBA_boolean CDR_buffer_get8(CDR_Codec *codec, void *dest)
+{
+ unsigned long align;
+
+ g_assert(codec!=NULL);
+ g_assert(dest!=NULL);
+ g_assert(codec->rptr<=codec->buf_len);
+
+ align=((codec->rptr+7)&~7L);
+
+ if(align+8 > codec->buf_len) {
+ ORBit_Trace(TraceMod_CDR, TraceLevel_Debug, "CDR_buffer_get8: attempt to read past end of buffer\n");
+ return(CORBA_FALSE);
+ }
+
+ codec->rptr=align;
+
+ ((CORBA_octet *)dest)[0]=codec->buffer[codec->rptr++];
+ ((CORBA_octet *)dest)[1]=codec->buffer[codec->rptr++];
+ ((CORBA_octet *)dest)[2]=codec->buffer[codec->rptr++];
+ ((CORBA_octet *)dest)[3]=codec->buffer[codec->rptr++];
+ ((CORBA_octet *)dest)[4]=codec->buffer[codec->rptr++];
+ ((CORBA_octet *)dest)[5]=codec->buffer[codec->rptr++];
+ ((CORBA_octet *)dest)[6]=codec->buffer[codec->rptr++];
+ ((CORBA_octet *)dest)[7]=codec->buffer[codec->rptr++];
+
+ return(CORBA_TRUE);
+}
+#endif
+
+static void CDR_buffer_put16(CDR_Codec *codec, void *datum)
+{
+ unsigned long align;
+
+ g_assert(codec!=NULL);
+ g_assert(codec->readonly!=CORBA_TRUE);
+ g_assert(codec->wptr<=codec->buf_len);
+
+ align=((codec->wptr+15)&~15L);
+
+ if(align+16 > codec->buf_len) {
+ CORBA_boolean res=CDR_buffer_grow(codec, align+16-codec->wptr);
+
+ if(res==CORBA_FALSE) {
+ /* just bail out for now */
+ g_assert(!"Malloc error");
+ }
+ }
+
+ while(codec->wptr < align) {
+ codec->buffer[codec->wptr++]='\0';
+ }
+
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[0];
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[1];
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[2];
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[3];
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[4];
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[5];
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[6];
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[7];
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[8];
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[9];
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[10];
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[11];
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[12];
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[13];
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[14];
+ codec->buffer[codec->wptr++]=((CORBA_octet *)datum)[15];
+}
+
+#if 0
+static CORBA_boolean CDR_buffer_get16(CDR_Codec *codec, void *dest)
+{
+ unsigned long align;
+
+ g_assert(codec!=NULL);
+ g_assert(dest!=NULL);
+ g_assert(codec->rptr<=codec->buf_len);
+
+ align=((codec->rptr+15)&~15L);
+
+ if(align+16 > codec->buf_len) {
+ ORBit_Trace(TraceMod_CDR, TraceLevel_Debug, "CDR_buffer_get16: attempt to read past end of buffer\n");
+ return(CORBA_FALSE);
+ }
+
+ codec->rptr=align;
+
+ ((CORBA_octet *)dest)[0]=codec->buffer[codec->rptr++];
+ ((CORBA_octet *)dest)[1]=codec->buffer[codec->rptr++];
+ ((CORBA_octet *)dest)[2]=codec->buffer[codec->rptr++];
+ ((CORBA_octet *)dest)[3]=codec->buffer[codec->rptr++];
+ ((CORBA_octet *)dest)[4]=codec->buffer[codec->rptr++];
+ ((CORBA_octet *)dest)[5]=codec->buffer[codec->rptr++];
+ ((CORBA_octet *)dest)[6]=codec->buffer[codec->rptr++];
+ ((CORBA_octet *)dest)[7]=codec->buffer[codec->rptr++];
+ ((CORBA_octet *)dest)[8]=codec->buffer[codec->rptr++];
+ ((CORBA_octet *)dest)[9]=codec->buffer[codec->rptr++];
+ ((CORBA_octet *)dest)[10]=codec->buffer[codec->rptr++];
+ ((CORBA_octet *)dest)[11]=codec->buffer[codec->rptr++];
+ ((CORBA_octet *)dest)[12]=codec->buffer[codec->rptr++];
+ ((CORBA_octet *)dest)[13]=codec->buffer[codec->rptr++];
+ ((CORBA_octet *)dest)[14]=codec->buffer[codec->rptr++];
+ ((CORBA_octet *)dest)[15]=codec->buffer[codec->rptr++];
+
+ return(CORBA_TRUE);
+}
+#endif
+#endif /* lame_slow_code */
+
+#define CDR_buffer_put2(codec, datum) CDR_buffer_putn(codec, datum, 2)
+#define CDR_buffer_put4(codec, datum) CDR_buffer_putn(codec, datum, 4)
+#define CDR_buffer_put8(codec, datum) CDR_buffer_putn(codec, datum, 8)
+#define CDR_buffer_put16(codec, datum) CDR_buffer_putn(codec, datum, 16)
+#define CDR_buffer_get2(codec, dest) CDR_buffer_getn(codec, dest, 2)
+#define CDR_buffer_get4(codec, dest) CDR_buffer_getn(codec, dest, 4)
+#define CDR_buffer_get8(codec, dest) CDR_buffer_getn(codec, dest, 8)
+#define CDR_buffer_get16(codec, dest) CDR_buffer_getn(codec, dest, 16)
+
+static CORBA_boolean
+CDR_buffer_getn(CDR_Codec *codec, void *dest, int bsize)
+{
+ codec->rptr = (unsigned long)ALIGN_ADDRESS(codec->rptr, bsize);
+ if(codec->host_endian==codec->data_endian)
+ memcpy(dest, codec->buffer + codec->rptr, bsize);
+ else
+ iiop_byteswap(dest, codec->buffer + codec->rptr, bsize);
+ codec->rptr += bsize;
+
+ return CORBA_TRUE;
+}
+
+static CORBA_boolean
+CDR_buffer_putn(CDR_Codec *codec, void *datum, int bsize)
+{
+ codec->wptr = (unsigned long)ALIGN_ADDRESS(codec->wptr, bsize);
+ if(codec->host_endian==codec->data_endian)
+ memcpy(codec->buffer + codec->wptr, datum, bsize);
+ else
+ iiop_byteswap(codec->buffer + codec->wptr, datum, bsize);
+ codec->wptr += bsize;
+
+ return CORBA_TRUE;
+}
+
+#define CDR_swap2(d,s) iiop_byteswap((d), (s), 2)
+#define CDR_swap4(d,s) iiop_byteswap((d), (s), 4)
+#define CDR_swap8(d,s) iiop_byteswap((d), (s), 8)
+#define CDR_swap16(d,s) iiop_byteswap((d), (s), 16)
+
+#ifdef lame_slow_code
+static void CDR_swap2(void *d, void *s)
+{
+ ((CORBA_octet *)d)[0]=((CORBA_octet *)s)[1];
+ ((CORBA_octet *)d)[1]=((CORBA_octet *)s)[0];
+}
+
+static void CDR_swap4(void *d, void *s)
+{
+ ((CORBA_octet *)d)[0]=((CORBA_octet *)s)[3];
+ ((CORBA_octet *)d)[1]=((CORBA_octet *)s)[2];
+ ((CORBA_octet *)d)[2]=((CORBA_octet *)s)[1];
+ ((CORBA_octet *)d)[3]=((CORBA_octet *)s)[0];
+}
+
+static void CDR_swap8(void *d, void *s)
+{
+ ((CORBA_octet *)d)[0]=((CORBA_octet *)s)[7];
+ ((CORBA_octet *)d)[1]=((CORBA_octet *)s)[6];
+ ((CORBA_octet *)d)[2]=((CORBA_octet *)s)[5];
+ ((CORBA_octet *)d)[3]=((CORBA_octet *)s)[4];
+ ((CORBA_octet *)d)[4]=((CORBA_octet *)s)[3];
+ ((CORBA_octet *)d)[5]=((CORBA_octet *)s)[2];
+ ((CORBA_octet *)d)[6]=((CORBA_octet *)s)[1];
+ ((CORBA_octet *)d)[7]=((CORBA_octet *)s)[0];
+}
+
+static void CDR_swap16(void *d, void *s)
+{
+ ((CORBA_octet *)d)[0]=((CORBA_octet *)s)[15];
+ ((CORBA_octet *)d)[1]=((CORBA_octet *)s)[14];
+ ((CORBA_octet *)d)[2]=((CORBA_octet *)s)[13];
+ ((CORBA_octet *)d)[3]=((CORBA_octet *)s)[12];
+ ((CORBA_octet *)d)[4]=((CORBA_octet *)s)[11];
+ ((CORBA_octet *)d)[5]=((CORBA_octet *)s)[10];
+ ((CORBA_octet *)d)[6]=((CORBA_octet *)s)[9];
+ ((CORBA_octet *)d)[7]=((CORBA_octet *)s)[8];
+ ((CORBA_octet *)d)[8]=((CORBA_octet *)s)[7];
+ ((CORBA_octet *)d)[9]=((CORBA_octet *)s)[6];
+ ((CORBA_octet *)d)[10]=((CORBA_octet *)s)[5];
+ ((CORBA_octet *)d)[11]=((CORBA_octet *)s)[4];
+ ((CORBA_octet *)d)[12]=((CORBA_octet *)s)[3];
+ ((CORBA_octet *)d)[13]=((CORBA_octet *)s)[2];
+ ((CORBA_octet *)d)[14]=((CORBA_octet *)s)[1];
+ ((CORBA_octet *)d)[15]=((CORBA_octet *)s)[0];
+}
+#endif
+
+
+void CDR_put_short(CDR_Codec *codec, CORBA_short s)
+{
+ CDR_buffer_put2(codec, &s);
+}
+
+CORBA_boolean CDR_get_short(CDR_Codec *codec, CORBA_short *s)
+{
+ return CDR_buffer_get2(codec, s);
+}
+
+void CDR_put_ushort(CDR_Codec *codec, CORBA_unsigned_short us)
+{
+ CDR_buffer_put2(codec, &us);
+}
+
+CORBA_boolean CDR_get_ushort(CDR_Codec *codec, CORBA_unsigned_short *us)
+{
+ return CDR_buffer_get2(codec, us);
+}
+
+void CDR_put_long(CDR_Codec *codec, CORBA_long l)
+{
+ CDR_buffer_put4(codec, &l);
+}
+
+CORBA_boolean CDR_get_long(CDR_Codec *codec, CORBA_long *l)
+{
+ return CDR_buffer_get4(codec, l);
+}
+
+void CDR_put_ulong(CDR_Codec *codec, CORBA_unsigned_long ul)
+{
+ CDR_buffer_put4(codec, &ul);
+}
+
+CORBA_boolean CDR_get_ulong(CDR_Codec *codec, CORBA_unsigned_long *ul)
+{
+ return CDR_buffer_get4(codec, ul);
+}
+
+#ifdef HAVE_CORBA_LONG_LONG
+CORBA_boolean CDR_get_long_long(CDR_Codec *codec, CORBA_long_long *ul)
+{
+ return CDR_buffer_get8(codec, ul);
+}
+
+void CDR_put_long_long(CDR_Codec *codec, CORBA_long_long ll)
+{
+ CDR_buffer_put8(codec, &ll);
+}
+
+void CDR_put_ulong_long(CDR_Codec *codec, CORBA_unsigned_long_long ll)
+{
+ CDR_buffer_put8(codec, &ll);
+}
+
+CORBA_boolean CDR_get_ulong_long(CDR_Codec *codec, CORBA_unsigned_long_long *ull)
+{
+ return CDR_buffer_get8(codec, ull);
+}
+#endif
+
+void CDR_put_float(CDR_Codec *codec, CORBA_float f)
+{
+ CDR_buffer_put4(codec, &f);
+}
+
+void CDR_put_double(CDR_Codec *codec, CORBA_double d)
+{
+ CDR_buffer_put8(codec, &d);
+}
+
+void CDR_put_long_double(CDR_Codec *codec, CORBA_long_double ld)
+{
+ CDR_buffer_put16(codec, &ld);
+}
+
+void CDR_put_octet(CDR_Codec *codec, CORBA_octet datum)
+{
+ CDR_buffer_put(codec, &datum);
+}
+
+CORBA_boolean CDR_get_octet(CDR_Codec *codec, CORBA_octet *datum)
+{
+ return(CDR_buffer_get(codec, datum));
+}
+
+void CDR_put_octets(CDR_Codec *codec, void *data, unsigned long len)
+{
+ CDR_buffer_puts(codec, data, len);
+}
+
+void CDR_put_char(CDR_Codec *codec, CORBA_char c)
+{
+ CDR_buffer_put(codec, &c);
+}
+
+CORBA_boolean CDR_get_char(CDR_Codec *codec, CORBA_char *c)
+{
+ return CDR_buffer_get(codec, c);
+}
+
+void CDR_put_boolean(CDR_Codec *codec, CORBA_boolean datum)
+{
+ datum = datum&&1;
+ CDR_buffer_put(codec, &datum);
+}
+
+CORBA_boolean CDR_get_boolean(CDR_Codec *codec, CORBA_boolean *b)
+{
+ return CDR_buffer_get(codec, b);
+}
+
+void CDR_put_string(CDR_Codec *codec, const char *str)
+{
+ unsigned int len;
+
+ len=strlen(str)+1;
+
+ CDR_put_ulong(codec, len);
+ CDR_buffer_puts(codec, str, len);
+}
+
+CORBA_boolean CDR_get_string_static(CDR_Codec *codec,
+ CORBA_char **str)
+{
+ CORBA_unsigned_long len;
+
+ if(CDR_get_ulong(codec, &len)==CORBA_FALSE)
+ return CORBA_FALSE;
+
+ if((codec->rptr + len) > codec->buf_len)
+ return CORBA_FALSE;
+
+ *str = ((CORBA_char *)codec->buffer) + codec->rptr;
+
+ codec->rptr += len;
+
+ return CORBA_TRUE;
+}
+
+CORBA_boolean CDR_get_string(CDR_Codec *codec, CORBA_char **str)
+{
+ CORBA_unsigned_long len;
+
+ if(CDR_get_ulong(codec, &len)==CORBA_FALSE)
+ return(CORBA_FALSE);
+
+ if(len==0)
+ return(CORBA_FALSE);
+
+ *str=g_new(CORBA_char, len);
+
+ if(CDR_buffer_gets(codec, *str, len)==CORBA_FALSE) {
+ g_free(*str);
+ return(CORBA_FALSE);
+ }
+
+ if((*str)[len-1]!='\0') {
+ ORBit_Trace(TraceMod_CDR, TraceLevel_Notice, "CDR_get_string: string was not NULL-terminated, terminating it now\n");
+ (*str)[len-1]='\0';
+ }
+
+ return(CORBA_TRUE);
+}
+
+CORBA_boolean CDR_get_seq_begin(CDR_Codec *codec, CORBA_unsigned_long *ul)
+{
+ return(CDR_get_ulong(codec, ul));
+}
+
+CDR_Codec *CDR_codec_init_static(CDR_Codec *codec)
+{
+ memset(codec, 0, sizeof(CDR_Codec));
+
+ codec->host_endian = FLAG_ENDIANNESS;
+
+ return codec;
+}
+
+CDR_Codec *CDR_codec_init(void)
+{
+ CDR_Codec *new;
+
+ new=g_new0(CDR_Codec, 1);
+ CDR_codec_init_static(new);
+ new->release_buffer = CORBA_TRUE;
+
+ return(new);
+}
+
+void CDR_codec_free(CDR_Codec *codec)
+{
+ if(codec->release_buffer)
+ g_free(codec->buffer);
+
+ g_free(codec);
+}
diff -urN linux-2.4.1/net/korbit/orb/cdr.h linux-2.4.1-korbit/net/korbit/orb/cdr.h
--- linux-2.4.1/net/korbit/orb/cdr.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/cdr.h Thu Feb 1 16:22:12 2001
@@ -0,0 +1,83 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#ifndef _ORBIT_CDR_H_
+#define _ORBIT_CDR_H_
+
+#include "orbit_types.h"
+
+typedef enum {
+ BigEndian=0,
+ LittleEndian=1
+} CDR_Endianness;
+
+typedef struct {
+ CDR_Endianness host_endian;
+ CDR_Endianness data_endian;
+ CORBA_octet *buffer;
+ unsigned int buf_len;
+ unsigned int wptr, rptr;
+ CORBA_boolean readonly;
+ CORBA_boolean release_buffer;
+} CDR_Codec;
+
+#define HEXDIGIT(c) (isdigit((guchar)(c))?(c)-'0':tolower((guchar)(c))-'a'+10)
+#define HEXOCTET(a,b) ((HEXDIGIT((a)) << 4) | HEXDIGIT((b)))
+
+extern CDR_Codec *CDR_codec_init(void);
+extern CDR_Codec *CDR_codec_init_static(CDR_Codec *codec);
+extern void CDR_codec_free(CDR_Codec *);
+
+extern void CDR_put_short(CDR_Codec *codec, CORBA_short s);
+extern void CDR_put_ushort(CDR_Codec *codec, CORBA_unsigned_short us);
+extern void CDR_put_long(CDR_Codec *codec, CORBA_long l);
+extern void CDR_put_ulong(CDR_Codec *codec, CORBA_unsigned_long ul);
+#ifdef HAVE_CORBA_LONG_LONG
+extern void CDR_put_long_long(CDR_Codec *codec, CORBA_long_long ll);
+extern void CDR_put_ulong_long(CDR_Codec *codec, CORBA_unsigned_long_long ull);
+extern CORBA_boolean CDR_get_ulong_long(CDR_Codec *codec, CORBA_unsigned_long_long *ul);
+extern CORBA_boolean CDR_get_long_long(CDR_Codec *codec, CORBA_long_long *ul);
+#endif
+extern void CDR_put_float(CDR_Codec *codec, CORBA_float f);
+extern void CDR_put_double(CDR_Codec *codec, CORBA_double d);
+extern void CDR_put_long_double(CDR_Codec *codec, CORBA_long_double ld);
+extern void CDR_put_octet(CDR_Codec *codec, CORBA_octet datum);
+extern void CDR_put_octets(CDR_Codec *codec, void *data, unsigned long len);
+extern void CDR_put_char(CDR_Codec *codec, CORBA_char c);
+extern void CDR_put_boolean(CDR_Codec *codec, CORBA_boolean datum);
+extern void CDR_put_string(CDR_Codec *codec, const char *str);
+extern CORBA_boolean CDR_buffer_gets(CDR_Codec *codec, void *dest, const unsigned int len);
+extern CORBA_boolean CDR_get_short(CDR_Codec *codec, CORBA_short *us);
+extern CORBA_boolean CDR_get_ushort(CDR_Codec *codec, CORBA_unsigned_short *us);
+extern CORBA_boolean CDR_get_long(CDR_Codec *codec, CORBA_long *l);
+extern CORBA_boolean CDR_get_ulong(CDR_Codec *codec, CORBA_unsigned_long *ul);
+extern CORBA_boolean CDR_get_octet(CDR_Codec *codec, CORBA_octet *datum);
+extern CORBA_boolean CDR_get_boolean(CDR_Codec *codec, CORBA_boolean *b);
+extern CORBA_boolean CDR_get_char(CDR_Codec *codec, CORBA_char *c);
+extern CORBA_boolean CDR_get_string(CDR_Codec *codec, CORBA_char **str);
+extern CORBA_boolean CDR_get_string_static(CDR_Codec *codec, CORBA_char **str);
+extern CORBA_boolean CDR_get_seq_begin(CDR_Codec *codec, CORBA_unsigned_long *ul);
+
+#endif /* !_ORBIT_CDR_H_ */
diff -urN linux-2.4.1/net/korbit/orb/corba_any.c linux-2.4.1-korbit/net/korbit/orb/corba_any.c
--- linux-2.4.1/net/korbit/orb/corba_any.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/corba_any.c Thu Feb 1 11:47:10 2001
@@ -0,0 +1,914 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Red Hat Software
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Elliot Lee <sopwith@redhat.com>
+ *
+ */
+
+#include <config.h>
+#include <IIOP/IIOP.h>
+#include "orbit.h"
+
+#if 0
+#define CORBA_Object_release(x, y) ({ g_message(__FILE__ ":%d Releasing object %#x from %d", __LINE__, \
+x, ORBIT_ROOT_OBJECT(x)->refs); CORBA_Object_release(x, y); })
+#define CORBA_Object_duplicate(x, y) ({ g_message(__FILE__ ":%d Duping object %#x from %d", __LINE__, \
+x, ORBIT_ROOT_OBJECT(x)->refs); CORBA_Object_duplicate(x, y); })
+#endif
+
+gint
+ORBit_find_alignment(CORBA_TypeCode tc)
+{
+ gint retval = 1;
+ int i;
+
+ switch(tc->kind) {
+ case CORBA_tk_union:
+ retval = MAX(retval, ORBit_find_alignment(tc->discriminator));
+ case CORBA_tk_except:
+ case CORBA_tk_struct:
+#if ALIGNOF_CORBA_STRUCT > 1
+ retval = MAX(retval, ALIGNOF_CORBA_STRUCT);
+#endif
+ for(i = 0; i < tc->sub_parts; i++)
+ retval = MAX(retval, ORBit_find_alignment(tc->subtypes[i]));
+ return retval;
+ case CORBA_tk_ulong:
+ case CORBA_tk_long:
+ case CORBA_tk_enum:
+ return ALIGNOF_CORBA_LONG;
+ case CORBA_tk_ushort:
+ case CORBA_tk_short:
+ case CORBA_tk_wchar:
+ return ALIGNOF_CORBA_SHORT;
+ case CORBA_tk_longlong:
+ case CORBA_tk_ulonglong:
+ return ALIGNOF_CORBA_LONG_LONG;
+ case CORBA_tk_longdouble:
+ return ALIGNOF_CORBA_LONG_DOUBLE;
+ case CORBA_tk_float:
+ return ALIGNOF_CORBA_FLOAT;
+ case CORBA_tk_double:
+ return ALIGNOF_CORBA_DOUBLE;
+ case CORBA_tk_boolean:
+ case CORBA_tk_char:
+ case CORBA_tk_octet:
+ return ALIGNOF_CORBA_CHAR;
+ case CORBA_tk_string:
+ case CORBA_tk_wstring:
+ case CORBA_tk_TypeCode:
+ case CORBA_tk_objref:
+ return ALIGNOF_CORBA_POINTER;
+ case CORBA_tk_sequence:
+ case CORBA_tk_any:
+ return MAX(MAX(ALIGNOF_CORBA_LONG, ALIGNOF_CORBA_STRUCT), ALIGNOF_CORBA_POINTER);
+ case CORBA_tk_array:
+ case CORBA_tk_alias:
+ return ORBit_find_alignment(tc->subtypes[0]);
+ case CORBA_tk_fixed:
+ return MAX(ALIGNOF_CORBA_SHORT, ALIGNOF_CORBA_STRUCT);
+ default:
+ return 1;
+ }
+}
+
+static void
+ORBit_marshal_value(GIOPSendBuffer *buf,
+ gpointer *val,
+ CORBA_TypeCode tc,
+ ORBit_marshal_value_info *mi)
+{
+ CORBA_unsigned_long i, ulval;
+ gpointer subval;
+ ORBit_marshal_value_info submi;
+
+#if 0
+ g_message("Marshalling a %d value from %#x to offset %d",
+ tc->kind, (gulong)*val,
+ GIOP_MESSAGE_BUFFER(buf)->message_header.message_size);
+#endif
+
+ switch(tc->kind) {
+ case CORBA_tk_wchar:
+ case CORBA_tk_ushort:
+ case CORBA_tk_short:
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_SHORT);
+ giop_message_buffer_append_mem_a(GIOP_MESSAGE_BUFFER(buf), *val, sizeof(CORBA_short));
+ *val = ((guchar *)*val) + sizeof(CORBA_short);
+ break;
+ case CORBA_tk_enum:
+ case CORBA_tk_long:
+ case CORBA_tk_ulong:
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_LONG);
+ giop_message_buffer_append_mem_a(GIOP_MESSAGE_BUFFER(buf), *val, sizeof(CORBA_long));
+ *val = ((guchar *)*val) + sizeof(CORBA_long);
+ break;
+ case CORBA_tk_float:
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_FLOAT);
+ giop_message_buffer_append_mem_a(GIOP_MESSAGE_BUFFER(buf), *val, sizeof(CORBA_float));
+ *val = ((guchar *)*val) + sizeof(CORBA_float);
+ break;
+ case CORBA_tk_double:
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_DOUBLE);
+ giop_message_buffer_append_mem_a(GIOP_MESSAGE_BUFFER(buf), *val, sizeof(CORBA_double));
+ *val = ((guchar *)*val) + sizeof(CORBA_double);
+ break;
+ case CORBA_tk_boolean:
+ case CORBA_tk_char:
+ case CORBA_tk_octet:
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(buf), *val, sizeof(CORBA_octet));
+ *val = ((guchar *)*val) + sizeof(CORBA_octet);
+ break;
+ case CORBA_tk_any:
+ *val = ALIGN_ADDRESS(*val, MAX(ALIGNOF_CORBA_STRUCT, ALIGNOF_CORBA_POINTER));
+ ORBit_marshal_any(buf, *val);
+ *val = ((guchar *)*val) + sizeof(CORBA_any);
+ break;
+ case CORBA_tk_TypeCode:
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_POINTER);
+ ORBit_encode_CORBA_TypeCode(*val, buf);
+ *val = ((guchar *)*val) + sizeof(CORBA_TypeCode);
+ break;
+ case CORBA_tk_Principal:
+ *val = ALIGN_ADDRESS(*val,
+ MAX(MAX(ALIGNOF_CORBA_LONG, ALIGNOF_CORBA_STRUCT),
+ ALIGNOF_CORBA_POINTER));
+
+ ulval = *(CORBA_unsigned_long *)(*val);
+ giop_message_buffer_append_mem_a(GIOP_MESSAGE_BUFFER(buf), *val, sizeof(CORBA_unsigned_long));
+
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(buf),
+ *(char**)((char *)*val+sizeof(CORBA_unsigned_long)),
+ ulval);
+ *val = ((guchar *)*val) + sizeof(CORBA_Principal);
+ break;
+ case CORBA_tk_objref:
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_POINTER);
+ ORBit_marshal_object(buf, *val);
+ *val = ((guchar *)*val) + sizeof(CORBA_Object);
+ break;
+ case CORBA_tk_except:
+ case CORBA_tk_struct:
+ *val = ALIGN_ADDRESS(*val, ORBit_find_alignment(tc));
+ for(i = 0; i < tc->sub_parts; i++) {
+ ORBit_marshal_value(buf, val, tc->subtypes[i], mi);
+ }
+ break;
+ case CORBA_tk_union:
+ /* Basic algorithm:
+ marshal the discriminator
+ find out which value we want to use */
+ {
+ CORBA_TypeCode utc;
+
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_STRUCT);
+
+ utc = ORBit_get_union_tag(tc, val, TRUE);
+
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_STRUCT);
+
+ ORBit_marshal_value(buf, val, tc->discriminator, mi);
+ *val = ALIGN_ADDRESS(*val, ORBit_find_alignment(tc));
+ ORBit_marshal_value(buf, val, utc, mi);
+ }
+ break;
+ case CORBA_tk_wstring:
+ ulval = strlen(*(char **)*val) + 1;
+
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_POINTER);
+ giop_send_buffer_append_mem_indirect_a(buf,
+ &ulval,
+ sizeof(CORBA_unsigned_long));
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(buf), *(char **)*val, ulval);
+
+ *val = ((guchar *)*val) + sizeof(char *);
+ break;
+ case CORBA_tk_string:
+ ulval = strlen(*(char **)*val) + 1;
+
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_POINTER);
+
+ giop_send_buffer_append_mem_indirect_a(buf,
+ &ulval,
+ sizeof(CORBA_unsigned_long));
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(buf), *(char **)*val, ulval);
+
+ *val = ((guchar *)*val) + sizeof(char *);
+ break;
+ case CORBA_tk_sequence:
+ {
+ CORBA_sequence_octet *sval = *val;
+
+ *val = ALIGN_ADDRESS(*val,
+ MAX(MAX(ALIGNOF_CORBA_LONG, ALIGNOF_CORBA_STRUCT), ALIGNOF_CORBA_POINTER));
+
+ giop_message_buffer_append_mem_a(GIOP_MESSAGE_BUFFER(buf),
+ &sval->_length,
+ sizeof(sval->_length));
+
+ subval = sval->_buffer;
+
+ for(i = 0; i < sval->_length; i++)
+ ORBit_marshal_value(buf, &subval, tc->subtypes[0], mi);
+
+ *val = ((guchar *)*val) + sizeof(CORBA_sequence_octet);
+ }
+ break;
+ case CORBA_tk_array:
+ submi.alias_element_type = tc->subtypes[0];
+ for(i = 0; i < tc->length; i++) {
+ ORBit_marshal_value(buf, val, submi.alias_element_type, &submi);
+ *val = ALIGN_ADDRESS(*val, ORBit_find_alignment(tc->subtypes[0]));
+ }
+ break;
+ case CORBA_tk_alias:
+ submi.alias_element_type = tc->subtypes[0];
+ ORBit_marshal_value(buf, val, submi.alias_element_type, &submi);
+ break;
+ case CORBA_tk_longlong:
+ case CORBA_tk_ulonglong:
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_LONG_LONG);
+ giop_message_buffer_append_mem_a(GIOP_MESSAGE_BUFFER(buf), *val, sizeof(CORBA_long_long));
+ return /* *val + sizeof(CORBA_long_long)*/;
+ break;
+ case CORBA_tk_longdouble:
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_LONG_DOUBLE);
+ giop_message_buffer_append_mem_a(GIOP_MESSAGE_BUFFER(buf), *val, sizeof(CORBA_long_double));
+ return /* *val + sizeof(CORBA_long_double)*/;
+ break;
+ case CORBA_tk_fixed:
+ /* XXX todo */
+ g_error("CORBA_fixed NYI");
+
+ break;
+ case CORBA_tk_null:
+ case CORBA_tk_void:
+ break;
+ default:
+ g_error("Can't encode unknown type %d", tc->kind);
+ }
+}
+
+static glong ORBit_get_union_switch(CORBA_TypeCode tc, gpointer *val, gboolean update)
+{
+#ifdef __KORBIT__
+ glong retval = 0;
+#else
+ glong retval;
+#endif
+
+ switch(tc->kind) {
+ case CORBA_tk_ulong:
+ case CORBA_tk_long:
+ case CORBA_tk_enum:
+ retval = *(CORBA_long *)*val;
+ if(update) *val += sizeof(CORBA_long);
+ break;
+ case CORBA_tk_ushort:
+ case CORBA_tk_short:
+ retval = *(CORBA_short *)*val;
+ if(update) *val += sizeof(CORBA_short);
+ break;
+ case CORBA_tk_char:
+ case CORBA_tk_boolean:
+ case CORBA_tk_octet:
+ retval = *(CORBA_octet *)*val;
+ if(update) *val += sizeof(CORBA_char);
+ break;
+ case CORBA_tk_alias:
+ return ORBit_get_union_switch(tc->subtypes[0], val, update);
+ break;
+ default:
+ g_error("Wow, some nut has passed us a weird type[%d] as a union discriminator!", tc->kind);
+ }
+
+ return retval;
+}
+
+/* This function (and the one above it) exist for the
+ sole purpose of finding out which CORBA_TypeCode a union discriminator value
+ indicates.
+
+ If {update} is TRUE, {*val} will be advanced by the native size
+ of the descriminator type.
+
+ Hairy stuff.
+*/
+CORBA_TypeCode
+ORBit_get_union_tag(CORBA_TypeCode union_tc, gpointer *val, gboolean update)
+{
+ glong discrim_val, case_val;
+ int i;
+ CORBA_TypeCode retval = CORBA_OBJECT_NIL;
+
+ discrim_val = ORBit_get_union_switch(union_tc->discriminator, val, update);
+
+ for(i = 0; i < union_tc->sub_parts; i++) {
+ if(i == union_tc->default_index)
+ continue;
+
+ case_val = ORBit_get_union_switch(union_tc->sublabels[i]._type,
+ &union_tc->sublabels[i]._value, FALSE);
+ if(case_val == discrim_val) {
+ retval = union_tc->subtypes[i];
+ break;
+ }
+ }
+
+ if(retval)
+ return retval;
+ else if(union_tc->default_index >= 0)
+ return union_tc->subtypes[union_tc->default_index];
+ else {
+ return TC_null;
+ }
+}
+
+void
+ORBit_marshal_arg(GIOPSendBuffer *buf,
+ gpointer val,
+ CORBA_TypeCode tc)
+{
+ ORBit_marshal_value_info mi;
+
+ ORBit_marshal_value(buf, &val, tc, &mi);
+}
+
+
+void
+ORBit_marshal_any(GIOPSendBuffer *buf, const CORBA_any *val)
+{
+ ORBit_marshal_value_info mi;
+
+ gpointer mval = val->_value;
+
+ ORBit_encode_CORBA_TypeCode(val->_type, buf);
+
+ ORBit_marshal_value(buf, &mval, val->_type, &mi);
+}
+
+size_t
+ORBit_gather_alloc_info(CORBA_TypeCode tc)
+{
+ int i, n, align=1, prevalign, sum, prev;
+ size_t block_size;
+
+ switch(tc->kind) {
+ case CORBA_tk_long:
+ case CORBA_tk_ulong:
+ case CORBA_tk_enum:
+ return sizeof(CORBA_long);
+ break;
+ case CORBA_tk_short:
+ case CORBA_tk_ushort:
+ return sizeof(CORBA_short);
+ break;
+ case CORBA_tk_float:
+ return sizeof(CORBA_float);
+ break;
+ case CORBA_tk_double:
+ return sizeof(CORBA_double);
+ break;
+ case CORBA_tk_boolean:
+ case CORBA_tk_char:
+ case CORBA_tk_octet:
+ return sizeof(CORBA_octet);
+ break;
+ case CORBA_tk_any:
+ return sizeof(CORBA_any);
+ break;
+ case CORBA_tk_TypeCode:
+ return sizeof(CORBA_TypeCode);
+ break;
+ case CORBA_tk_Principal:
+ return sizeof(CORBA_Principal);
+ break;
+ case CORBA_tk_objref:
+ return sizeof(CORBA_Object);
+ break;
+ case CORBA_tk_except:
+ case CORBA_tk_struct:
+ sum = 0;
+ for(i = 0; i < tc->sub_parts; i++) {
+ sum = GPOINTER_TO_INT(ALIGN_ADDRESS(sum, ORBit_find_alignment(tc->subtypes[i])));
+ sum += ORBit_gather_alloc_info(tc->subtypes[i]);
+ }
+ sum = GPOINTER_TO_INT(ALIGN_ADDRESS(sum, ORBit_find_alignment(tc)));
+ return sum;
+ break;
+ case CORBA_tk_union:
+ sum = ORBit_gather_alloc_info(tc->discriminator);
+ n = -1;
+ align = 1;
+ for(prev = prevalign = i = 0; i < tc->sub_parts; i++) {
+ prevalign = align;
+ align = ORBit_find_alignment(tc->subtypes[i]);
+ if(align > prevalign)
+ n = i;
+
+ prev = MAX(prev, ORBit_gather_alloc_info(tc->subtypes[i]));
+ }
+ if(n >= 0)
+ sum = GPOINTER_TO_INT(ALIGN_ADDRESS(sum, ORBit_find_alignment(tc->subtypes[n])));
+ sum += prev;
+ sum = GPOINTER_TO_INT(ALIGN_ADDRESS(sum, ORBit_find_alignment(tc)));
+ return sum;
+ break;
+ case CORBA_tk_wstring:
+ case CORBA_tk_string:
+ return sizeof(char *);
+ break;
+ case CORBA_tk_sequence:
+ return sizeof(CORBA_sequence_octet);
+ break;
+ case CORBA_tk_array:
+ block_size = ORBit_gather_alloc_info(tc->subtypes[0]);
+ return block_size * tc->length;
+ break;
+ case CORBA_tk_alias:
+ return ORBit_gather_alloc_info(tc->subtypes[0]);
+ case CORBA_tk_longlong:
+ case CORBA_tk_ulonglong:
+ return sizeof(CORBA_long_long);
+ case CORBA_tk_longdouble:
+ return sizeof(CORBA_long_double);
+ case CORBA_tk_wchar:
+ return sizeof(CORBA_wchar);
+ case CORBA_tk_fixed:
+ return sizeof(CORBA_fixed_d_s);
+ default:
+ return 0;
+ }
+}
+
+/* to allocate a block, we need to know of any important data
+ contained in it.
+*/
+static gpointer
+ORBit_demarshal_allocate_mem(CORBA_TypeCode tc, gint nelements)
+{
+ size_t block_size;
+ gpointer retval = NULL;
+
+ if(!nelements) return retval;
+
+ block_size = ORBit_gather_alloc_info(tc);
+
+ if(block_size) {
+ retval = ORBit_alloc_2(block_size * nelements,
+ (ORBit_free_childvals)ORBit_free_via_TypeCode,
+ GINT_TO_POINTER(nelements),
+ sizeof(CORBA_TypeCode));
+
+ *(CORBA_TypeCode *)((char *)retval-sizeof(ORBit_mem_info)-sizeof(CORBA_TypeCode)) = (CORBA_TypeCode)CORBA_Object_duplicate((CORBA_Object)tc, NULL);
+ }
+
+ return retval;
+}
+
+#define DM_GET_ATOM(x, n) G_STMT_START{ GIOP_RECV_BUFFER(buf)->decoder(x, (GIOP_RECV_BUFFER(buf)->cur), n); GIOP_RECV_BUFFER(buf)->cur = ((guchar *)GIOP_RECV_BUFFER(buf)->cur) + n; }G_STMT_END
+
+static void
+ORBit_demarshal_value(GIOPRecvBuffer *buf,
+ gpointer *val,
+ CORBA_TypeCode tc,
+ gboolean dup_strings,
+ CORBA_ORB orb)
+{
+ CORBA_long i, n;
+
+#if 0
+ g_message("Demarshalling a %d value from offset %d into %#x",
+ tc->kind, buf->cur - buf->message_body, (gulong)*val);
+#endif
+
+ switch(tc->kind) {
+ case CORBA_tk_short:
+ case CORBA_tk_ushort:
+ case CORBA_tk_wchar:
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_SHORT);
+ buf->cur = ALIGN_ADDRESS(buf->cur, sizeof(CORBA_short));
+ DM_GET_ATOM(*val, sizeof(CORBA_short));
+ *val = ((guchar *)*val) + sizeof(CORBA_short);
+ break;
+ case CORBA_tk_long:
+ case CORBA_tk_ulong:
+ case CORBA_tk_enum:
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_LONG);
+ buf->cur = ALIGN_ADDRESS(buf->cur, sizeof(CORBA_long));
+ DM_GET_ATOM(*val, sizeof(CORBA_long));
+ *val = ((guchar *)*val) + sizeof(CORBA_long);
+ break;
+ case CORBA_tk_longlong:
+ case CORBA_tk_ulonglong:
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_LONG_LONG);
+ buf->cur = ALIGN_ADDRESS(buf->cur, sizeof(CORBA_long_long));
+ DM_GET_ATOM(*val, sizeof(CORBA_long_long));
+ *val = ((guchar *)*val) + sizeof(CORBA_long_long);
+ break;
+ case CORBA_tk_longdouble:
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_LONG_DOUBLE);
+ buf->cur = ALIGN_ADDRESS(buf->cur, sizeof(CORBA_long_double));
+ DM_GET_ATOM(*val, sizeof(CORBA_long_double));
+ *val = ((guchar *)*val) + sizeof(CORBA_long_double);
+ break;
+ case CORBA_tk_float:
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_FLOAT);
+ buf->cur = ALIGN_ADDRESS(buf->cur, sizeof(CORBA_float));
+ DM_GET_ATOM(*val, sizeof(CORBA_float));
+ *val = ((guchar *)*val) + sizeof(CORBA_float);
+ break;
+ case CORBA_tk_double:
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_DOUBLE);
+ buf->cur = ALIGN_ADDRESS(buf->cur, sizeof(CORBA_double));
+ DM_GET_ATOM(*val, sizeof(CORBA_double));
+ *val = ((guchar *)*val) + sizeof(CORBA_double);
+ break;
+ case CORBA_tk_boolean:
+ case CORBA_tk_char:
+ case CORBA_tk_octet:
+ DM_GET_ATOM(*val, sizeof(CORBA_octet));
+ *val = ((guchar *)*val) + sizeof(CORBA_octet);
+ break;
+ case CORBA_tk_any:
+ {
+ CORBA_any *decoded;
+
+ *val = ALIGN_ADDRESS(*val,
+ MAX(ALIGNOF_CORBA_LONG,
+ MAX(ALIGNOF_CORBA_POINTER, ALIGNOF_CORBA_STRUCT)));
+ decoded = *val;
+ decoded->_release = CORBA_FALSE;
+ ORBit_demarshal_any(buf, decoded, dup_strings, orb);
+ *val = ((guchar *)*val) + sizeof(CORBA_any);
+ }
+ break;
+ case CORBA_tk_TypeCode:
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_POINTER);
+ ORBit_decode_CORBA_TypeCode(*val, buf);
+ CORBA_Object_duplicate(*(CORBA_Object *)*val, NULL);
+ *val = ((guchar *)*val) + sizeof(CORBA_TypeCode);
+ break;
+ case CORBA_tk_Principal:
+ {
+ CORBA_Principal *p;
+
+ *val = ALIGN_ADDRESS(*val, MAX(ALIGNOF_CORBA_STRUCT,
+ MAX(ALIGNOF_CORBA_LONG, ALIGNOF_CORBA_POINTER)));
+
+ p = *val;
+ buf->cur = ALIGN_ADDRESS(buf->cur, sizeof(CORBA_long));
+ CORBA_sequence_set_release(p, dup_strings);
+ DM_GET_ATOM(&p->_length, sizeof(CORBA_long));
+ p->_buffer = ORBit_alloc(p->_length, NULL, GINT_TO_POINTER(1));
+ memcpy(p->_buffer, buf->cur, p->_length);
+ buf->cur = ((guchar *)buf->cur) + p->_length;
+ *val = ((guchar *)*val) + sizeof(CORBA_sequence_octet);
+ }
+ break;
+ case CORBA_tk_objref:
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_POINTER);
+ *(CORBA_Object *)*val = ORBit_demarshal_object(buf, orb);
+ *val = ((guchar *)*val) + sizeof(CORBA_Object);
+ break;
+ case CORBA_tk_except:
+ case CORBA_tk_struct:
+ *val = ALIGN_ADDRESS(*val, ORBit_find_alignment(tc));
+ for(i = 0; i < tc->sub_parts; i++) {
+ ORBit_demarshal_value(buf, val, tc->subtypes[i], dup_strings, orb);
+ }
+ break;
+ case CORBA_tk_union:
+ {
+ gpointer discrimptr;
+
+ discrimptr = *val = ALIGN_ADDRESS(*val, ORBit_find_alignment(tc));
+ ORBit_demarshal_value(buf, val, tc->discriminator, dup_strings, orb);
+ n = 1;
+ for(i = 0; i < tc->sub_parts; i++) {
+ n = MAX(n, ORBit_find_alignment(tc->subtypes[i]));
+ }
+ *val = ALIGN_ADDRESS(*val, n);
+ ORBit_demarshal_value(buf, val,
+ ORBit_get_union_tag(tc, &discrimptr, FALSE),
+ dup_strings, orb);
+ }
+ break;
+ case CORBA_tk_string:
+ case CORBA_tk_wstring:
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_POINTER);
+ buf->cur = ALIGN_ADDRESS(buf->cur, sizeof(CORBA_long));
+ DM_GET_ATOM(&i, sizeof(CORBA_long));
+ if(dup_strings)
+ *(char **)*val = CORBA_string_dup(buf->cur);
+ else
+ *(char **)*val = buf->cur;
+ *val = ((guchar *)*val) + sizeof(CORBA_char *);
+ buf->cur = (gpointer)((char *)buf->cur + i);
+ break;
+ case CORBA_tk_sequence:
+ {
+ CORBA_sequence_octet *p;
+ gpointer subval;
+
+ *val = ALIGN_ADDRESS(*val, MAX(ALIGNOF_CORBA_STRUCT,
+ MAX(ALIGNOF_CORBA_LONG, ALIGNOF_CORBA_POINTER)));
+ p = *val;
+ buf->cur = ALIGN_ADDRESS(buf->cur, sizeof(CORBA_long));
+ DM_GET_ATOM(&p->_length, sizeof(CORBA_long));
+ if(tc->subtypes[0]->kind == CORBA_tk_octet
+ || tc->subtypes[0]->kind == CORBA_tk_boolean
+ || tc->subtypes[0]->kind == CORBA_tk_char) {
+ /* This special-casing could be taken further to apply to
+ all atoms... */
+ p->_buffer = ORBit_alloc(p->_length, NULL, GINT_TO_POINTER(1));
+ memcpy(p->_buffer, buf->cur, p->_length);
+ buf->cur = ((guchar *)buf->cur) + p->_length;
+ } else {
+ p->_buffer = ORBit_demarshal_allocate_mem(tc->subtypes[0],
+ p->_length);
+ subval = p->_buffer;
+
+ for(i = 0; i < p->_length; i++)
+ ORBit_demarshal_value(buf, &subval,
+ tc->subtypes[0],
+ dup_strings,
+ orb);
+ }
+
+ *val = ((guchar *)*val) + sizeof(CORBA_sequence_octet);
+ }
+ break;
+ case CORBA_tk_array:
+ for(i = 0; i < tc->length; i++)
+ ORBit_demarshal_value(buf, val, tc->subtypes[0], dup_strings, orb);
+ break;
+ case CORBA_tk_alias:
+ ORBit_demarshal_value(buf, val, tc->subtypes[0], dup_strings, orb);
+ break;
+ case CORBA_tk_fixed:
+ g_error("CORBA_fixed NYI");
+ break;
+ default:
+ break;
+ }
+}
+
+gpointer
+ORBit_demarshal_arg(GIOPRecvBuffer *buf,
+ CORBA_TypeCode tc,
+ gboolean dup_strings,
+ CORBA_ORB orb)
+{
+ gpointer retval, val;
+
+ retval = val = ORBit_demarshal_allocate_mem(tc, 1);
+
+ ORBit_demarshal_value(buf, &val, tc, dup_strings, orb);
+
+ return retval;
+}
+
+void
+ORBit_demarshal_any(GIOPRecvBuffer *buf, CORBA_any *retval,
+ gboolean dup_strings,
+ CORBA_ORB orb)
+{
+ gpointer val;
+
+#if 0
+ /* I wish I knew whether this was correct or not. It breaks things like 'any anop();' for sure,
+ since we can't always initialize every single possible 'any' underneath _ORBIT_retval */
+ if(retval->_release)
+ CORBA_free(retval->_value);
+#endif
+
+ CORBA_any_set_release(retval, CORBA_TRUE);
+
+ ORBit_decode_CORBA_TypeCode(&retval->_type, buf);
+ CORBA_Object_duplicate((CORBA_Object)retval->_type, NULL);
+
+ val = retval->_value = ORBit_demarshal_allocate_mem(retval->_type, 1);
+ ORBit_demarshal_value(buf, &val, retval->_type, dup_strings, orb);
+}
+
+void
+_ORBit_copy_value(gpointer *val, gpointer *newval, CORBA_TypeCode tc)
+{
+ CORBA_long i;
+ gpointer pval1, pval2;
+
+ switch(tc->kind) {
+ case CORBA_tk_wchar:
+ case CORBA_tk_short:
+ case CORBA_tk_ushort:
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_SHORT);
+ *newval = ALIGN_ADDRESS(*newval, ALIGNOF_CORBA_SHORT);
+ *(CORBA_short *)*newval = *(CORBA_short *)*val;
+ *val = ((guchar *)*val) + sizeof(CORBA_short);
+ *newval = ((guchar *)*newval) + sizeof(CORBA_short);
+ break;
+ case CORBA_tk_enum:
+ case CORBA_tk_long:
+ case CORBA_tk_ulong:
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_LONG);
+ *newval = ALIGN_ADDRESS(*newval, ALIGNOF_CORBA_LONG);
+ *(CORBA_long *)*newval = *(CORBA_long *)*val;
+ *val = ((guchar *)*val) + sizeof(CORBA_long);
+ *newval = ((guchar *)*newval) + sizeof(CORBA_long);
+ break;
+ case CORBA_tk_longlong:
+ case CORBA_tk_ulonglong:
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_LONG_LONG);
+ *newval = ALIGN_ADDRESS(*newval, ALIGNOF_CORBA_LONG_LONG);
+ *(CORBA_long_long *)*newval = *(CORBA_long_long *)*val;
+ *val = ((guchar *)*val) + sizeof(CORBA_long_long);
+ *newval = ((guchar *)*newval) + sizeof(CORBA_long_long);
+ break;
+ case CORBA_tk_longdouble:
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_LONG_DOUBLE);
+ *newval = ALIGN_ADDRESS(*newval, ALIGNOF_CORBA_LONG_DOUBLE);
+ *(CORBA_long_double *)*newval = *(CORBA_long_double *)*val;
+ *val = ((guchar *)*val) + sizeof(CORBA_long_double);
+ *newval = ((guchar *)*newval) + sizeof(CORBA_long_double);
+ break;
+ case CORBA_tk_float:
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_FLOAT);
+ *newval = ALIGN_ADDRESS(*newval, ALIGNOF_CORBA_FLOAT);
+ *(CORBA_long *)*newval = *(CORBA_long *)*val;
+ *val = ((guchar *)*val) + sizeof(CORBA_float);
+ *newval = ((guchar *)*newval) + sizeof(CORBA_float);
+ break;
+ case CORBA_tk_double:
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_DOUBLE);
+ *newval = ALIGN_ADDRESS(*newval, ALIGNOF_CORBA_DOUBLE);
+ *(CORBA_double *)*newval = *(CORBA_double *)*val;
+ *val = ((guchar *)*val) + sizeof(CORBA_double);
+ *newval = ((guchar *)*newval) + sizeof(CORBA_double);
+ break;
+ case CORBA_tk_boolean:
+ case CORBA_tk_char:
+ case CORBA_tk_octet:
+ *(CORBA_octet *)*newval = *(CORBA_octet *)*val;
+ *val = ((guchar *)*val) + sizeof(CORBA_octet);
+ *newval = ((guchar *)*newval) + sizeof(CORBA_octet);
+ break;
+ case CORBA_tk_any:
+ {
+ CORBA_any *oldany, *newany;
+ *val = ALIGN_ADDRESS(*val, MAX(ALIGNOF_CORBA_STRUCT, ALIGNOF_CORBA_POINTER));
+ *newval = ALIGN_ADDRESS(*newval, MAX(ALIGNOF_CORBA_STRUCT, ALIGNOF_CORBA_POINTER));
+ oldany = *val;
+ newany = *newval;
+ newany->_type = (CORBA_TypeCode)CORBA_Object_duplicate((CORBA_Object)oldany->_type, NULL);
+ /* XXX are we supposed to do this even if oldany->_release
+ == FALSE? */
+ newany->_value = ORBit_copy_value(oldany->_value, oldany->_type);
+ newany->_release = CORBA_TRUE;
+ *val = ((guchar *)*val) + sizeof(CORBA_any);
+ *newval = ((guchar *)*newval) + sizeof(CORBA_any);
+ }
+ break;
+ case CORBA_tk_Principal:
+ *val = ALIGN_ADDRESS(*val,
+ MAX(MAX(ALIGNOF_CORBA_LONG,
+ ALIGNOF_CORBA_STRUCT),
+ ALIGNOF_CORBA_POINTER));
+ *newval = ALIGN_ADDRESS(*newval,
+ MAX(MAX(ALIGNOF_CORBA_LONG,
+ ALIGNOF_CORBA_STRUCT),
+ ALIGNOF_CORBA_POINTER));
+ *(CORBA_Principal *)*newval = *(CORBA_Principal *)*val;
+ ((CORBA_Principal *)*newval)->_buffer =
+ CORBA_octet_allocbuf(((CORBA_Principal *)*newval)->_length);
+ memcpy(((CORBA_Principal *)*newval)->_buffer,
+ ((CORBA_Principal *)*val)->_buffer,
+ ((CORBA_Principal *)*val)->_length);
+ *val = ((guchar *)*val) + sizeof(CORBA_Principal);
+ *newval = ((guchar *)*newval) + sizeof(CORBA_Principal);
+ break;
+ case CORBA_tk_TypeCode:
+ case CORBA_tk_objref:
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_POINTER);
+ *newval = ALIGN_ADDRESS(*newval, ALIGNOF_CORBA_POINTER);
+ *(CORBA_Object *)*newval = CORBA_Object_duplicate(*(CORBA_Object *)*val,
+ NULL);
+ *val = ((guchar *)*val) + sizeof(CORBA_Object);
+ *newval = ((guchar *)*newval) + sizeof(CORBA_Object);
+ break;
+ case CORBA_tk_struct:
+ case CORBA_tk_except:
+ *val = ALIGN_ADDRESS(*val, ORBit_find_alignment(tc));
+ *newval = ALIGN_ADDRESS(*newval, ORBit_find_alignment(tc));
+ for(i = 0; i < tc->sub_parts; i++) {
+ _ORBit_copy_value(val, newval, tc->subtypes[i]);
+ }
+ break;
+ case CORBA_tk_union:
+ {
+ CORBA_TypeCode utc = ORBit_get_union_tag(tc, val, FALSE);
+ gint union_align = ORBit_find_alignment(tc);
+ size_t union_size = ORBit_gather_alloc_info(tc);
+
+ /* need to advance val,newval by size of union, not just
+ * current tagged field within it */
+ pval1 = *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_STRUCT);
+ pval2 = *newval = ALIGN_ADDRESS(*newval, ALIGNOF_CORBA_STRUCT);
+ _ORBit_copy_value(&pval1, &pval2, tc->discriminator);
+ pval1 = ALIGN_ADDRESS(pval1, union_align);
+ pval2 = ALIGN_ADDRESS(pval2, union_align);
+ _ORBit_copy_value(&pval1, &pval2, utc);
+ *val = ((guchar *)*val) + union_size;
+ *newval = ((guchar *)*newval) + union_size;
+ }
+ break;
+ case CORBA_tk_wstring:
+ case CORBA_tk_string:
+ *val = ALIGN_ADDRESS(*val, ALIGNOF_CORBA_POINTER);
+ *newval = ALIGN_ADDRESS(*newval, ALIGNOF_CORBA_POINTER);
+
+ *(CORBA_char **)*newval = CORBA_string_dup(*(CORBA_char **)*val);
+ *val = ((guchar *)*val) + sizeof(CORBA_char *);
+ *newval = ((guchar *)*newval) + sizeof(CORBA_char *);
+ break;
+ case CORBA_tk_sequence:
+ *val = ALIGN_ADDRESS(*val,
+ MAX(MAX(ALIGNOF_CORBA_LONG,
+ ALIGNOF_CORBA_STRUCT),
+ ALIGNOF_CORBA_POINTER));
+ *newval = ALIGN_ADDRESS(*newval,
+ MAX(MAX(ALIGNOF_CORBA_LONG,
+ ALIGNOF_CORBA_STRUCT),
+ ALIGNOF_CORBA_POINTER));
+ ((CORBA_Principal *)*newval)->_release = CORBA_TRUE;
+ ((CORBA_Principal *)*newval)->_length =
+ ((CORBA_Principal *)*newval)->_maximum =
+ ((CORBA_Principal *)*val)->_length;
+ ((CORBA_Principal *)*newval)->_buffer = pval2 =
+ ORBit_demarshal_allocate_mem(tc->subtypes[0],
+ ((CORBA_Principal *)*val)->_length);
+ pval1 = ((CORBA_Principal *)*val)->_buffer;
+
+ for(i = 0; i < ((CORBA_Principal *)*newval)->_length; i++) {
+ _ORBit_copy_value(&pval1, &pval2, tc->subtypes[0]);
+ }
+ *val = ((guchar *)*val) + sizeof(CORBA_sequence_octet);
+ *newval = ((guchar *)*newval) + sizeof(CORBA_sequence_octet);
+ break;
+ case CORBA_tk_array:
+ for(i = 0; i < tc->length; i++) {
+ _ORBit_copy_value(val, newval, tc->subtypes[0]);
+ }
+ break;
+ case CORBA_tk_alias:
+ _ORBit_copy_value(val, newval, tc->subtypes[0]);
+ break;
+ case CORBA_tk_fixed:
+ g_error("CORBA_fixed NYI!");
+ break;
+ case CORBA_tk_void:
+ case CORBA_tk_null:
+ *val = NULL;
+ break;
+ default:
+ g_error("Can't handle copy of value kind %d", tc->kind);
+ }
+}
+
+gpointer
+ORBit_copy_value(gpointer value, CORBA_TypeCode tc)
+{
+ gpointer retval, newval;
+
+ retval = newval = ORBit_demarshal_allocate_mem(tc, 1);
+ _ORBit_copy_value(&value, &newval, tc);
+
+ return retval;
+}
+
+void
+CORBA_any__copy(CORBA_any *out, CORBA_any *in)
+{
+ out->_type = (CORBA_TypeCode)CORBA_Object_duplicate((CORBA_Object)in->_type,
+ NULL);
+ out->_value = ORBit_copy_value(in->_value, in->_type);
+ out->_release = CORBA_TRUE;
+}
diff -urN linux-2.4.1/net/korbit/orb/corba_any.h linux-2.4.1-korbit/net/korbit/orb/corba_any.h
--- linux-2.4.1/net/korbit/orb/corba_any.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/corba_any.h Thu Feb 1 16:20:50 2001
@@ -0,0 +1,45 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#ifndef _ORBIT_CORBA_ANY_H_
+#define _ORBIT_CORBA_ANY_H_
+
+#include "orbit_types.h"
+#include "corba_typecode.h"
+
+#include <unistd.h>
+
+typedef struct CORBA_any_type CORBA_any;
+
+size_t ORBit_gather_alloc_info(CORBA_TypeCode tc);
+gint ORBit_find_alignment(CORBA_TypeCode tc);
+CORBA_TypeCode ORBit_get_union_tag(CORBA_TypeCode union_tc,
+ gpointer *val, gboolean update);
+gpointer ORBit_copy_value(gpointer value, CORBA_TypeCode tc);
+void _ORBit_copy_value(gpointer *val, gpointer *newval, CORBA_TypeCode tc);
+
+void CORBA_any__copy(CORBA_any *out, CORBA_any *in);
+
+#endif /* !_ORBIT_CORBA_ANY_H_ */
diff -urN linux-2.4.1/net/korbit/orb/corba_any_proto.h linux-2.4.1-korbit/net/korbit/orb/corba_any_proto.h
--- linux-2.4.1/net/korbit/orb/corba_any_proto.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/corba_any_proto.h Thu Feb 1 11:47:11 2001
@@ -0,0 +1,16 @@
+#ifndef _ORBIT_CORBA_ANY_PROTO_H_
+#define _ORBIT_CORBA_ANY_PROTO_H_
+
+void ORBit_marshal_arg(GIOPSendBuffer *buf,
+ gpointer val,
+ CORBA_TypeCode tc);
+void ORBit_marshal_any(GIOPSendBuffer *buf, const CORBA_any *val);
+gpointer ORBit_demarshal_arg(GIOPRecvBuffer *buf,
+ CORBA_TypeCode tc,
+ gboolean dup_strings,
+ CORBA_ORB orb);
+void ORBit_demarshal_any(GIOPRecvBuffer *buf, CORBA_any *retval,
+ gboolean dup_strings,
+ CORBA_ORB orb);
+
+#endif /* !_ORBIT_CORBA_ANY_PROTO_H_ */
diff -urN linux-2.4.1/net/korbit/orb/corba_any_type.h linux-2.4.1-korbit/net/korbit/orb/corba_any_type.h
--- linux-2.4.1/net/korbit/orb/corba_any_type.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/corba_any_type.h Thu Feb 1 16:20:50 2001
@@ -0,0 +1,48 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@acm.org>
+ *
+ */
+
+#ifndef _ORBIT_CORBA_ANY_TYPE_H_
+#define _ORBIT_CORBA_ANY_TYPE_H_
+
+#include "corba_any.h"
+#include "corba_typecode.h"
+
+struct CORBA_any_type {
+ CORBA_TypeCode _type;
+ gpointer _value;
+ CORBA_boolean _release;
+};
+
+typedef struct ORBit_marshal_value_info_struct {
+ CORBA_TypeCode alias_element_type;
+} ORBit_marshal_value_info;
+
+#define CORBA_ANYFLAGS_RELEASE 1
+
+
+#endif /* !_ORBIT_CORBA_ANY_TYPE_H_ */
+
+
+
diff -urN linux-2.4.1/net/korbit/orb/corba_basic_sequences_type.h linux-2.4.1-korbit/net/korbit/orb/corba_basic_sequences_type.h
--- linux-2.4.1/net/korbit/orb/corba_basic_sequences_type.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/corba_basic_sequences_type.h Thu Feb 1 11:47:11 2001
@@ -0,0 +1,43 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#ifndef _ORBIT_CORBA_BASIC_SEQUENCES_TYPE_H_
+#define _ORBIT_CORBA_BASIC_SEQUENCES_TYPE_H_
+
+#include <ORBitutil/basic_types.h>
+
+#ifndef _CORBA_sequence_octet_defined
+#define _CORBA_sequence_octet_defined 1
+
+typedef struct CORBA_sequence_octet_struct {
+ CORBA_unsigned_long _maximum;
+ CORBA_unsigned_long _length;
+ CORBA_octet *_buffer;
+ CORBA_boolean _release;
+} CORBA_sequence_octet;
+#endif /* !_CORBA_sequence_octet_defined */
+
+#include <orb/corba_sequences.h>
+#endif /* !_ORBIT_CORBA_BASIC_SEQUENCES_TYPE_H_ */
diff -urN linux-2.4.1/net/korbit/orb/corba_context.c linux-2.4.1-korbit/net/korbit/orb/corba_context.c
--- linux-2.4.1/net/korbit/orb/corba_context.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/corba_context.c Thu Feb 1 11:47:11 2001
@@ -0,0 +1,390 @@
+#include "orb/orbit.h"
+
+#define o_return_val_if_fail(expr, val) if(!(expr)) { CORBA_exception_set_system(ev, ex_CORBA_BAD_PARAM, CORBA_COMPLETED_NO); return (val); }
+#define o_return_if_fail(expr) if(!(expr)) { CORBA_exception_set_system(ev, ex_CORBA_BAD_PARAM, CORBA_COMPLETED_NO); return; }
+
+static gboolean
+free_entry(gpointer key, gpointer value, gpointer user_data)
+{
+ g_free(key);
+ g_free(value);
+
+ return TRUE;
+}
+
+static void
+ORBit_Context_release(CORBA_Context ctx, CORBA_Environment *ev);
+
+static gboolean
+free_child(gpointer value, gpointer user_data)
+{
+ CORBA_Context ctx = value;
+
+ ORBIT_ROOT_OBJECT(ctx)->refs = 1;
+ ctx->parent_ctx = CORBA_OBJECT_NIL;
+ ORBit_Context_release(ctx, NULL);
+
+ return TRUE;
+}
+
+static void
+ORBit_Context_release(CORBA_Context ctx,
+ CORBA_Environment *ev)
+{
+ ORBIT_ROOT_OBJECT_UNREF(ctx);
+
+ if(ORBIT_ROOT_OBJECT(ctx)->refs <= 0) {
+ if(ctx->children) {
+ g_slist_foreach(ctx->children, (GFunc)free_child, ctx);
+ g_slist_free(ctx->children);
+ }
+
+ if(ctx->mappings) {
+ g_hash_table_foreach_remove(ctx->mappings, free_entry, ctx);
+ g_hash_table_destroy(ctx->mappings);
+ }
+
+ if(ctx->parent_ctx != CORBA_OBJECT_NIL)
+ ctx->parent_ctx->children = g_slist_remove(ctx->parent_ctx->children, ctx->the_name);
+
+ g_free(ctx->the_name);
+
+ g_free(ctx);
+ }
+}
+
+static const ORBit_RootObject_Interface CORBA_Context_epv =
+{
+ (void (*)(gpointer, CORBA_Environment *))ORBit_Context_release,
+};
+
+static CORBA_Context
+CORBA_Context_new(CORBA_Context parent, const char *name, CORBA_Environment *ev)
+{
+ CORBA_Context retval;
+
+ retval = g_new0(struct CORBA_Context_type, 1);
+
+ ORBit_pseudo_object_init(ORBIT_PSEUDO_OBJECT(retval), ORBIT_PSEUDO_CONTEXT, ev);
+
+ ORBIT_ROOT_OBJECT(retval)->refs = 0;
+ ORBit_RootObject_set_interface(ORBIT_ROOT_OBJECT(retval), (gpointer)&CORBA_Context_epv, ev);
+
+ if(name)
+ retval->the_name = g_strdup(name);
+
+ retval->parent_ctx = parent;
+ if(parent)
+ parent->children = g_slist_prepend(parent->children, retval);
+
+ return retval;
+}
+
+/* Section 5.6.1 */
+CORBA_Status CORBA_ORB_get_default_context(CORBA_ORB orb, CORBA_Context *ctx, CORBA_Environment *ev)
+{
+ g_return_if_fail(ev != NULL);
+ o_return_if_fail(orb && ctx);
+
+ if(!orb->default_ctx)
+ orb->default_ctx = CORBA_Context_new(CORBA_OBJECT_NIL, NULL, ev);
+
+ *ctx = (CORBA_Context)CORBA_Object_duplicate((CORBA_Object)orb->default_ctx, ev);
+}
+
+/********* XXX todo - CORBA_Context support */
+CORBA_Status CORBA_Context_set_one_value(CORBA_Context ctx, CORBA_Identifier prop_name, char *value, CORBA_Environment *ev)
+{
+ gpointer old_nom, old_value;
+ g_return_if_fail(ev != NULL);
+ o_return_if_fail(ctx && prop_name && value);
+
+ if(!ctx->mappings)
+ ctx->mappings = g_hash_table_new(g_str_hash, g_str_equal);
+
+ if(g_hash_table_lookup_extended(ctx->mappings, prop_name, &old_nom, &old_value)) {
+ g_free(old_nom);
+ g_free(old_value);
+ }
+
+ g_hash_table_insert(ctx->mappings, g_strdup(prop_name), g_strdup(value));
+}
+
+/* Section 5.6.3 */
+CORBA_Status CORBA_Context_set_values(CORBA_Context ctx, CORBA_NVList *values, CORBA_Environment *ev)
+{
+ int i;
+
+ for(i = 0; i < values->list->len; i++) {
+ CORBA_NamedValue *nvp;
+
+ nvp = ((CORBA_NamedValue *)values->list->data) + i;
+
+ g_assert(nvp->argument._type == TC_string);
+
+ CORBA_Context_set_one_value(ctx, nvp->name, nvp->argument._value, ev);
+ }
+}
+
+/* Section 5.6.4 */
+
+typedef struct {
+ CORBA_Context ctx;
+ CORBA_Identifier prop_name;
+ CORBA_NVList *values;
+ CORBA_Environment *ev;
+ int len;
+} CTXSearchInfo;
+
+static gboolean
+list_has_key(CORBA_NVList *list, const char *key)
+{
+ int i;
+
+ for(i = 0; i < list->list->len; i++) {
+ CORBA_NamedValue *nvp;
+
+ nvp = ((CORBA_NamedValue *)list->list->data) + i;
+
+ if(!strcmp(nvp->name, key))
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void
+search_props(gpointer key, gpointer value, CTXSearchInfo *csi)
+{
+ if(strncmp(key, csi->prop_name, csi->len))
+ return;
+
+ if(list_has_key(csi->values, key))
+ return;
+
+ CORBA_NVList_add_item(csi->values, key, TC_string, &value, strlen(value) + 1, CORBA_IN_COPY_VALUE, NULL);
+}
+
+static void
+ctx_get_values(CORBA_Context ctx, CORBA_Flags op_flags,
+ CORBA_Identifier prop_name, CORBA_NVList **values,
+ gint is_wc,
+ CORBA_Environment *ev)
+{
+ gboolean go_up = FALSE;
+
+ if(is_wc >= 0) {
+ CTXSearchInfo csi;
+
+ csi.ctx = ctx;
+ csi.prop_name = prop_name;
+ csi.values = *values;
+ csi.ev = ev;
+ csi.len = is_wc;
+
+ if(ctx->mappings)
+ g_hash_table_foreach(ctx->mappings, (GHFunc)search_props, &csi);
+
+ go_up = TRUE;
+
+ } else {
+ char *val = NULL;
+
+ if(ctx->mappings)
+ val = g_hash_table_lookup(ctx->mappings, prop_name);
+
+ if(val)
+ CORBA_NVList_add_item(*values, prop_name, TC_string, &val, strlen(val) + 1, CORBA_IN_COPY_VALUE, ev);
+ else
+ go_up = TRUE;
+ }
+
+ if(go_up
+ && ctx->parent_ctx
+ && !(op_flags & CORBA_CTX_RESTRICT_SCOPE))
+ ctx_get_values(ctx->parent_ctx, op_flags, prop_name, values, is_wc, ev);
+}
+
+CORBA_Status CORBA_Context_get_values(CORBA_Context ctx,
+ CORBA_Identifier start_scope,
+ CORBA_Flags op_flags,
+ CORBA_Identifier prop_name,
+ CORBA_NVList **values,
+ CORBA_Environment *ev)
+{
+ char *ctmp;
+ int wc_pos;
+
+ CORBA_ORB_create_list(CORBA_OBJECT_NIL, 0, values, ev);
+
+ if(start_scope && *start_scope) {
+ while(ctx && (!ctx->the_name || strcmp(ctx->the_name, start_scope)))
+ ctx = ctx->parent_ctx;
+
+ if(!ctx) {
+ CORBA_exception_set_system(ev, ex_CORBA_INV_IDENT, CORBA_COMPLETED_NO);
+ return;
+ }
+ }
+
+ ctmp = strchr(prop_name, '*');
+ if(ctmp)
+ wc_pos = ctmp - prop_name;
+ else
+ wc_pos = -1;
+
+ CORBA_ORB_create_list(CORBA_OBJECT_NIL, 0, values, ev);
+
+ ctx_get_values(ctx, op_flags, prop_name, values, (prop_name[strlen(prop_name) - 1] == '*'), ev);
+
+ if((*values)->list->len == 0)
+ {
+ CORBA_NVList_free(*values, ev);
+ *values = NULL;
+ CORBA_exception_set_system(ev, ex_CORBA_UNKNOWN, CORBA_COMPLETED_NO);
+ }
+}
+
+/* Section 5.6.5 */
+static void
+delete_props(gpointer key, gpointer value, CTXSearchInfo *csi)
+{
+ if(strncmp(key, csi->prop_name, csi->len))
+ return;
+
+ g_hash_table_remove(csi->ctx->mappings, key);
+ g_free(key);
+ g_free(value);
+}
+
+CORBA_Status CORBA_Context_delete_values(CORBA_Context ctx, CORBA_Identifier prop_name, CORBA_Environment *ev)
+{
+ char *ctmp;
+ int wc_pos;
+
+ if(!ctx->mappings)
+ return;
+
+ ctmp = strchr(prop_name, '*');
+ if(ctmp)
+ wc_pos = ctmp - prop_name;
+ else
+ wc_pos = -1;
+
+ if(wc_pos >= 0) {
+ CTXSearchInfo csi;
+
+ memset(&csi, 0, sizeof(csi));
+ csi.ctx = ctx;
+ csi.prop_name = prop_name;
+ csi.ev = ev;
+ csi.len = wc_pos;
+
+ g_hash_table_foreach(ctx->mappings, (GHFunc)delete_props, &csi);
+ } else {
+ gpointer old_nom, old_value;
+
+ if(g_hash_table_lookup_extended(ctx->mappings, prop_name, &old_nom, &old_value)) {
+ g_free(old_nom);
+ g_free(old_value);
+ }
+ }
+}
+
+/* Section 5.6.6 */
+CORBA_Status CORBA_Context_create_child(CORBA_Context ctx, CORBA_Identifier ctx_name, CORBA_Context *child_ctx, CORBA_Environment *ev)
+{
+ *child_ctx = CORBA_Context_new(ctx, ctx_name, ev);
+}
+
+/* Section 5.6.7 */
+CORBA_Status CORBA_Context_delete(CORBA_Context ctx, CORBA_Flags del_flags, CORBA_Environment *ev)
+{
+ if((del_flags & CORBA_CTX_DELETE_DESCENDENTS)
+ || !ctx->children)
+ free_child(ctx, NULL);
+}
+
+void
+ORBit_Context_marshal(CORBA_Context ctx, const ORBit_ContextMarshalItem *mlist, CORBA_unsigned_long nitems, GIOPSendBuffer *buf)
+{
+ int i;
+ CORBA_unsigned_long *real_nitems, ltmp;
+
+ real_nitems = giop_send_buffer_append_mem_indirect_a(buf, &nitems, sizeof(nitems));
+ if(!ctx->mappings) {
+ *real_nitems = 0;
+ return;
+ }
+
+ for(*real_nitems = i = 0; i < nitems; i++) {
+ char *value;
+
+ value = g_hash_table_lookup(ctx->mappings, mlist[i].str);
+ if(!value)
+ continue;
+
+ /* Key */
+ giop_message_buffer_append_mem_a(GIOP_MESSAGE_BUFFER(buf), &(mlist[i].len), sizeof(mlist[i].len));
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(buf), mlist[i].str, mlist[i].len);
+ (*real_nitems)++;
+
+ /* Value */
+ ltmp = strlen(value) + 1;
+ giop_send_buffer_append_mem_indirect_a(buf, &ltmp, sizeof(ltmp));
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(buf), value, ltmp);
+ (*real_nitems)++;
+ }
+}
+
+#define GET_ATOM(x) G_STMT_START{ GIOP_RECV_BUFFER(recv_buffer)->decoder(&x, (GIOP_RECV_BUFFER(recv_buffer)->cur), sizeof(x)); \
+GIOP_RECV_BUFFER(recv_buffer)->cur = ((guchar *)GIOP_RECV_BUFFER(recv_buffer)->cur) + sizeof(x); \
+}G_STMT_END
+#define ALIGNFOR(x) recv_buffer->cur = ALIGN_ADDRESS(recv_buffer->cur, sizeof(x))
+
+void
+ORBit_Context_demarshal(CORBA_Context parent, CORBA_Context initme, GIOPRecvBuffer *recv_buffer)
+{
+ CORBA_unsigned_long nstrings, keylen, vallen, i;
+ char *key, *value;
+
+ memset(initme, 0, sizeof(struct CORBA_Context_type));
+ ORBIT_ROOT_OBJECT(initme)->refs = -1;
+
+ initme->parent_ctx = parent;
+
+ ALIGNFOR(nstrings);
+ GET_ATOM(nstrings);
+
+ if(nstrings)
+ initme->mappings = g_hash_table_new(g_str_hash, g_str_equal);
+ else
+ return;
+
+ g_hash_table_freeze(initme->mappings);
+ for(i = 0; i < nstrings; ) {
+ ALIGNFOR(keylen);
+ GET_ATOM(keylen);
+ key = recv_buffer->cur;
+ recv_buffer->cur = ((char *)recv_buffer->cur) + keylen;
+ i++;
+
+ if(i >= nstrings)
+ break;
+
+ ALIGNFOR(vallen);
+ GET_ATOM(vallen);
+ value = recv_buffer->cur;
+ recv_buffer->cur = ((char *)recv_buffer->cur) + vallen;
+ i++;
+
+ g_hash_table_insert(initme->mappings, key, value);
+ }
+ g_hash_table_thaw(initme->mappings);
+}
+
+void
+ORBit_Context_server_free(CORBA_Context ctx)
+{
+ g_hash_table_destroy(ctx->mappings);
+}
diff -urN linux-2.4.1/net/korbit/orb/corba_context.h linux-2.4.1-korbit/net/korbit/orb/corba_context.h
--- linux-2.4.1/net/korbit/orb/corba_context.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/corba_context.h Thu Feb 1 16:20:50 2001
@@ -0,0 +1,65 @@
+#ifndef CORBA_CONTEXT_H
+#define CORBA_CONTEXT_H 1
+
+#include "orbit_object_type.h"
+#include "orbit_object.h"
+
+typedef struct {
+ CORBA_unsigned_long len;
+ const CORBA_char *str;
+} ORBit_ContextMarshalItem;
+
+typedef struct CORBA_Context_type *CORBA_Context;
+
+struct CORBA_Context_type {
+ struct ORBit_PseudoObject_struct parent;
+ GHashTable *mappings;
+ GSList *children;
+
+ char *the_name;
+
+ CORBA_Context parent_ctx;
+};
+
+
+extern CORBA_Status CORBA_Context_set_one_value(
+ CORBA_Context ctx,
+ CORBA_Identifier prop_name,
+ char *value,
+ CORBA_Environment *ev);
+
+extern CORBA_Status CORBA_Context_set_values(
+ CORBA_Context ctx,
+ CORBA_NVList *values,
+ CORBA_Environment *ev);
+
+extern CORBA_Status CORBA_Context_get_values(
+ CORBA_Context ctx,
+ CORBA_Identifier start_scope,
+ CORBA_Flags op_flags,
+ CORBA_Identifier prop_name,
+ CORBA_NVList **values,
+ CORBA_Environment *ev);
+
+extern CORBA_Status CORBA_Context_delete_values(
+ CORBA_Context ctx,
+ CORBA_Identifier prop_name,
+ CORBA_Environment *ev);
+
+extern CORBA_Status CORBA_Context_create_child(
+ CORBA_Context ctx,
+ CORBA_Identifier ctx_name,
+ CORBA_Context *child_ctx,
+ CORBA_Environment *ev);
+
+extern CORBA_Status CORBA_Context_delete(
+ CORBA_Context ctx,
+ CORBA_Flags del_flags,
+ CORBA_Environment *ev);
+
+void ORBit_Context_marshal(CORBA_Context ctx, const ORBit_ContextMarshalItem *mlist,
+ CORBA_unsigned_long nitems, GIOPSendBuffer *buf);
+void ORBit_Context_demarshal(CORBA_Context parent, CORBA_Context initme, GIOPRecvBuffer *recv_buffer);
+void ORBit_Context_server_free(CORBA_Context ctx);
+
+#endif
diff -urN linux-2.4.1/net/korbit/orb/corba_env.h linux-2.4.1-korbit/net/korbit/orb/corba_env.h
--- linux-2.4.1/net/korbit/orb/corba_env.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/corba_env.h Thu Feb 1 11:47:11 2001
@@ -0,0 +1,79 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#ifndef _ORBIT_CORBA_ENV_H_
+#define _ORBIT_CORBA_ENV_H_
+
+typedef struct CORBA_Environment_type CORBA_Environment;
+
+/* 3.15 */
+typedef enum {
+ CORBA_COMPLETED_YES=0,
+ CORBA_COMPLETED_NO,
+ CORBA_COMPLETED_MAYBE
+} CORBA_completion_status;
+
+typedef enum {
+ CORBA_NO_EXCEPTION=0,
+ CORBA_USER_EXCEPTION,
+ CORBA_SYSTEM_EXCEPTION
+} CORBA_exception_type;
+
+
+#define ex_CORBA_UNKNOWN 1
+#define ex_CORBA_BAD_PARAM 2
+#define ex_CORBA_NO_MEMORY 3
+#define ex_CORBA_IMP_LIMIT 4
+#define ex_CORBA_COMM_FAILURE 5
+#define ex_CORBA_INV_OBJREF 6
+#define ex_CORBA_NO_PERMISSION 7
+#define ex_CORBA_INTERNAL 8
+#define ex_CORBA_MARSHAL 9
+#define ex_CORBA_INITIALIZE 10
+#define ex_CORBA_NO_IMPLEMENT 11
+#define ex_CORBA_BAD_TYPECODE 12
+#define ex_CORBA_BAD_OPERATION 13
+#define ex_CORBA_NO_RESOURCES 14
+#define ex_CORBA_NO_RESPONSE 15
+#define ex_CORBA_PERSIST_STORE 16
+#define ex_CORBA_BAD_INV_ORDER 17
+#define ex_CORBA_TRANSIENT 18
+#define ex_CORBA_FREE_MEM 19
+#define ex_CORBA_INV_IDENT 20
+#define ex_CORBA_INV_FLAG 21
+#define ex_CORBA_INTF_REPOS 22
+#define ex_CORBA_BAD_CONTEXT 23
+#define ex_CORBA_OBJ_ADAPTER 24
+#define ex_CORBA_DATA_CONVERSION 25
+#define ex_CORBA_OBJECT_NOT_EXIST 26
+#define ex_CORBA_TRANSACTION_REQUIRED 27
+#define ex_CORBA_TRANSACTION_ROLLEDBACK 28
+#define ex_CORBA_INVALID_TRANSACTION 29
+
+
+#endif /* !_ORBIT_CORBA_ENV_H_ */
+
+
+
diff -urN linux-2.4.1/net/korbit/orb/corba_env_type.h linux-2.4.1-korbit/net/korbit/orb/corba_env_type.h
--- linux-2.4.1/net/korbit/orb/corba_env_type.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/corba_env_type.h Thu Feb 1 16:20:50 2001
@@ -0,0 +1,79 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#ifndef _ORBIT_CORBA_ENV_TYPE_H_
+#define _ORBIT_CORBA_ENV_TYPE_H_
+
+#include "corba_env.h"
+#include "corba_any.h"
+
+typedef struct CORBA_system_exception {
+ CORBA_unsigned_long minor;
+ CORBA_completion_status completed;
+} CORBA_SystemException;
+
+#define SYSEXC(name) typedef CORBA_SystemException name;
+
+SYSEXC(CORBA_UNKNOWN)
+SYSEXC(CORBA_BAD_PARAM)
+SYSEXC(CORBA_NO_MEMORY)
+SYSEXC(CORBA_IMP_LIMIT)
+SYSEXC(CORBA_COMM_FAILURE)
+SYSEXC(CORBA_INV_OBJREF)
+SYSEXC(CORBA_NO_PERMISSION)
+SYSEXC(CORBA_INTERNAL)
+SYSEXC(CORBA_MARSHAL)
+SYSEXC(CORBA_INITIALIZE)
+SYSEXC(CORBA_NO_IMPLEMENT)
+SYSEXC(CORBA_BAD_TYPECODE)
+SYSEXC(CORBA_BAD_OPERATION)
+SYSEXC(CORBA_NO_RESOURCES)
+SYSEXC(CORBA_NO_RESPONSE)
+SYSEXC(CORBA_PERSIST_STORE)
+SYSEXC(CORBA_BAD_INV_ORDER)
+SYSEXC(CORBA_TRANSIENT)
+SYSEXC(CORBA_FREE_MEM)
+SYSEXC(CORBA_INV_IDENT)
+SYSEXC(CORBA_INV_FLAG)
+SYSEXC(CORBA_INTF_REPOS)
+SYSEXC(CORBA_BAD_CONTEXT)
+SYSEXC(CORBA_OBJ_ADAPTER)
+SYSEXC(CORBA_DATA_CONVERSION)
+SYSEXC(CORBA_OBJECT_NOT_EXIST)
+SYSEXC(CORBA_TRANSACTION_REQUIRED)
+SYSEXC(CORBA_TRANSACTION_ROLLEDBACK)
+SYSEXC(CORBA_INVALID_TRANSACTION)
+
+
+/* 19.22 */
+struct CORBA_Environment_type {
+ CORBA_exception_type _major;
+ CORBA_char *_repo_id;
+ void *_params;
+ CORBA_any *_any;
+};
+
+
+#endif /* !_ORBIT_CORBA_ENV_TYPE_H_ */
diff -urN linux-2.4.1/net/korbit/orb/corba_object.c linux-2.4.1-korbit/net/korbit/orb/corba_object.c
--- linux-2.4.1/net/korbit/orb/corba_object.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/corba_object.c Thu Feb 1 11:47:11 2001
@@ -0,0 +1,467 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ * Elliot Lee <sopwith@redhat.com>
+ *
+ */
+
+#include "config.h"
+#include <IIOP/IIOP.h>
+#include "orbit_types.h"
+#include "corba_object.h"
+#include "corba_object_type.h"
+#include "env.h"
+#include "orb.h"
+#ifdef __KORBIT__
+#include "orbit.h"
+#else /* !__KORBIT__ */
+#include "interface_repository.h"
+#endif /* !__KORBIT__ */
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <alloca.h>
+
+#ifndef __KERNEL__
+#define freeca(ptr)
+#endif
+
+#ifndef __KORBIT__
+/* Section 4.2.1 */
+CORBA_InterfaceDef CORBA_Object_get_interface(CORBA_Object obj, CORBA_Environment *ev)
+{
+ CORBA_Repository repo;
+ CORBA_InterfaceDef interface;
+
+ if(obj==CORBA_OBJECT_NIL)
+ return(CORBA_OBJECT_NIL); /* no exception defined in spec */
+
+ repo=CORBA_ORB_resolve_initial_references(obj->orb, "InterfaceRepository", ev);
+ if(repo==CORBA_OBJECT_NIL)
+ return(CORBA_OBJECT_NIL);
+
+ interface=CORBA_Repository_lookup_id(repo, obj->object_id, ev);
+ CORBA_Object_release(repo, ev);
+
+ return(interface);
+}
+#endif /* !__KORBIT__ */
+
+/* Section 4.2.3 */
+CORBA_boolean CORBA_Object_is_nil(CORBA_Object obj, CORBA_Environment *ev)
+{
+ if(obj==CORBA_OBJECT_NIL) {
+ return(CORBA_TRUE);
+ } else {
+ return(CORBA_FALSE);
+ }
+}
+
+/* Section 4.2.2 */
+/* XXXX Big warning: lots of places inside ORBit expect this to
+ always return 'obj'. Do not change this, upon pain
+ of death... */
+CORBA_Object CORBA_Object_duplicate(CORBA_Object obj, CORBA_Environment *ev)
+{
+ if(obj == CORBA_OBJECT_NIL)
+ return CORBA_OBJECT_NIL;
+
+ if(ORBIT_ROOT_OBJECT(obj)->refs >= 0)
+ ORBIT_ROOT_OBJECT_REF(obj);
+
+ return(obj);
+}
+
+
+/* Section 4.2.2 */
+void CORBA_Object_release(CORBA_Object obj, CORBA_Environment *ev)
+{
+ if(obj != CORBA_OBJECT_NIL)
+ ORBIT_ROOT_OBJECT_release(obj,ev);
+}
+
+extern GHashTable *ORBit_class_assignments;
+
+void ORBit_impl_CORBA_Object_is_a(gpointer servant,
+ GIOPRecvBuffer * _ORBIT_recv_buffer,
+ CORBA_Environment *ev,
+ gpointer dummy)
+{
+ GIOPSendBuffer *_ORBIT_send_buffer;
+ struct CORBA_Object_struct objdummy; /* XXX badhack to save backwards compat */
+ CORBA_boolean retval;
+ char *repo_id;
+ CORBA_unsigned_long slen;
+ guchar *curptr;
+ ORBit_ObjectKey *objkey;
+ gpointer *tmp_vepv;
+ guint sz;
+ CORBA_unsigned_long clsid;
+ PortableServer_ServantBase *_ORBIT_servant;
+
+ _ORBIT_servant = servant;
+
+ /* XXX security implications */
+ curptr = _ORBIT_recv_buffer->cur;
+ curptr = ALIGN_ADDRESS(curptr, 4);
+ if(giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)))
+ iiop_byteswap((guchar *)&slen, curptr, sizeof(CORBA_unsigned_long));
+ else
+ slen = *((CORBA_unsigned_long *)curptr);
+ curptr += 4;
+ repo_id = curptr;
+
+ repo_id[slen] = '\0';
+
+ objkey = ORBIT_OBJECT_KEY(_ORBIT_servant->_private);
+
+ sz = sizeof(gpointer) * (ORBit_class_assignment_counter + 1);
+ tmp_vepv = alloca(sz);
+ memset(tmp_vepv, '\0', sz);
+
+ objdummy.vepv = tmp_vepv;
+ objkey->class_info->init_local_objref(&objdummy, servant);
+
+ clsid = GPOINTER_TO_UINT(g_hash_table_lookup(ORBit_class_assignments, repo_id));
+ retval = (clsid && tmp_vepv[clsid]);
+
+ _ORBIT_send_buffer = giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)->connection, NULL,
+ _ORBIT_recv_buffer->message.u.request.request_id, ev->_major);
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &retval, sizeof(retval));
+ giop_send_buffer_write(_ORBIT_send_buffer);
+ giop_send_buffer_unuse(_ORBIT_send_buffer);
+ freeca(tmp_vepv);
+}
+
+/* Section 4.2.4 */
+CORBA_boolean CORBA_Object_is_a(CORBA_Object obj, CORBA_char *logical_type_id, CORBA_Environment *ev)
+{
+ if(obj == CORBA_OBJECT_NIL)
+ return CORBA_FALSE;
+
+ if (obj->servant && obj->vepv) {
+ CORBA_unsigned_long clsid;
+
+ clsid = GPOINTER_TO_UINT(g_hash_table_lookup(ORBit_class_assignments, logical_type_id));
+
+ return (clsid && (clsid < obj->vepv_size) && obj->vepv[clsid]);
+ } else if(!strcmp(obj->object_id, logical_type_id)
+ || !strcmp("IDL:CORBA/Object:1.0", logical_type_id)) {
+ return CORBA_TRUE;
+ } else {
+ /* Cut and paste from orbit-idl output */
+ /* XXX security implications */
+ GIOP_unsigned_long _ORBIT_request_id;
+ register GIOP_unsigned_long _ORBIT_system_exception_minor;
+ register CORBA_completion_status _ORBIT_completion_status;
+ register GIOPSendBuffer *_ORBIT_send_buffer;
+ register GIOPRecvBuffer *_ORBIT_recv_buffer;
+ register GIOPConnection *_cnx;
+
+ _cnx = ORBit_object_get_connection(obj);
+
+ _ORBIT_retry_request:
+ _ORBIT_send_buffer = NULL;
+ _ORBIT_recv_buffer = NULL;
+ _ORBIT_completion_status = CORBA_COMPLETED_NO;
+ /* A unique uint pointer is anything on the stack,
+ so set this variable to point to its own address on the
+ stack. :) */
+ _ORBIT_request_id = GPOINTER_TO_UINT(&_ORBIT_request_id);
+ { /* marshalling */
+ static const struct {
+ CORBA_unsigned_long len;
+ char opname[6];
+ } _ORBIT_operation_name_data = {
+ 6, "_is_a"
+ };
+ static const struct iovec _ORBIT_operation_vec =
+ {(gpointer) & _ORBIT_operation_name_data, 10};
+ register CORBA_unsigned_long _ORBIT_tmpvar_0;
+ CORBA_unsigned_long _ORBIT_tmpvar_1;
+
+ _ORBIT_send_buffer =
+ giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id, CORBA_TRUE,
+ &(obj->active_profile->object_key_vec), &_ORBIT_operation_vec, &ORBit_default_principal_iovec);
+
+ _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE;
+ if (!_ORBIT_send_buffer)
+ goto _ORBIT_system_exception;
+ _ORBIT_tmpvar_1 = strlen(logical_type_id) + 1;
+ giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), 4);
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &(_ORBIT_tmpvar_1), sizeof(_ORBIT_tmpvar_1));
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), (logical_type_id), sizeof(logical_type_id[_ORBIT_tmpvar_0]) * _ORBIT_tmpvar_1);
+ giop_send_buffer_write(_ORBIT_send_buffer);
+ _ORBIT_completion_status = CORBA_COMPLETED_MAYBE;
+ giop_send_buffer_unuse(_ORBIT_send_buffer);
+ _ORBIT_send_buffer = NULL;
+ }
+ { /* demarshalling */
+ register guchar *_ORBIT_curptr;
+ CORBA_boolean _ORBIT_retval;
+
+ _ORBIT_recv_buffer = giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE);
+ if (!_ORBIT_recv_buffer)
+ goto _ORBIT_system_exception;
+ _ORBIT_completion_status = CORBA_COMPLETED_YES;
+ if (_ORBIT_recv_buffer->message.u.reply.reply_status != GIOP_NO_EXCEPTION)
+ goto _ORBIT_msg_exception;
+ if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) {
+ _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur;
+ _ORBIT_retval = *((CORBA_boolean *) _ORBIT_curptr);
+ } else {
+ _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur;
+ _ORBIT_retval = *((CORBA_boolean *) _ORBIT_curptr);
+ }
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ return _ORBIT_retval;
+ _ORBIT_system_exception:
+ CORBA_exception_set_system(ev, _ORBIT_system_exception_minor, _ORBIT_completion_status);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ giop_send_buffer_unuse(_ORBIT_send_buffer);
+ return _ORBIT_retval;
+ _ORBIT_msg_exception:
+ if (_ORBIT_recv_buffer->message.u.reply.reply_status == GIOP_LOCATION_FORWARD) {
+ if (obj->forward_locations != NULL)
+ ORBit_delete_profiles(obj->forward_locations);
+ obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer);
+ _cnx = ORBit_object_get_forwarded_connection(obj);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+
+ goto _ORBIT_retry_request;
+ } else {
+ ORBit_handle_exception(_ORBIT_recv_buffer, ev, NULL, obj->orb);
+ giop_recv_buffer_unuse(_ORBIT_recv_buffer);
+ return _ORBIT_retval;
+ }
+ }
+
+ }
+}
+
+/* Section 4.2.5 */
+#ifndef __KORBIT__
+static void do_exit(int signum) {
+ _exit(5);
+#warning "This should be removed... use BUG instead..."
+}
+#endif
+
+/* Lovely hack to try and figure out without hanging whether an object exists or not. */
+CORBA_boolean CORBA_Object_non_existent(CORBA_Object obj, CORBA_Environment *ev)
+{
+#ifndef __KORBIT__
+ int childpid, exitstatus, itmp;
+#endif
+
+ ev->_major = CORBA_NO_EXCEPTION;
+
+ if(obj == CORBA_OBJECT_NIL)
+ return TRUE;
+
+ if(obj->servant)
+ return FALSE;
+
+ if(obj->connection && obj->connection->is_valid)
+ return FALSE;
+
+#ifndef __KORBIT__
+ childpid = fork();
+
+ if(!childpid) {
+ GIOPConnection* cnx = NULL;
+ struct sigaction sa;
+
+ memset(&sa, 0, sizeof(sa));
+ sa.sa_handler = do_exit;
+ sigaction(SIGALRM, &sa, NULL);
+ alarm(2);
+ cnx = _ORBit_object_get_connection(obj);
+
+ /* XXX todo - try invoking a strange operation on the object, and see what type of exception we get. */
+
+ _exit((cnx == NULL)?1:0);
+ }
+
+ itmp = waitpid(childpid, &exitstatus, 0);
+
+ if(itmp < 0) return TRUE;
+ return WEXITSTATUS(exitstatus) && TRUE;
+#else /* __KORBIT__ */
+ return FALSE;
+#endif /* __KORBIT__ */
+}
+
+gboolean
+g_CORBA_Object_equal(CORBA_Object obj1, CORBA_Object obj2)
+{
+ gboolean retval;
+ CORBA_Environment ev;
+
+ CORBA_exception_init(&ev);
+
+ retval = (gboolean)CORBA_Object_is_equivalent(obj1, obj2, &ev);
+
+ CORBA_exception_free(&ev);
+
+ return retval;
+}
+
+/* Section 4.2.6 */
+CORBA_boolean CORBA_Object_is_equivalent(CORBA_Object obj, CORBA_Object other_object, CORBA_Environment *ev)
+{
+ ORBit_Object_info *obj_profile, *other_object_profile;
+ int i,j, obj_profile_count, other_object_profile_count;
+
+ if(obj == CORBA_OBJECT_NIL
+ && other_object == CORBA_OBJECT_NIL)
+ return CORBA_TRUE;
+
+ if(obj == CORBA_OBJECT_NIL
+ || other_object == CORBA_OBJECT_NIL)
+ goto ret_false;
+
+ /*
+ * If one profile in "obj" matches one in "other_object", then these
+ * objects are equivalent.
+ *
+ * This is O(n*m) at worst case :-( Hopefully though most objects will
+ * only have 1 or 2 profiles.
+ *
+ * The profile list could be indexed as a hash table (the linked list
+ * is still needed, as the profile order is significant)
+ */
+
+ obj_profile_count = g_slist_length(obj->profile_list);
+ other_object_profile_count = g_slist_length(other_object->profile_list);
+
+ for(i=0;i<obj_profile_count;i++) {
+ obj_profile=(ORBit_Object_info *)g_slist_nth_data(obj->profile_list, i);
+
+ for(j=0;j<other_object_profile_count;j++) {
+ other_object_profile=(ORBit_Object_info *)g_slist_nth_data(other_object->profile_list, j);
+
+ if(obj_profile->profile_type != other_object_profile->profile_type)
+ continue;
+
+ if(obj_profile->object_key._length != other_object_profile->object_key._length)
+ continue;
+
+ if(memcmp(obj_profile->object_key._buffer, other_object_profile->object_key._buffer, obj_profile->object_key._length))
+ continue;
+
+ if(obj_profile->profile_type == IOP_TAG_INTERNET_IOP) {
+ TAG_INTERNET_IOP_info *ii1, *ii2;
+
+ ii1 = &obj_profile->tag.iopinfo;
+ ii2 = &other_object_profile->tag.iopinfo;
+
+ if(ii1->port != ii2->port)
+ continue;
+ if(strcmp(ii1->host, ii2->host))
+ continue;
+
+ return(CORBA_TRUE);
+ } else if(obj_profile->profile_type == IOP_TAG_ORBIT_SPECIFIC) {
+ TAG_ORBIT_SPECIFIC_info *oi1, *oi2;
+
+ oi1 = &obj_profile->tag.orbitinfo;
+ oi2 = &other_object_profile->tag.orbitinfo;
+
+ if(strcmp(oi1->unix_sock_path, oi2->unix_sock_path))
+ continue;
+ if(oi1->ipv6_port != oi2->ipv6_port)
+ continue;
+
+ return(CORBA_TRUE);
+ }
+ }
+ }
+
+ ret_false:
+ return CORBA_FALSE;
+}
+
+guint
+g_CORBA_Object_hash(CORBA_Object obj)
+{
+ guint retval;
+ CORBA_Environment ev;
+
+ CORBA_exception_init(&ev);
+
+ retval = (guint)CORBA_Object_hash(obj, UINT_MAX, &ev);
+
+ CORBA_exception_free(&ev);
+
+ return retval;
+}
+
+static void profile_hash(gpointer item, gpointer data)
+{
+ ORBit_Object_info *info = (ORBit_Object_info *)item;
+ CORBA_unsigned_long *retval = (CORBA_unsigned_long *)data;
+
+ g_assert(info);
+ g_assert(retval);
+
+ *retval ^= info->object_key._length;
+
+ if(info->profile_type == IOP_TAG_INTERNET_IOP) {
+ *retval ^= !info->tag.iopinfo.port;
+ } else if(info->profile_type == IOP_TAG_ORBIT_SPECIFIC) {
+ *retval ^= g_str_hash(info->tag.orbitinfo.unix_sock_path);
+ *retval ^= !info->tag.orbitinfo.ipv6_port;
+ }
+}
+
+/* Section 4.2.6 */
+CORBA_unsigned_long CORBA_Object_hash(CORBA_Object obj,
+ CORBA_unsigned_long maximum,
+ CORBA_Environment *ev)
+{
+ CORBA_unsigned_long retval = 0;
+ char *tptr;
+
+ g_assert(obj);
+
+ tptr = obj->object_id;
+ while(*tptr) {
+ retval = (retval << 8) ^ *tptr;
+ tptr++;
+ }
+
+ if(g_slist_length(obj->profile_list)>0) {
+ g_slist_foreach(obj->profile_list, profile_hash, &retval);
+ } else {
+ g_warning("Object of type %s doesn't seem to have any connection info!", obj->object_id);
+ }
+
+ return (retval % maximum);
+}
+
+/* Section 4.2.7 */
+CORBA_Policy CORBA_Object_get_policy(CORBA_Object obj, CORBA_PolicyType policy_type, CORBA_Environment *ev)
+{
+ g_assert(!"Not yet implemented");
+ return(NULL);
+}
diff -urN linux-2.4.1/net/korbit/orb/corba_object.h linux-2.4.1-korbit/net/korbit/orb/corba_object.h
--- linux-2.4.1/net/korbit/orb/corba_object.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/corba_object.h Thu Feb 1 16:20:50 2001
@@ -0,0 +1,59 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#ifndef _ORBIT_CORBA_OBJECT_H_
+#define _ORBIT_CORBA_OBJECT_H_
+
+#include <ORBitutil/basic_types.h>
+
+#include "corba_env.h"
+#include "corba_orb.h"
+#include "corba_sequences.h"
+
+#define CORBA_OBJECT_NIL NULL
+
+typedef struct CORBA_Object_struct *CORBA_Object;
+
+#define CORBA_OBJECT(x) ((CORBA_Object)(x))
+
+/* Used for internal stuff mostly, but also good if you want to store
+ a hash of objects */
+gboolean g_CORBA_Object_equal(CORBA_Object obj1, CORBA_Object obj2);
+guint g_CORBA_Object_hash(CORBA_Object obj);
+
+void ORBit_impl_CORBA_Object_is_a(gpointer servant,
+ GIOPRecvBuffer * _ORBIT_recv_buffer,
+ CORBA_Environment *ev, gpointer dummy);
+#define ORBIT_IMPLEMENTS_IS_A
+
+extern CORBA_boolean CORBA_Object_is_a(
+ CORBA_Object obj,
+ CORBA_char *logical_type_id,
+ CORBA_Environment *ev);
+
+#endif /* !_ORBIT_CORBA_OBJECT_H_ */
+
+
+
diff -urN linux-2.4.1/net/korbit/orb/corba_object_type.h linux-2.4.1-korbit/net/korbit/orb/corba_object_type.h
--- linux-2.4.1/net/korbit/orb/corba_object_type.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/corba_object_type.h Thu Feb 1 16:20:50 2001
@@ -0,0 +1,54 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#ifndef _ORBIT_CORBA_OBJECT_TYPE_H_
+#define _ORBIT_CORBA_OBJECT_TYPE_H_
+
+#include <sys/uio.h> /* for struct iovec */
+
+#include <IIOP/IIOP.h> /* for giop_connection */
+
+#include "corba_object.h"
+#include "corba_basic_sequences_type.h"
+
+#include "orbit_object_type.h"
+
+struct CORBA_Object_struct {
+ struct ORBit_RootObject_struct parent;
+ CORBA_ORB orb;
+ GIOPConnection *connection;
+ CORBA_char *object_id;
+ GSList *profile_list;
+ GSList *forward_locations;
+ ORBit_Object_info *active_profile; /* points at a member of profile_list or forward_locations */
+
+ /* Used for direct calls */
+ gpointer *vepv;
+ /* PortableServer_Servant - looping includes :( */ gpointer servant;
+ guint vepv_size;
+};
+
+
+#endif /* !_ORBIT_CORBA_OBJECT_TYPE_H_ */
diff -urN linux-2.4.1/net/korbit/orb/corba_orb.h linux-2.4.1-korbit/net/korbit/orb/corba_orb.h
--- linux-2.4.1/net/korbit/orb/corba_orb.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/corba_orb.h Thu Feb 1 11:47:11 2001
@@ -0,0 +1,48 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#ifndef _ORBIT_CORBA_ORB_H_
+#define _ORBIT_CORBA_ORB_H_
+
+typedef char *CORBA_ORB_ObjectId;
+
+#ifndef CORBA_POLICY_TYPE
+#define CORBA_POLICY_TYPE 1
+/* We need to define this in corba_orb_type.h as well, sometimes... */
+typedef struct CORBA_Policy_type *CORBA_Policy;
+#endif
+
+typedef CORBA_unsigned_long CORBA_PolicyType;
+
+typedef struct CORBA_ORB_type *CORBA_ORB;
+
+typedef struct CORBA_DomainManager_type *CORBA_DomainManager;
+
+typedef struct CORBA_ConstructionPolicy_type *CORBA_ConstructionPolicy;
+
+#define ex_CORBA_ORB_InvalidName "IDL:CORBA/ORB/InvalidName:1.0"
+
+#endif /* !_ORBIT_CORBA_ORB_H_ */
+
diff -urN linux-2.4.1/net/korbit/orb/corba_orb_type.h linux-2.4.1-korbit/net/korbit/orb/corba_orb_type.h
--- linux-2.4.1/net/korbit/orb/corba_orb_type.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/corba_orb_type.h Thu Feb 1 16:20:50 2001
@@ -0,0 +1,77 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#ifndef _ORBIT_CORBA_ORB_TYPE_H_
+#define _ORBIT_CORBA_ORB_TYPE_H_
+
+#include "corba_object.h"
+
+struct CORBA_ORB_type {
+ struct ORBit_PseudoObject_struct parent;
+ CORBA_ORBid orb_identifier;
+ CORBA_RepositoryId repoid;
+ CORBA_boolean use_poa;
+
+ CORBA_Object imr, ir, naming, root_poa;
+ struct {
+ GIOPConnection *ipv4;
+ GIOPConnection *ipv6;
+ GIOPConnection *usock;
+ } cnx;
+
+ GHashTable *objrefs;
+
+ GPtrArray *poas;
+
+ CORBA_Context default_ctx;
+};
+
+#define CORBA_ORB_CAST(orb) ((CORBA_ORB)orb)
+
+typedef struct CORBA_ORB_InvalidName {
+ int dummy;
+} CORBA_ORB_InvalidName;
+
+struct CORBA_Policy_type {
+ struct ORBit_PseudoObject_struct parent;
+ CORBA_PolicyType policy_type;
+};
+#ifndef CORBA_POLICY_TYPE
+#define CORBA_POLICY_TYPE 1
+typedef struct CORBA_Policy_type *CORBA_Policy;
+#endif
+
+struct CORBA_DomainManager_type {
+ struct ORBit_PseudoObject_struct parent;
+};
+
+#define CORBA_SecConstruction (11)
+
+struct CORBA_ConstructionPolicy_type {
+ int fill_me_in;
+};
+
+
+#endif /* !_ORBIT_CORBA_ORB_TYPE_H_ */
diff -urN linux-2.4.1/net/korbit/orb/corba_portableserver.h linux-2.4.1-korbit/net/korbit/orb/corba_portableserver.h
--- linux-2.4.1/net/korbit/orb/corba_portableserver.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/corba_portableserver.h Thu Feb 1 11:47:11 2001
@@ -0,0 +1,80 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#ifndef _ORBIT_CORBA_PORTABLESERVER_H_
+#define _ORBIT_CORBA_PORTABLESERVER_H_
+
+typedef struct PortableServer_ThreadPolicy_type *PortableServer_ThreadPolicy;
+typedef struct PortableServer_LifespanPolicy_type *PortableServer_LifespanPolicy;
+typedef struct PortableServer_IdUniquenessPolicy_type *PortableServer_IdUniquenessPolicy;
+typedef struct PortableServer_IdAssignmentPolicy_type *PortableServer_IdAssignmentPolicy;
+typedef struct PortableServer_ImplicitActivationPolicy_type *PortableServer_ImplicitActivationPolicy;
+typedef struct PortableServer_ServantRetentionPolicy_type *PortableServer_ServantRetentionPolicy;
+typedef struct PortableServer_RequestProcessingPolicy_type *PortableServer_RequestProcessingPolicy;
+typedef struct PortableServer_POAManager_type* PortableServer_POAManager;
+typedef struct PortableServer_AdapterActivator_type *PortableServer_AdapterActivator;
+typedef struct PortableServer_ServantManager_type *PortableServer_ServantManager;
+typedef struct PortableServer_ServantActivator_type *PortableServer_ServantActivator;
+typedef struct PortableServer_ServantLocator_type *PortableServer_ServantLocator;
+typedef struct PortableServer_POA_type *PortableServer_POA;
+typedef struct PortableServer_Current_type *PortableServer_Current;
+
+typedef enum {
+ PortableServer_ORB_CTRL_MODEL=0,
+ PortableServer_SINGLE_THREAD_MODEL
+} PortableServer_ThreadPolicyValue;
+
+typedef enum {
+ PortableServer_TRANSIENT=0,
+ PortableServer_PERSISTENT
+} PortableServer_LifespanPolicyValue;
+
+typedef enum {
+ PortableServer_UNIQUE_ID=0,
+ PortableServer_MULTIPLE_ID
+} PortableServer_IdUniquenessPolicyValue;
+
+typedef enum {
+ PortableServer_USER_ID=0,
+ PortableServer_SYSTEM_ID
+} PortableServer_IdAssignmentPolicyValue;
+
+typedef enum {
+ PortableServer_IMPLICIT_ACTIVATION=0,
+ PortableServer_NO_IMPLICIT_ACTIVATION
+} PortableServer_ImplicitActivationPolicyValue;
+
+typedef enum {
+ PortableServer_RETAIN=0,
+ PortableServer_NON_RETAIN
+} PortableServer_ServantRetentionPolicyValue;
+
+typedef enum {
+ PortableServer_USE_ACTIVE_OBJECT_MAP_ONLY=0,
+ PortableServer_USE_DEFAULT_SERVANT,
+ PortableServer_USE_SERVANT_MANAGER
+} PortableServer_RequestProcessingPolicyValue;
+
+#endif /* !_ORBIT_CORBA_PORTABLESERVER_H_ */
diff -urN linux-2.4.1/net/korbit/orb/corba_portableserver_type.h linux-2.4.1-korbit/net/korbit/orb/corba_portableserver_type.h
--- linux-2.4.1/net/korbit/orb/corba_portableserver_type.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/corba_portableserver_type.h Thu Feb 1 11:47:11 2001
@@ -0,0 +1,361 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#ifndef _ORBIT_CORBA_PORTABLESERVER_TYPE_H_
+#define _ORBIT_CORBA_PORTABLESERVER_TYPE_H_
+
+/* 19.26 */
+
+typedef void *PortableServer_ServantLocator_Cookie;
+typedef void *PortableServer_Servant;
+
+#ifndef _PortableServer_ForwardRequest_defined
+#define _PortableServer_ForwardRequest_defined
+
+typedef struct PortableServer_ForwardRequest {
+ CORBA_Object forward_reference;
+} PortableServer_ForwardRequest;
+
+#define ex_PortableServer_ForwardRequest "IDL:PortableServer/ForwardRequest:1.0"
+#endif /* !_PortableServer_ForwardRequest_defined */
+
+#define PortableServer_THREAD_POLICY_ID 16
+struct PortableServer_ThreadPolicy_type {
+ struct CORBA_Policy_type corba_policy;
+ PortableServer_ThreadPolicyValue value;
+};
+
+#define PortableServer_LIFESPAN_POLICY_ID 17
+extern const CORBA_PolicyType PortableServer_LifespanPolicy_PolicyType;
+struct PortableServer_LifespanPolicy_type {
+ struct CORBA_Policy_type corba_policy;
+ PortableServer_LifespanPolicyValue value;
+};
+
+#define PortableServer_ID_UNIQUENESS_POLICY_ID 18
+struct PortableServer_IdUniquenessPolicy_type {
+ struct CORBA_Policy_type corba_policy;
+ PortableServer_IdUniquenessPolicyValue value;
+};
+
+#define PortableServer_ID_ASSIGNMENT_POLICY_ID 19
+struct PortableServer_IdAssignmentPolicy_type {
+ struct CORBA_Policy_type corba_policy;
+ PortableServer_IdAssignmentPolicyValue value;
+};
+
+#define PortableServer_IMPLICIT_ACTIVATION_POLICY_ID 20
+struct PortableServer_ImplicitActivationPolicy_type {
+ struct CORBA_Policy_type corba_policy;
+ PortableServer_ImplicitActivationPolicyValue value;
+};
+
+#define PortableServer_SERVANT_RETENTION_POLICY_ID 21
+struct PortableServer_ServantRetentionPolicy_type {
+ struct CORBA_Policy_type corba_policy;
+ PortableServer_ServantRetentionPolicyValue value;
+};
+
+#define PortableServer_REQUEST_PROCESSING_POLICY_ID 22
+struct PortableServer_RequestProcessingPolicy_type {
+ struct CORBA_Policy_type corba_policy;
+ PortableServer_RequestProcessingPolicyValue value;
+};
+
+#ifndef _PortableServer_POAManager_AdapterInactive_defined
+#define _PortableServer_POAManager_AdapterInactive_defined
+
+typedef struct PortableServer_POAManager_AdapterInactive {
+ int fill_me_in;
+} PortableServer_POAManager_AdapterInactive;
+
+#define ex_PortableServer_POAManager_AdapterInactive "IDL:PortableServer/POAManager/AdapterInactive:1.0"
+#endif /* !_PortableServer_POAManager_AdapterInactive_defined */
+
+typedef enum { PortableServer_POAManager_HOLDING,
+ PortableServer_POAManager_ACTIVE,
+ PortableServer_POAManager_DISCARDING,
+ PortableServer_POAManager_INACTIVE
+} PortableServer_POAManager_State;
+
+struct PortableServer_POAManager_type {
+ struct ORBit_PseudoObject_struct parent;
+ GSList* poa_collection;
+ CORBA_ORB orb;
+ PortableServer_POAManager_State state;
+};
+
+struct PortableServer_AdapterActivator_type {
+ int fill_me_in;
+};
+
+struct PortableServer_ServantManager_type {
+ int fill_me_in;
+};
+
+#ifndef _PortableServer_POA_AdapterAlreadyExists_defined
+#define _PortableServer_POA_AdapterAlreadyExists_defined
+
+typedef struct PortableServer_POA_AdapterAlreadyExists {
+ int fill_me_in;
+} PortableServer_POA_AdapterAlreadyExists;
+
+#define ex_PortableServer_POA_AdapterAlreadyExists "IDL:PortableServer/POA/AdapterAlreadyExists:1.0"
+#endif /* !_PortableServer_POA_AdapterAlreadyExists_defined */
+
+#ifndef _PortableServer_POAManager_AdapterInactive_defined
+#define _PortableServer_POAManager_AdapterInactive_defined
+
+typedef struct PortableServer_POAManager_AdapterInactive {
+ int fill_me_in;
+} PortableServer_POAManager_AdapterInactive;
+
+#define ex_PortableServer_POAManager_AdapterInactive "IDL:PortableServer/POAManager/AdapterInactive:1.0"
+#endif /* !_PortableServer_POAManager_AdapterInactive_defined */
+
+#ifndef _PortableServer_POA_AdapterNonExistent_defined
+#define _PortableServer_POA_AdapterNonExistent_defined
+
+typedef struct PortableServer_POA_AdapterNonExistent {
+ int fill_me_in;
+} PortableServer_POA_AdapterNonExistent;
+
+#define ex_PortableServer_POA_AdapterNonExistent "IDL:PortableServer/POA/AdapterNonExistent:1.0"
+#endif /* !_PortableServer_POA_AdapterNonExistent_defined */
+
+#ifndef _PortableServer_POA_InvalidPolicy_defined
+#define _PortableServer_POA_InvalidPolicy_defined
+
+typedef struct PortableServer_POA_InvalidPolicy {
+ CORBA_unsigned_short index;
+} PortableServer_POA_InvalidPolicy;
+
+#define ex_PortableServer_POA_InvalidPolicy "IDL:PortableServer/POA/InvalidPolicy:1.0"
+#endif /* !_PortableServer_POA_InvalidPolicy_defined */
+
+#ifndef _PortableServer_POA_NoServant_defined
+#define _PortableServer_POA_NoServant_defined
+
+typedef struct PortableServer_POA_NoServant {
+ int fill_me_in;
+} PortableServer_POA_NoServant;
+
+#define ex_PortableServer_POA_NoServant "IDL:PortableServer/POA/NoServant:1.0"
+#endif /* !_PortableServer_POA_NoServant_defined */
+
+#ifndef _PortableServer_POA_ObjectAlreadyActive_defined
+#define _PortableServer_POA_ObjectAlreadyActive_defined
+
+typedef struct PortableServer_POA_ObjectAlreadyActive {
+ int fill_me_in;
+} PortableServer_POA_ObjectAlreadyActive;
+
+#define ex_PortableServer_POA_ObjectAlreadyActive "IDL:PortableServer/POA/ObjectAlreadyActive:1.0"
+#endif /* !_PortableServer_POA_ObjectAlreadyActive_defined */
+
+#ifndef _PortableServer_POA_ObjectNotActive_defined
+#define _PortableServer_POA_ObjectNotActive_defined
+
+typedef struct PortableServer_POA_ObjectNotActive {
+ int fill_me_in;
+} PortableServer_POA_ObjectNotActive;
+
+#define ex_PortableServer_POA_ObjectNotActive "IDL:PortableServer/POA/ObjectNotActive:1.0"
+#endif /* !_PortableServer_POA_ObjectNotActive_defined */
+
+#ifndef _PortableServer_POA_ServantAlreadyActive_defined
+#define _PortableServer_POA_ServantAlreadyActive_defined
+
+typedef struct PortableServer_POA_ServantAlreadyActive {
+ int fill_me_in;
+} PortableServer_POA_ServantAlreadyActive;
+
+#define ex_PortableServer_POA_ServantAlreadyActive "IDL:PortableServer/POA/ServantAlreadyActive:1.0"
+#endif /* !_PortableServer_POA_ServantAlreadyActive_defined */
+
+#ifndef _PortableServer_POA_ServantNotActive_defined
+#define _PortableServer_POA_ServantNotActive_defined
+
+typedef struct PortableServer_POA_ServantNotActive {
+ int fill_me_in;
+} PortableServer_POA_ServantNotActive;
+
+#define ex_PortableServer_POA_ServantNotActive "IDL:PortableServer/POA/ServantNotActive:1.0"
+#endif /* !_PortableServer_POA_ServantNotActive_defined */
+
+#ifndef _PortableServer_POA_WrongAdapter_defined
+#define _PortableServer_POA_WrongAdapter_defined
+
+typedef struct PortableServer_POA_WrongAdapter {
+ int fill_me_in;
+} PortableServer_POA_WrongAdapter;
+
+#define ex_PortableServer_POA_WrongAdapter "IDL:PortableServer/POA/WrongAdapter:1.0"
+#endif /* !_PortableServer_POA_WrongAdapter_defined */
+
+#ifndef _PortableServer_POA_WrongPolicy_defined
+#define _PortableServer_POA_WrongPolicy_defined
+
+typedef struct PortableServer_POA_WrongPolicy {
+ int fill_me_in;
+} PortableServer_POA_WrongPolicy;
+
+#define ex_PortableServer_POA_WrongPolicy "IDL:PortableServer/POA/WrongPolicy:1.0"
+#endif /* !_PortableServer_POA_WrongPolicy_defined */
+
+#ifndef _PortableServer_Current_NoContext_defined
+#define _PortableServer_Current_NoContext_defined
+
+typedef struct PortableServer_Current_NoContext {
+ int fill_me_in;
+} PortableServer_Current_NoContext;
+
+#define ex_PortableServer_Current_NoContext "IDL:PortableServer/Current/NoContext:1.0"
+#endif /* !_PortableServer_Current_NoContext_defined */
+
+struct PortableServer_Current_type {
+ int fill_me_in;
+};
+
+typedef struct PortableServer_ServantBase__epv {
+ void *_private;
+ void (*finalize)(PortableServer_Servant, CORBA_Environment *);
+ PortableServer_POA (*default_POA)(PortableServer_Servant, CORBA_Environment *);
+} PortableServer_ServantBase__epv;
+
+typedef PortableServer_ServantBase__epv *PortableServer_ServantBase__vepv;
+
+typedef struct PortableServer_ServantBase {
+ void *_private;
+ PortableServer_ServantBase__vepv *vepv;
+} PortableServer_ServantBase;
+
+/* 19.27 */
+
+typedef void (*PortableServer_DynamicImplRoutine) (PortableServer_Servant servant, CORBA_ServerRequest request);
+
+typedef struct PortableServer_DynamicImpl__epv {
+ void *_private;
+ PortableServer_DynamicImplRoutine invoke;
+ CORBA_RepositoryId (*primary_interface) (PortableServer_Servant svt, PortableServer_ObjectId id, PortableServer_POA poa, CORBA_Environment *env);
+} PortableServer_DynamicImpl__epv;
+
+typedef struct PortableServer_DynamicImpl__vepv {
+ PortableServer_ServantBase__epv *_base_epv;
+ PortableServer_DynamicImpl__epv *PortableServer_DynamicImpl_epv;
+} PortableServer_DynamicImpl__vepv;
+
+typedef struct PortableServer_DynamicImpl {
+ void *_private;
+ PortableServer_DynamicImpl__vepv *vepv;
+} PortableServer_DynamicImpl;
+
+typedef struct {
+ void *_private;
+} POA_PortableServer_ServantManager__epv;
+
+typedef struct {
+ void *_private;
+
+ PortableServer_Servant (*incarnate) (PortableServer_Servant servant,
+ PortableServer_ObjectId * oid,
+ PortableServer_POA adapter,
+ CORBA_Environment * ev);
+
+ void (*etherealize) (PortableServer_Servant servant,
+ PortableServer_ObjectId* oid,
+ PortableServer_POA adapter,
+ PortableServer_Servant serv,
+ CORBA_boolean cleanup_in_progress,
+ CORBA_boolean remaining_activations,
+ CORBA_Environment * ev);
+
+} POA_PortableServer_ServantActivator__epv;
+
+typedef struct {
+ PortableServer_ServantBase__epv *_base_epv;
+ POA_PortableServer_ServantManager__epv *PortableServer_ServantManager_epv;
+ POA_PortableServer_ServantActivator__epv *PortableServer_ServantActivator_epv;
+} POA_PortableServer_ServantActivator__vepv;
+
+typedef struct {
+ void *_private;
+ POA_PortableServer_ServantActivator__vepv *vepv;
+} POA_PortableServer_ServantActivator;
+
+extern void
+POA_PortableServer_ServantActivator__init(PortableServer_Servant servant,
+ CORBA_Environment * ev);
+extern void
+POA_PortableServer_ServantActivator__fini(PortableServer_Servant servant,
+ CORBA_Environment * ev);
+
+typedef struct {
+ void *_private;
+
+ PortableServer_Servant (*preinvoke) (PortableServer_Servant servant,
+ PortableServer_ObjectId * oid,
+ PortableServer_POA adapter,
+ CORBA_Identifier operation,
+ PortableServer_ServantLocator_Cookie *the_cookie,
+ CORBA_Environment * ev);
+
+ void (*postinvoke) (PortableServer_Servant servant,
+ PortableServer_ObjectId * oid,
+ PortableServer_POA adapter,
+ CORBA_Identifier operation,
+ PortableServer_ServantLocator_Cookie the_cookie,
+ PortableServer_Servant the_servant,
+ CORBA_Environment * ev);
+} POA_PortableServer_ServantLocator__epv;
+
+typedef struct {
+ PortableServer_ServantBase__epv *_base_epv;
+ POA_PortableServer_ServantManager__epv *PortableServer_ServantManager_epv;
+ POA_PortableServer_ServantLocator__epv *PortableServer_ServantLocator_epv;
+} POA_PortableServer_ServantLocator__vepv;
+
+typedef struct {
+ void *_private;
+ POA_PortableServer_ServantLocator__vepv *vepv;
+} POA_PortableServer_ServantLocator;
+
+extern void
+POA_PortableServer_ServantLocator__init(PortableServer_Servant servant,
+ CORBA_Environment * ev);
+extern void
+POA_PortableServer_ServantLocator__fini(PortableServer_Servant servant,
+ CORBA_Environment * ev);
+
+struct CORBA_ServerRequest_type {
+ struct ORBit_PseudoObject_struct parent;
+ GIOPRecvBuffer *rbuf;
+ GIOPSendBuffer *sbuf;
+ CORBA_NVList *params;
+ CORBA_ORB orb;
+ guchar did_ctx, did_exc;
+};
+
+#endif /* !_ORBIT_CORBA_PORTABLESERVER_TYPE_H_ */
diff -urN linux-2.4.1/net/korbit/orb/corba_sequences.h linux-2.4.1-korbit/net/korbit/orb/corba_sequences.h
--- linux-2.4.1/net/korbit/orb/corba_sequences.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/corba_sequences.h Thu Feb 1 11:47:12 2001
@@ -0,0 +1,74 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#ifndef _ORBIT_CORBA_SEQUENCES_H_
+#define _ORBIT_CORBA_SEQUENCES_H_
+
+
+/* moved from sequences.h */
+#include "corba_basic_sequences_type.h"
+
+typedef CORBA_sequence_octet CORBA_ReferenceData;
+
+#define _CORBA_sequence_ServiceOption_defined
+typedef struct CORBA_sequence_ServiceOption CORBA_sequence_ServiceOption;
+
+#define _CORBA_sequence_ServiceDetail_defined
+typedef struct CORBA_sequence_ServiceDetail CORBA_sequence_ServiceDetail;
+
+#define _CORBA_sequence_ORB_ObjectId_defined
+typedef struct CORBA_sequence_ORB_ObjectId CORBA_ORB_ObjectIdList;
+
+#define _CORBA_sequence_NameValuePair_defined
+typedef struct CORBA_sequence_NameValuePair CORBA_NameValuePairSeq;
+
+#define _CORBA_sequence_CORBA_any_defined
+typedef struct CORBA_sequence_CORBA_any_struct CORBA_AnySeq;
+typedef struct CORBA_sequence_CORBA_any_struct CORBA_sequence_CORBA_any;
+
+#define _CORBA_sequence_Policy_defined
+typedef struct CORBA_sequence_Policy CORBA_PolicyList;
+
+#define _CORBA_sequence_DomainManager_defined
+typedef struct CORBA_sequence_DomainManager CORBA_DomainManagerList;
+
+#define _PortableServer_sequence_octet_defined
+typedef struct PortableServer_sequence_octet PortableServer_ObjectId;
+
+
+/* Moved from orbit_types.h */
+#ifndef HAVE_CORBA_PRINCIPAL
+#define HAVE_CORBA_PRINCIPAL 1
+typedef CORBA_sequence_octet CORBA_Principal;
+#endif
+typedef CORBA_sequence_octet CORBA_DynAny_OctetSeq;
+typedef CORBA_sequence_octet CORBA_DynFixed_OctetSeq;
+typedef CORBA_sequence_octet CORBA_DynEnum_OctetSeq;
+typedef CORBA_sequence_octet CORBA_DynStruct_OctetSeq;
+typedef CORBA_sequence_octet CORBA_DynUnion_OctetSeq;
+typedef CORBA_sequence_octet CORBA_DynSequence_OctetSeq;
+typedef CORBA_sequence_octet CORBA_DynArray_OctetSeq;
+
+#endif /* !_ORBIT_CORBA_SEQUENCES_H_ */
diff -urN linux-2.4.1/net/korbit/orb/corba_sequences_type.h linux-2.4.1-korbit/net/korbit/orb/corba_sequences_type.h
--- linux-2.4.1/net/korbit/orb/corba_sequences_type.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/corba_sequences_type.h Thu Feb 1 11:47:12 2001
@@ -0,0 +1,98 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#ifndef _ORBIT_CORBA_SEQUENCES_TYPE_H_
+#define _ORBIT_CORBA_SEQUENCES_TYPE_H_
+
+#include "corba_sequences.h"
+
+struct CORBA_sequence_ServiceOption {
+ CORBA_unsigned_long _maximum;
+ CORBA_unsigned_long _length;
+ CORBA_ServiceOption *_buffer;
+ CORBA_boolean _release;
+};
+
+struct CORBA_sequence_ServiceDetail {
+ CORBA_unsigned_long _maximum;
+ CORBA_unsigned_long _length;
+ CORBA_ServiceDetail *_buffer;
+ CORBA_boolean _release;
+};
+
+struct CORBA_sequence_ORB_ObjectId {
+ CORBA_unsigned_long _maximum;
+ CORBA_unsigned_long _length;
+ CORBA_ORB_ObjectId *_buffer;
+ CORBA_boolean _release;
+};
+
+struct CORBA_sequence_NameValuePair {
+ CORBA_unsigned_long _maximum;
+ CORBA_unsigned_long _length;
+ struct CORBA_NameValuePair *_buffer;
+ CORBA_boolean _release;
+};
+
+struct CORBA_sequence_CORBA_any_struct {
+ CORBA_unsigned_long _maximum;
+ CORBA_unsigned_long _length;
+ CORBA_any *_buffer;
+ CORBA_boolean _release;
+};
+
+struct CORBA_sequence_Policy {
+ CORBA_unsigned_long _maximum;
+ CORBA_unsigned_long _length;
+ CORBA_Policy *_buffer;
+ CORBA_boolean _release;
+};
+
+struct CORBA_sequence_DomainManager {
+ CORBA_unsigned_long _maximum;
+ CORBA_unsigned_long _length;
+ CORBA_DomainManager *_buffer;
+ CORBA_boolean _release;
+};
+
+struct PortableServer_sequence_octet {
+ CORBA_unsigned_long _maximum;
+ CORBA_unsigned_long _length;
+ CORBA_octet *_buffer;
+ CORBA_boolean _release;
+};
+
+/* Generic sequence */
+struct CORBA_Sequence_type {
+ CORBA_unsigned_long _maximum;
+ CORBA_unsigned_long _length;
+ void *_buffer;
+ CORBA_boolean _release;
+};
+
+#define CORBA_SEQFLAGS_RELEASE 1
+
+
+#endif /* !_ORBIT_CORBA_SEQUENCES_TYPE_H_ */
diff -urN linux-2.4.1/net/korbit/orb/corba_typecode.h linux-2.4.1-korbit/net/korbit/orb/corba_typecode.h
--- linux-2.4.1/net/korbit/orb/corba_typecode.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/corba_typecode.h Thu Feb 1 11:47:12 2001
@@ -0,0 +1,167 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#ifndef _ORBIT_CORBA_TYPECODE_H_
+#define _ORBIT_CORBA_TYPECODE_H_
+
+/* moved from orbit_types.h */
+typedef struct CORBA_TypeCode_struct *CORBA_TypeCode;
+
+typedef enum {
+ CORBA_tk_null=0,
+ CORBA_tk_void=1,
+ CORBA_tk_short=2,
+ CORBA_tk_long=3,
+ CORBA_tk_ushort=4,
+ CORBA_tk_ulong=5,
+ CORBA_tk_float=6,
+ CORBA_tk_double=7,
+ CORBA_tk_boolean=8,
+ CORBA_tk_char=9,
+ CORBA_tk_octet=10,
+ CORBA_tk_any=11,
+ CORBA_tk_TypeCode=12,
+ CORBA_tk_Principal=13,
+ CORBA_tk_objref=14,
+ CORBA_tk_struct=15,
+ CORBA_tk_union=16,
+ CORBA_tk_enum=17,
+ CORBA_tk_string=18,
+ CORBA_tk_sequence=19,
+ CORBA_tk_array=20,
+ CORBA_tk_alias=21,
+ CORBA_tk_except=22,
+ CORBA_tk_longlong=23,
+ CORBA_tk_ulonglong=24,
+ CORBA_tk_longdouble=25,
+ CORBA_tk_wchar=26,
+ CORBA_tk_wstring=27,
+ CORBA_tk_fixed=28,
+ CORBA_tk_recursive=0xffffffff,
+ CORBA_tk_last=29 /* hack for GIOP */
+} CORBA_TCKind;
+
+#define TC_CORBA_short TC_short
+#define TC_CORBA_long TC_long
+#define TC_CORBA_longlong TC_longlong
+#define TC_CORBA_long_long TC_longlong
+#define TC_CORBA_ushort TC_ushort
+#define TC_CORBA_unsigned_short TC_ushort
+#define TC_CORBA_ulong TC_ulong
+#define TC_CORBA_unsigned_long TC_ulong
+#define TC_CORBA_ulonglong TC_ulonglong
+#define TC_CORBA_unsigned_long_long TC_ulonglong
+#define TC_CORBA_float TC_float
+#define TC_CORBA_double TC_double
+#define TC_CORBA_longdouble TC_longdouble
+#define TC_CORBA_long_double TC_longdouble
+#define TC_CORBA_boolean TC_boolean
+#define TC_CORBA_char TC_char
+#define TC_CORBA_wchar TC_wchar
+#define TC_CORBA_octet TC_octet
+#define TC_CORBA_any TC_any
+#define TC_CORBA_TypeCode TC_TypeCode
+#define TC_CORBA_Principal TC_Principal
+#define TC_CORBA_Object TC_Object
+#define TC_CORBA_string TC_string
+#define TC_CORBA_wstring TC_wstring
+
+#define TC_null ((CORBA_TypeCode)&TC_null_struct)
+#define TC_void ((CORBA_TypeCode)&TC_void_struct)
+#define TC_short ((CORBA_TypeCode)&TC_short_struct)
+#define TC_long ((CORBA_TypeCode)&TC_long_struct)
+#define TC_longlong ((CORBA_TypeCode)&TC_longlong_struct)
+#define TC_ushort ((CORBA_TypeCode)&TC_ushort_struct)
+#define TC_ulong ((CORBA_TypeCode)&TC_ulong_struct)
+#define TC_ulonglong ((CORBA_TypeCode)&TC_ulonglong_struct)
+#define TC_float ((CORBA_TypeCode)&TC_float_struct)
+#define TC_double ((CORBA_TypeCode)&TC_double_struct)
+#define TC_longdouble ((CORBA_TypeCode)&TC_longdouble_struct)
+#define TC_boolean ((CORBA_TypeCode)&TC_boolean_struct)
+#define TC_char ((CORBA_TypeCode)&TC_char_struct)
+#define TC_wchar ((CORBA_TypeCode)&TC_wchar_struct)
+#define TC_octet ((CORBA_TypeCode)&TC_octet_struct)
+#define TC_any ((CORBA_TypeCode)&TC_any_struct)
+#define TC_TypeCode ((CORBA_TypeCode)&TC_TypeCode_struct)
+#define TC_Principal ((CORBA_TypeCode)&TC_Principal_struct)
+#define TC_Object ((CORBA_TypeCode)&TC_Object_struct)
+#define TC_string ((CORBA_TypeCode)&TC_string_struct)
+#define TC_wstring ((CORBA_TypeCode)&TC_wstring_struct)
+#define TC_CORBA_NamedValue ((CORBA_TypeCode)&TC_CORBA_NamedValue_struct)
+
+#define TC_CORBA_short_struct TC_short_struct
+#define TC_CORBA_long_struct TC_long_struct
+#define TC_CORBA_longlong_struct TC_longlong_struct
+#define TC_CORBA_long_long_struct TC_longlong_struct
+#define TC_CORBA_ushort_struct TC_ushort_struct
+#define TC_CORBA_unsigned_short_struct TC_ushort_struct
+#define TC_CORBA_ulong_struct TC_ulong_struct
+#define TC_CORBA_unsigned_long_struct TC_ulong_struct
+#define TC_CORBA_ulonglong_struct TC_ulonglong_struct
+#define TC_CORBA_unsigned_long_long_struct TC_ulonglong_struct
+#define TC_CORBA_float_struct TC_float_struct
+#define TC_CORBA_double_struct TC_double_struct
+#define TC_CORBA_longdouble_struct TC_longdouble_struct
+#define TC_CORBA_long_double_struct TC_longdouble_struct
+#define TC_CORBA_boolean_struct TC_boolean_struct
+#define TC_CORBA_char_struct TC_char_struct
+#define TC_CORBA_wchar_struct TC_wchar_struct
+#define TC_CORBA_octet_struct TC_octet_struct
+#define TC_CORBA_any_struct TC_any_struct
+#define TC_CORBA_TypeCode_struct TC_TypeCode_struct
+#define TC_CORBA_Principal_struct TC_Principal_struct
+#define TC_CORBA_Object_struct TC_Object_struct
+#define TC_CORBA_string_struct TC_string_struct
+#define TC_CORBA_wstring_struct TC_wstring_struct
+
+extern const struct CORBA_TypeCode_struct TC_null_struct;
+extern const struct CORBA_TypeCode_struct TC_void_struct;
+extern const struct CORBA_TypeCode_struct TC_short_struct;
+extern const struct CORBA_TypeCode_struct TC_long_struct;
+extern const struct CORBA_TypeCode_struct TC_longlong_struct;
+extern const struct CORBA_TypeCode_struct TC_ushort_struct;
+extern const struct CORBA_TypeCode_struct TC_ulong_struct;
+extern const struct CORBA_TypeCode_struct TC_ulonglong_struct;
+extern const struct CORBA_TypeCode_struct TC_float_struct;
+extern const struct CORBA_TypeCode_struct TC_double_struct;
+extern const struct CORBA_TypeCode_struct TC_longdouble_struct;
+extern const struct CORBA_TypeCode_struct TC_boolean_struct;
+extern const struct CORBA_TypeCode_struct TC_char_struct;
+extern const struct CORBA_TypeCode_struct TC_wchar_struct;
+extern const struct CORBA_TypeCode_struct TC_octet_struct;
+extern const struct CORBA_TypeCode_struct TC_any_struct;
+extern const struct CORBA_TypeCode_struct TC_TypeCode_struct;
+extern const struct CORBA_TypeCode_struct TC_Principal_struct;
+extern const struct CORBA_TypeCode_struct TC_Object_struct;
+extern const struct CORBA_TypeCode_struct TC_string_struct;
+extern const struct CORBA_TypeCode_struct TC_wstring_struct;
+extern const struct CORBA_TypeCode_struct TC_CORBA_NamedValue_struct;
+
+
+#endif /* !_ORBIT_CORBA_TYPECODE_H_ */
+
+
+
+
diff -urN linux-2.4.1/net/korbit/orb/corba_typecode_type.h linux-2.4.1-korbit/net/korbit/orb/corba_typecode_type.h
--- linux-2.4.1/net/korbit/orb/corba_typecode_type.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/corba_typecode_type.h Thu Feb 1 16:20:50 2001
@@ -0,0 +1,66 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#ifndef _ORBIT_CORBA_TYPECODE_TYPE_H_
+#define _ORBIT_CORBA_TYPECODE_TYPE_H_
+
+#include <ORBitutil/basic_types.h>
+#include "corba_typecode.h"
+#include "corba_any.h"
+
+typedef struct CORBA_TypeCode_Bounds {
+ int dummy;
+} CORBA_TypeCode_Bounds;
+
+typedef struct CORBA_TypeCode_BadKind {
+ int dummy;
+} CORBA_TypeCode_BadKind;
+
+struct CORBA_TypeCode_struct {
+ struct ORBit_PseudoObject_struct parent;
+ CORBA_TCKind kind;
+#ifndef __KORBIT__
+ const
+#endif
+ char *name;
+#ifndef __KORBIT__
+ const
+#endif
+ char *repo_id;
+ CORBA_unsigned_long length;
+ CORBA_unsigned_long sub_parts;
+ const char **subnames; /* for struct, exception, union, enum */
+ CORBA_TypeCode *subtypes; /* for struct, exception, union, alias, array, sequence */
+ CORBA_any *sublabels; /* for union */
+ CORBA_TypeCode discriminator; /* for union */
+ CORBA_unsigned_long recurse_depth; /* for recursive sequence */
+ CORBA_long default_index; /* for union */
+ CORBA_unsigned_short digits; /* for fixed */
+ CORBA_short scale; /* for fixed */
+};
+
+
+#endif /* !_ORBIT_CORBA_TYPECODE_TYPE_H_ */
+
diff -urN linux-2.4.1/net/korbit/orb/dii.c linux-2.4.1-korbit/net/korbit/orb/dii.c
--- linux-2.4.1/net/korbit/orb/dii.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/dii.c Thu Feb 1 11:47:12 2001
@@ -0,0 +1,454 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Red Hat Software, Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Elliot Lee <sopwith@redhat.com>
+ * Dick Porter <dick@cymru.net>
+ *
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include "orbit.h"
+#ifndef __KORBIT__
+#include "interface_repository.h"
+#endif /* !__KORBIT__ */
+
+struct CORBA_Request_type {
+ struct ORBit_PseudoObject_struct parent;
+
+ CORBA_Object obj;
+ CORBA_Context ctx;
+
+ CORBA_Flags req_flags;
+ CORBA_Identifier operation;
+
+ CORBA_NamedValue *result;
+ CORBA_NVList *arg_list;
+
+ CORBA_unsigned_long request_id;
+ GIOPSendBuffer *request_buffer;
+ GIOPRecvBuffer *reply_buffer;
+};
+
+static const ORBit_RootObject_Interface interface_CORBA_Request = {
+ (void (*)(gpointer,CORBA_Environment *))CORBA_Request_delete
+};
+
+/* Section 5.2.1 */
+CORBA_Status
+CORBA_Object_create_request(CORBA_Object obj,
+ CORBA_Context ctx,
+ CORBA_Identifier operation,
+ CORBA_NVList *arg_list,
+ CORBA_NamedValue *result,
+ CORBA_Request *request,
+ CORBA_Flags req_flags,
+ CORBA_Environment *ev)
+{
+ CORBA_Request new;
+
+ new=g_new0(struct CORBA_Request_type, 1);
+ ORBit_pseudo_object_init((ORBit_PseudoObject)new, ORBIT_PSEUDO_REQUEST, ev);
+ ORBit_RootObject_set_interface((ORBit_RootObject)new,
+ (ORBit_RootObject_Interface *)&interface_CORBA_Request, ev);
+
+ if(new==NULL) {
+ CORBA_exception_set_system(ev,
+ ex_CORBA_NO_MEMORY,
+ CORBA_COMPLETED_NO);
+ return;
+ }
+
+ new->obj=CORBA_Object_duplicate(obj, ev);
+ new->ctx=(CORBA_Context)CORBA_Object_duplicate((CORBA_Object)ctx, ev);
+ new->operation=CORBA_string_dup(operation);
+
+ new->result=result;
+
+ new->req_flags=req_flags;
+ new->request_id = giop_get_request_id();
+ new->arg_list = arg_list;
+
+ *request=(CORBA_Request)CORBA_Object_duplicate((CORBA_Object)new, ev);
+}
+
+/* Section 5.2, 5.2.2 */
+CORBA_Status
+CORBA_Request_add_arg(CORBA_Request req,
+ CORBA_Identifier name,
+ CORBA_TypeCode arg_type,
+ void *value,
+ CORBA_long len,
+ CORBA_Flags arg_flags,
+ CORBA_Environment *ev)
+{
+ gpointer new_value;
+
+ g_assert(req!=NULL);
+
+ if((arg_flags & CORBA_IN_COPY_VALUE) && (arg_flags & CORBA_ARG_IN)) {
+ new_value = ORBit_copy_value(value, arg_type);
+ if(new_value==NULL) {
+ CORBA_exception_set_system(ev, ex_CORBA_NO_MEMORY,
+ CORBA_COMPLETED_NO);
+ return;
+ }
+ } else
+ new_value=value;
+
+ CORBA_NVList_add_item(req->arg_list, name, arg_type,
+ new_value, len, arg_flags | req->req_flags, ev);
+}
+
+/* Section 5.2, 5.2.3 */
+CORBA_Status
+CORBA_Request_invoke(CORBA_Request req,
+ CORBA_Flags invoke_flags,
+ CORBA_Environment *ev)
+{
+ CORBA_Request_send(req, invoke_flags, ev);
+ if(ev->_major == CORBA_NO_EXCEPTION)
+ CORBA_Request_get_response(req, invoke_flags, ev);
+}
+
+/* Section 5.2, 5.2.4 */
+CORBA_Status CORBA_Request_delete(CORBA_Request req, CORBA_Environment *ev)
+{
+ CORBA_Object_release(req->obj, ev);
+ CORBA_Object_release((CORBA_Object)req->ctx, ev);
+
+ if(req->operation != NULL)
+ CORBA_free(req->operation);
+
+ if(req->arg_list != NULL) {
+ if(req->req_flags & CORBA_OUT_LIST_MEMORY)
+ CORBA_NVList_free(req->arg_list, ev);
+ else {
+ int i;
+ for(i = 0; i < req->arg_list->list->len; i++)
+ ORBit_NamedValue_free(&g_array_index(req->arg_list->list,
+ CORBA_NamedValue, i));
+ g_array_free(req->arg_list->list, TRUE);
+
+ g_free(req->arg_list);
+ }
+ }
+
+ if(req->result!=NULL)
+ ORBit_NamedValue_free(req->result);
+
+ if(req->request_buffer)
+ giop_send_buffer_unuse(req->request_buffer);
+
+ if(req->reply_buffer)
+ giop_recv_buffer_unuse(req->reply_buffer);
+
+ g_free(req);
+}
+
+/* Section 5.2, 5.3.1 */
+CORBA_Status
+CORBA_Request_send(CORBA_Request req,
+ CORBA_Flags invoke_flags,
+ CORBA_Environment *ev)
+{
+ int i;
+ GIOPConnection *cnx;
+
+ struct { CORBA_unsigned_long opstrlen; char opname[1]; } *opnameinfo;
+ struct iovec opvec = { NULL, 0 };
+
+ opvec.iov_len = strlen(req->operation)+1+sizeof(CORBA_unsigned_long);
+
+ opnameinfo = g_malloc(strlen(req->operation)+1+sizeof(CORBA_unsigned_long));
+ opvec.iov_base = (gpointer)opnameinfo;
+ opnameinfo->opstrlen = strlen(req->operation) + 1;
+ strcpy(opnameinfo->opname, req->operation);
+
+ cnx = ORBit_object_get_connection(req->obj);
+
+ g_assert(req->obj->active_profile);
+ req->request_buffer =
+ giop_send_request_buffer_use(req->obj->connection,
+ NULL,
+ req->request_id,
+ req->result?TRUE:FALSE,
+ &(req->obj->active_profile->object_key_vec),
+ &opvec,
+ &ORBit_default_principal_iovec
+ );
+
+ if(!req->request_buffer) {
+ CORBA_exception_set_system(ev,
+ ex_CORBA_COMM_FAILURE,
+ CORBA_COMPLETED_NO);
+ return;
+ }
+
+ for(i = 0; i < req->arg_list->list->len; i++) {
+ CORBA_NamedValue *nv;
+
+ nv = &g_array_index(req->arg_list->list, CORBA_NamedValue, i);
+
+ if((nv->arg_modes & CORBA_ARG_IN)
+ || (nv->arg_modes & CORBA_ARG_INOUT))
+ ORBit_marshal_arg(req->request_buffer,
+ nv->argument._value,
+ nv->argument._type);
+ }
+
+ giop_send_buffer_write(req->request_buffer);
+
+ giop_send_buffer_unuse(req->request_buffer);
+ req->request_buffer = 0;
+
+ g_free(opnameinfo);
+}
+
+/* Section 5.3.2 */
+CORBA_Status
+CORBA_send_multiple_requests(CORBA_Request *reqs,
+ CORBA_Environment *env,
+ CORBA_long count,
+ CORBA_Flags invoke_flags)
+{
+ int i;
+
+ for(i = 0; i < count; i++)
+ CORBA_Request_send(reqs[i], invoke_flags, env);
+}
+
+void
+ORBit_handle_dii_reply(CORBA_Request req, CORBA_Environment *ev)
+{
+ int i;
+
+ /* XXX TODO - handle exceptions, location forwards(?), all that */
+ req->result->argument._value =
+ ORBit_demarshal_arg(req->reply_buffer, req->result->argument._type,
+ TRUE, req->obj->orb);
+ req->result->argument._release = CORBA_TRUE;
+
+ for(i = 0; i < req->arg_list->list->len; i++) {
+ CORBA_NamedValue *nv;
+
+ nv = &g_array_index(req->arg_list->list, CORBA_NamedValue, i);
+
+ if(nv->arg_modes & CORBA_ARG_INOUT) {
+ CORBA_Object_duplicate((CORBA_Object)nv->argument._type, NULL);
+ CORBA_any__free(&nv->argument, NULL, TRUE);
+ }
+
+ if((nv->arg_modes & CORBA_ARG_OUT)
+ || (nv->arg_modes & CORBA_ARG_INOUT))
+ nv->argument._value = ORBit_demarshal_arg(req->reply_buffer,
+ nv->argument._type,
+ TRUE, req->obj->orb);
+ }
+
+ giop_recv_buffer_unuse(req->reply_buffer);
+ req->reply_buffer = 0;
+}
+
+/* Section 5.2, 5.3.3
+ *
+ * Raises: WrongTransaction
+ */
+CORBA_Status
+CORBA_Request_get_response(CORBA_Request req,
+ CORBA_Flags response_flags,
+ CORBA_Environment *ev)
+{
+ req->reply_buffer = giop_recv_reply_buffer_use(req->request_id,
+ !(response_flags & CORBA_RESP_NO_WAIT));
+
+ if(!req->reply_buffer) {
+ CORBA_exception_set_system(ev,
+ ex_CORBA_COMM_FAILURE,
+ CORBA_COMPLETED_NO);
+ return;
+ }
+
+ ORBit_handle_dii_reply(req, ev);
+}
+
+/* Section 5.3.4
+ *
+ * Raises: WrongTransaction
+ */
+CORBA_Status
+CORBA_Request_get_next_response(CORBA_Environment *env,
+ CORBA_Flags response_flags,
+ CORBA_Request *req)
+{
+ int i;
+ GIOPRecvBuffer *rb;
+ GArray *reqids = g_array_new(FALSE, FALSE,
+ sizeof(CORBA_unsigned_long));
+
+ for(i = 0; req[i]; i++) {
+ g_array_append_val(reqids, req[i]->request_id);
+ }
+
+ rb = giop_recv_reply_buffer_use_multiple(reqids,
+ !(response_flags & CORBA_RESP_NO_WAIT));
+
+ if(rb) {
+ for(i = 0; i < reqids->len; i++) {
+ if(g_array_index(reqids, CORBA_unsigned_long, i)
+ == rb->message.u.reply.request_id) {
+ req[i]->reply_buffer = rb;
+ break;
+ }
+ }
+
+ if(i < reqids->len)
+ ORBit_handle_dii_reply(req[i], env);
+ }
+
+ g_array_free(reqids, TRUE);
+}
+
+
+/* Section 5.4.1 */
+CORBA_Status
+CORBA_ORB_create_list(CORBA_ORB orb,
+ CORBA_long count,
+ CORBA_NVList **new_list,
+ CORBA_Environment *ev)
+{
+ CORBA_NVList *new;
+
+ new = g_new0(CORBA_NVList, 1);
+ if(new==NULL) goto new_alloc_failed;
+
+ new->list = g_array_new(FALSE, TRUE, sizeof(CORBA_NamedValue));
+
+ *new_list = new;
+
+ return;
+
+ new_alloc_failed:
+ CORBA_exception_set_system(ev, ex_CORBA_NO_MEMORY, CORBA_COMPLETED_NO);
+}
+
+#ifndef __KORBIT__
+/* Section 5.4.6 */
+CORBA_Status
+CORBA_ORB_create_operation_list(CORBA_ORB orb,
+ CORBA_OperationDef oper,
+ CORBA_NVList **new_list,
+ CORBA_Environment *ev)
+{
+ if(!new_list) {
+ CORBA_exception_set_system(ev,
+ ex_CORBA_BAD_PARAM,
+ CORBA_COMPLETED_NO);
+ return;
+ }
+
+ g_warning("CORBA_ORB_create_operation_list NYI");
+
+ CORBA_exception_set_system(ev,
+ ex_CORBA_IMP_LIMIT,
+ CORBA_COMPLETED_NO);
+}
+#endif /* !__KORBIT__ */
+
+/* Section 5.4.2 */
+CORBA_Status
+CORBA_NVList_add_item(CORBA_NVList *list,
+ CORBA_Identifier item_name,
+ CORBA_TypeCode item_type,
+ void *value,
+ CORBA_long value_len,
+ CORBA_Flags item_flags,
+ CORBA_Environment *ev)
+{
+ CORBA_NamedValue newval;
+
+ g_assert(list!=NULL);
+
+ newval.name = CORBA_string_dup(item_name);
+ newval.argument._type = (CORBA_TypeCode)CORBA_Object_duplicate((CORBA_Object)item_type, ev);
+ if(item_flags & CORBA_IN_COPY_VALUE) {
+ newval.argument._value = ORBit_copy_value(value, item_type);
+ newval.argument._release = CORBA_TRUE;
+ } else {
+ newval.argument._value = value;
+ newval.argument._release = CORBA_FALSE;
+ }
+
+ newval.len = value_len; /* Is this even useful? *sigh* */
+ newval.arg_modes = item_flags;
+
+ g_array_append_val(list->list, newval);
+}
+
+void ORBit_NamedValue_free(CORBA_NamedValue *nv)
+{
+ CORBA_free(nv->name);
+}
+
+/* Section 5.4.3 */
+CORBA_Status
+CORBA_NVList_free(CORBA_NVList *list,
+ CORBA_Environment *ev)
+{
+ int i;
+
+ CORBA_NVList_free_memory(list, ev);
+
+ for(i = 0; i < list->list->len; i++)
+ ORBit_NamedValue_free(&g_array_index(list->list, CORBA_NamedValue, i));
+
+ g_array_free(list->list, TRUE);
+
+ g_free(list);
+}
+
+/* Section 5.4.4 */
+CORBA_Status
+CORBA_NVList_free_memory(CORBA_NVList *list,
+ CORBA_Environment *ev)
+{
+ int i;
+
+ for(i = 0; i < list->list->len; i++) {
+ CORBA_free(g_array_index(list->list, CORBA_NamedValue, i).argument._value);
+ g_array_index(list->list, CORBA_NamedValue, i).argument._value = NULL;
+ CORBA_Object_release((CORBA_Object)g_array_index(list->list, CORBA_NamedValue, i).argument._type, ev);
+ g_array_index(list->list, CORBA_NamedValue, i).argument._release = CORBA_FALSE;
+ }
+}
+
+
+/* Section 5.4.5 */
+CORBA_Status
+CORBA_NVList_get_count(CORBA_NVList *list,
+ CORBA_long *count,
+ CORBA_Environment *ev)
+{
+ *count = list->list->len;
+}
+
diff -urN linux-2.4.1/net/korbit/orb/dii.h linux-2.4.1-korbit/net/korbit/orb/dii.h
--- linux-2.4.1/net/korbit/orb/dii.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/dii.h Thu Feb 1 11:47:12 2001
@@ -0,0 +1,124 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#ifndef _ORBIT_DII_H_
+#define _ORBIT_DII_H_
+
+#include "orb/orbit_types.h"
+#ifndef __KORBIT__
+#include "orb/interface_repository.h"
+#endif /* !__KORBIT__ */
+
+extern CORBA_Status CORBA_Object_create_request(
+ CORBA_Object obj,
+ CORBA_Context ctx,
+ CORBA_Identifier operation,
+ CORBA_NVList *arg_list,
+ CORBA_NamedValue *result,
+ CORBA_Request *request,
+ CORBA_Flags req_flags,
+ CORBA_Environment *ev);
+
+extern CORBA_Status CORBA_Request_add_arg(
+ CORBA_Request req,
+ CORBA_Identifier name,
+ CORBA_TypeCode arg_type,
+ void *value,
+ CORBA_long len,
+ CORBA_Flags arg_flags,
+ CORBA_Environment *ev);
+
+extern CORBA_Status CORBA_Request_invoke(
+ CORBA_Request req,
+ CORBA_Flags invoke_flags,
+ CORBA_Environment *ev);
+
+extern CORBA_Status CORBA_Request_delete(
+ CORBA_Request req,
+ CORBA_Environment *ev);
+
+extern CORBA_Status CORBA_Request_send(
+ CORBA_Request req,
+ CORBA_Flags invoke_flags,
+ CORBA_Environment *ev);
+
+extern CORBA_Status CORBA_send_multiple_requests(
+ CORBA_Request reqs[],
+ CORBA_Environment *env,
+ CORBA_long count,
+ CORBA_Flags invoke_flags);
+
+extern CORBA_Status CORBA_Request_get_response(
+ CORBA_Request req,
+ CORBA_Flags response_flags,
+ CORBA_Environment *ev);
+
+extern CORBA_Status CORBA_get_next_response(
+ CORBA_Environment *env,
+ CORBA_Flags response_flags,
+ CORBA_Request *req);
+
+extern CORBA_Status CORBA_NVList_add_item(
+ CORBA_NVList *list,
+ CORBA_Identifier item_name,
+ CORBA_TypeCode item_type,
+ void *value,
+ CORBA_long value_len,
+ CORBA_Flags item_flags,
+ CORBA_Environment *ev);
+
+extern void ORBit_NamedValue_free(
+ CORBA_NamedValue *nv);
+
+
+extern CORBA_Status CORBA_ORB_create_list(
+ CORBA_ORB orb,
+ CORBA_long count,
+ CORBA_NVList **new_list,
+ CORBA_Environment *ev);
+
+#ifndef __KORBIT__
+extern CORBA_Status CORBA_ORB_create_operation_list(
+ CORBA_ORB orb,
+ CORBA_OperationDef oper,
+ CORBA_NVList **new_list,
+ CORBA_Environment *ev);
+#endif /* !__KORBIT__ */
+
+extern CORBA_Status CORBA_NVList_free(CORBA_NVList *list,
+ CORBA_Environment *ev);
+
+extern CORBA_Status CORBA_NVList_free_memory(
+ CORBA_NVList *list,
+ CORBA_Environment *ev);
+
+extern CORBA_Status CORBA_NVList_get_count(
+ CORBA_NVList *list,
+ CORBA_long *count,
+ CORBA_Environment *ev);
+
+extern const int sizeofs[], container_sizeofs[];
+
+#endif /* _ORBIT_DII_H_ */
diff -urN linux-2.4.1/net/korbit/orb/env.c linux-2.4.1-korbit/net/korbit/orb/env.c
--- linux-2.4.1/net/korbit/orb/env.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/env.c Thu Feb 1 11:47:12 2001
@@ -0,0 +1,345 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+/*
+ * CORBA_Environment handling functions
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include "orbit.h"
+#ifndef __KORBIT__
+#include "interface_repository.h"
+#endif /* !__KORBIT__ */
+
+struct SysExInfo {
+ const char *repo_id;
+ const int exnum;
+};
+
+static const struct SysExInfo exception_table[] = {
+ {NULL, 0},
+ {"IDL:CORBA/UNKNOWN:1.0", 1},
+ {"IDL:CORBA/BAD_PARAM:1.0", 2},
+ {"IDL:CORBA/NO_MEMORY:1.0", 3},
+ {"IDL:CORBA/IMP_LIMIT:1.0", 4},
+ {"IDL:CORBA/COMM_FAILURE:1.0", 5},
+ {"IDL:CORBA/INV_OBJREF:1.0", 6},
+ {"IDL:CORBA/NO_PERMISSION:1.0", 7},
+ {"IDL:CORBA/INTERNAL:1.0", 8},
+ {"IDL:CORBA/MARSHAL:1.0", 9},
+ {"IDL:CORBA/INITIALIZE:1.0", 10},
+ {"IDL:CORBA/NO_IMPLEMENT:1.0", 11},
+ {"IDL:CORBA/BAD_TYPECODE:1.0", 12},
+ {"IDL:CORBA/BAD_OPERATION:1.0", 13},
+ {"IDL:CORBA/NO_RESOURCES:1.0", 14},
+ {"IDL:CORBA/NO_RESPONSE:1.0", 15},
+ {"IDL:CORBA/PERSIST_STORE:1.0", 16},
+ {"IDL:CORBA/BAD_INV_ORDER:1.0", 17},
+ {"IDL:CORBA/TRANSIENT:1.0", 18},
+ {"IDL:CORBA/FREE_MEM:1.0", 19},
+ {"IDL:CORBA/INV_IDENT:1.0", 20},
+ {"IDL:CORBA/INV_FLAG:1.0", 21},
+ {"IDL:CORBA/INTF_REPOS:1.0", 22},
+ {"IDL:CORBA/BAD_CONTEXT:1.0", 23},
+ {"IDL:CORBA/OBJ_ADAPTER:1.0", 24},
+ {"IDL:CORBA/DATA_CONVERSION:1.0", 25},
+ {"IDL:CORBA/OBJECT_NOT_EXIST:1.0", 26},
+ {"IDL:CORBA/TRANSACTION_REQUIRED:1.0", 27},
+ {"IDL:CORBA/TRANSACTION_ROLLEDBACK:1.0", 28},
+ {"IDL:CORBA/INVALID_TRANSACTION:1.0", 29},
+ {NULL,0}
+};
+
+void CORBA_exception_free(CORBA_Environment *ev)
+{
+ g_assert(ev!=NULL);
+
+ ev->_major=CORBA_NO_EXCEPTION;
+
+ if(ev->_repo_id) {
+ CORBA_free(ev->_repo_id);
+ ev->_repo_id=NULL;
+ }
+
+ if(ev->_params) {
+ CORBA_free(ev->_params);
+ ev->_params=NULL;
+ }
+
+ if(ev->_any) {
+ CORBA_free(ev->_any);
+ ev->_any=NULL;
+ }
+}
+
+void CORBA_exception_set(CORBA_Environment *ev, CORBA_exception_type major,
+ const CORBA_char *except_repos_id, void *param)
+{
+ g_assert(ev!=NULL);
+
+ if(ev->_major != CORBA_NO_EXCEPTION)
+ CORBA_exception_free(ev);
+
+ ev->_major=major;
+
+ if(except_repos_id==NULL) {
+ ev->_repo_id=NULL;
+ } else {
+ ev->_repo_id=CORBA_string_dup(except_repos_id);
+ }
+
+ ev->_params=param;
+}
+
+void CORBA_exception_set_system(CORBA_Environment *ev, CORBA_unsigned_long ex_value,
+ CORBA_completion_status completed)
+{
+ CORBA_SystemException *new;
+
+ new=ORBit_alloc(sizeof(CORBA_SystemException), NULL, NULL);
+ if(new!=NULL) {
+ new->minor=0;
+ new->completed=completed;
+
+ /* XXX what should the repo ID be? */
+ CORBA_exception_set(ev, CORBA_SYSTEM_EXCEPTION,
+ exception_table[ex_value].repo_id,
+ new);
+ }
+}
+
+void CORBA_exception_init(CORBA_Environment *ev)
+{
+ g_assert(ev!=NULL);
+
+ ev->_major=CORBA_NO_EXCEPTION;
+ ev->_repo_id=NULL;
+ ev->_params=NULL;
+ ev->_any=NULL;
+}
+
+CORBA_char *CORBA_exception_id(CORBA_Environment *ev)
+{
+ g_assert(ev!=NULL);
+
+ if(ev->_major==CORBA_NO_EXCEPTION) {
+ return(NULL);
+ } else {
+ return(ev->_repo_id);
+ }
+}
+
+void *CORBA_exception_value(CORBA_Environment *ev)
+{
+ g_assert(ev!=NULL);
+
+ if(ev->_major==CORBA_NO_EXCEPTION) {
+ return(NULL);
+ } else {
+ return(ev->_params);
+ }
+}
+
+#ifndef __KORBIT__
+CORBA_any *CORBA_exception_as_any(CORBA_Environment *ev)
+{
+ g_assert(ev!=NULL);
+
+ if(ev->_major==CORBA_NO_EXCEPTION) {
+ return(NULL);
+ }
+
+ if(ev->_any!=NULL) {
+ return(ev->_any);
+ }
+
+ ev->_any=g_new(CORBA_any, 1);
+ if(ev->_any!=NULL) {
+ /* XXX is this the correct type? */
+ ev->_any->_type = (CORBA_TypeCode)TC_CORBA_ExceptionDescription;
+ ev->_any->_value = ev->_params;
+ ev->_any->_release = 0;
+ }
+
+ return(ev->_any);
+}
+#endif /* !__KORBIT__ */
+
+/**** ORBit_handle_exception
+ Inputs: 'rb' - a receive buffer for which an exception condition has
+ been determined
+ 'ev' - memory in which to store the exception information
+
+ 'user_exceptions' - list of user exceptions raisable
+ for this particular operation.
+ Side-effects: reinitializes '*ev'
+
+ Description:
+ During demarshalling a reply, if reply_status != CORBA_NO_EXCEPTION,
+ we must find out what exception was raised and place that information
+ in '*ev'. */
+
+void ORBit_handle_exception(GIOPRecvBuffer *rb, CORBA_Environment *ev,
+ const ORBit_exception_demarshal_info *user_exceptions,
+ CORBA_ORB orb)
+{
+ CORBA_SystemException *new;
+ CORBA_unsigned_long len, completion_status;
+ CORBA_char *my_repoid;
+
+ g_return_if_fail(GIOP_MESSAGE_BUFFER(rb)->message_header.message_type == GIOP_REPLY);
+
+ CORBA_exception_free(ev);
+
+ rb->cur = ALIGN_ADDRESS(rb->cur, sizeof(len));
+ rb->decoder(&len, rb->cur, sizeof(len));
+ /* (guchar *)rb->cur += sizeof(len); */
+ rb->cur = ((guchar *)rb->cur) + sizeof(len);
+
+ if(len) {
+ my_repoid = rb->cur;
+ rb->cur = ((guchar *)rb->cur) + len;
+ } else
+ my_repoid = NULL;
+
+ if(rb->message.u.reply.reply_status == CORBA_SYSTEM_EXCEPTION) {
+ CORBA_unsigned_long minor;
+
+ ev->_major = CORBA_SYSTEM_EXCEPTION;
+
+ rb->cur = ALIGN_ADDRESS(rb->cur, sizeof(minor));
+ rb->decoder(&minor, rb->cur, sizeof(minor));
+ rb->cur = ((guchar *)rb->cur) + sizeof(minor);
+
+ rb->cur = ALIGN_ADDRESS(rb->cur, sizeof(completion_status));
+ rb->decoder(&completion_status, rb->cur, sizeof(completion_status));
+ rb->cur = ((guchar *)rb->cur) + sizeof(completion_status);
+
+ new=ORBit_alloc(sizeof(CORBA_SystemException), NULL, NULL);
+
+ if(new!=NULL) {
+ new->minor=minor;
+ new->completed=completion_status;
+
+ /* XXX what should the repo ID be? */
+ CORBA_exception_set(ev, CORBA_SYSTEM_EXCEPTION,
+ my_repoid,
+ new);
+ }
+ } else if(rb->message.u.reply.reply_status == CORBA_USER_EXCEPTION) {
+ int i;
+
+ if(!user_exceptions) {
+ /* weirdness; they raised an exception that we don't
+ know about */
+ CORBA_exception_set_system(ev, ex_CORBA_MARSHAL,
+ CORBA_COMPLETED_MAYBE);
+ } else {
+ for(i = 0; user_exceptions[i].tc != CORBA_OBJECT_NIL;
+ i++) {
+ if(!strcmp(user_exceptions[i].tc->repo_id,
+ my_repoid))
+ break;
+ }
+
+ if(user_exceptions[i].tc == CORBA_OBJECT_NIL) {
+ /* weirdness; they raised an exception
+ that we don't know about */
+ CORBA_exception_set_system(ev, ex_CORBA_MARSHAL,
+ CORBA_COMPLETED_MAYBE);
+ } else {
+ user_exceptions[i].demarshal(rb, ev);
+ }
+ }
+ };
+
+ /* ignore LOCATION_FORWARD here, that gets handled in the stub */
+}
+
+void
+ORBit_send_system_exception(GIOPSendBuffer *send_buffer,
+ CORBA_Environment *ev)
+{
+ CORBA_unsigned_long minor;
+ CORBA_unsigned_long completion_status;
+ CORBA_SystemException *se = ev->_params;
+
+ minor = se->minor;
+ completion_status = se->completed;
+
+ ENCODER_CALL(CORBA_char, ev->_repo_id);
+ giop_send_buffer_append_mem_indirect_a(send_buffer, &minor,
+ sizeof(minor));
+ giop_send_buffer_append_mem_indirect_a(send_buffer,
+ &completion_status,
+ sizeof(completion_status));
+}
+
+void
+ORBit_send_user_exception(GIOPSendBuffer *send_buffer,
+ CORBA_Environment *ev,
+ const ORBit_exception_marshal_info *user_exceptions)
+{
+ int i;
+
+ for(i = 0; user_exceptions[i].tc != CORBA_OBJECT_NIL; i++) {
+ if(!strcmp(user_exceptions[i].tc->repo_id, ev->_repo_id))
+ break;
+ }
+
+ if(user_exceptions[i].tc == CORBA_OBJECT_NIL) {
+ CORBA_Environment fakeev;
+ CORBA_exception_init(&fakeev);
+ CORBA_exception_set_system(&fakeev, ex_CORBA_UNKNOWN,
+ CORBA_COMPLETED_MAYBE);
+ ORBit_send_system_exception(send_buffer, &fakeev);
+ CORBA_exception_free(&fakeev);
+ } else {
+ ENCODER_CALL(CORBA_char, ev->_repo_id);
+
+ if(user_exceptions[i].marshal && ev->_params)
+ user_exceptions[i].marshal(send_buffer, ev);
+ }
+}
+
+void
+ORBit_handle_system_exception(CORBA_Environment *ev,
+ CORBA_unsigned_long system_exception_minor,
+ CORBA_unsigned_long completion_status,
+ GIOPRecvBuffer *recv_buffer,
+ GIOPSendBuffer *send_buffer)
+{
+ CORBA_exception_set_system(ev, system_exception_minor, completion_status);
+
+ if(send_buffer)
+ giop_send_buffer_unuse(send_buffer);
+
+ if(recv_buffer)
+ giop_recv_buffer_unuse(recv_buffer);
+}
diff -urN linux-2.4.1/net/korbit/orb/env.h linux-2.4.1-korbit/net/korbit/orb/env.h
--- linux-2.4.1/net/korbit/orb/env.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/env.h Thu Feb 1 16:21:56 2001
@@ -0,0 +1,79 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998, 1999 Richard H. Porter, Red Hat Software
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#ifndef _ORBIT_ENV_H_
+#define _ORBIT_ENV_H_
+
+#include "orbit_types.h"
+
+extern void CORBA_exception_set(CORBA_Environment *ev,
+ CORBA_exception_type major,
+ const CORBA_char *except_repos_id,
+ void *param);
+
+extern void CORBA_exception_set_system(CORBA_Environment *ev,
+ CORBA_unsigned_long ex_value,
+ CORBA_completion_status completed);
+
+extern void CORBA_exception_init(CORBA_Environment *ev);
+
+extern CORBA_char *CORBA_exception_id(CORBA_Environment *e);
+
+extern void *CORBA_exception_value(CORBA_Environment *ev);
+
+extern void CORBA_exception_free(CORBA_Environment *ev);
+
+#ifndef __KORBIT__
+extern CORBA_any *CORBA_exception_as_any(CORBA_Environment *ev);
+#endif /* !__KORBIT__ */
+
+typedef struct {
+ const CORBA_TypeCode tc;
+ void (*demarshal)(GIOPRecvBuffer *_ORBIT_recv_buffer, CORBA_Environment *ev);
+} ORBit_exception_demarshal_info;
+
+typedef struct {
+ const CORBA_TypeCode tc;
+ void (*marshal)(GIOPSendBuffer *_ORBIT_send_buffer, CORBA_Environment *ev);
+} ORBit_exception_marshal_info;
+
+/* ORBit-specific */
+void ORBit_handle_exception(GIOPRecvBuffer *rb, CORBA_Environment *ev,
+ const ORBit_exception_demarshal_info *user_exceptions,
+ CORBA_ORB orb);
+void ORBit_send_system_exception(GIOPSendBuffer *send_buffer,
+ CORBA_Environment *ev);
+void ORBit_send_user_exception(GIOPSendBuffer *send_buffer,
+ CORBA_Environment *ev,
+ const ORBit_exception_marshal_info *user_exceptions);
+
+/* Used by stubs */
+void ORBit_handle_system_exception(CORBA_Environment *ev,
+ CORBA_unsigned_long system_exception_minor,
+ CORBA_unsigned_long completion_status,
+ GIOPRecvBuffer *recv_buffer,
+ GIOPSendBuffer *send_buffer);
+
+#endif /* !_ORBIT_ENV_H_ */
diff -urN linux-2.4.1/net/korbit/orb/genrand.c linux-2.4.1-korbit/net/korbit/orb/genrand.c
--- linux-2.4.1/net/korbit/orb/genrand.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/genrand.c Thu Feb 1 11:47:12 2001
@@ -0,0 +1,131 @@
+#include "genrand.h"
+#include "ORBitutil/util.h"
+#include <unistd.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <glib.h>
+#include <signal.h>
+#include <sys/time.h>
+#include <limits.h>
+#include <stdio.h>
+#ifdef __KERNEL__
+#include <linux/random.h>
+#endif
+
+static gboolean
+genrand_dev(guchar *buffer, int buf_len)
+{
+#ifdef __KERNEL__
+ get_random_bytes(buffer, buf_len);
+#else /*! __KERNEL__*/
+ int fd;
+
+ fd = open("/dev/urandom", O_RDONLY);
+ if(fd < 0)
+ return FALSE;
+
+ if(read(fd, buffer, buf_len) < buf_len)
+ {
+ close(fd);
+ return FALSE;
+ }
+
+ close(fd);
+#endif /*! __KERNEL__*/
+
+ return TRUE;
+}
+
+#ifndef __KORBIT__
+static volatile int received_alarm = 0;
+
+static void
+handle_alarm(int signum)
+{
+ received_alarm = 1;
+}
+
+static inline guchar
+hashlong(long val)
+{
+ guchar retval, *ptr;
+ int i;
+
+ for(ptr = (guchar *)&val, i = 0; i < sizeof(val); i++)
+ retval ^= ptr[i];
+
+ return retval;
+}
+
+static gboolean
+genrand_unix(guchar *buffer, int buf_len)
+{
+ struct sigaction sa, oldsa;
+ struct itimerval it, oldit;
+ int i;
+ long min, max;
+ long *counts;
+ double diff;
+ long *uninit;
+
+ counts = alloca(buf_len * sizeof(long));
+
+ memset(&sa, 0, sizeof(sa));
+ sa.sa_handler = handle_alarm;
+ sigaction(SIGALRM, &sa, &oldsa);
+ memset(&it, 0, sizeof(it));
+ it.it_value.tv_usec = 1;
+ getitimer(ITIMER_REAL, &oldit);
+
+ for(i = 0, min = LONG_MAX, max = 0; i < buf_len; i++)
+ {
+ received_alarm = 0;
+ setitimer(ITIMER_REAL, &it, NULL);
+ for(counts[i] = 0; !received_alarm; counts[i]++);
+
+ max = MAX(counts[i], max);
+ min = MIN(counts[i], min);
+ }
+
+ if(!(max - min))
+ {
+ freeca(counts);
+ return FALSE;
+ }
+
+ diff = max - min;
+
+ uninit = alloca(buf_len * sizeof(long)); /* Purposely not initialized */
+ for(i = 0; i < buf_len; i++)
+ {
+ long diffval;
+ diffval = counts[i] - min;
+
+ buffer[i] ^= (guchar)( ((double) (diffval*256) / diff )) ^ hashlong(uninit[i]);
+ }
+
+ setitimer(ITIMER_REAL, &oldit, NULL);
+ sigaction(SIGALRM, &oldsa, NULL);
+
+ freeca(counts);
+ freeca(uninit);
+
+ return TRUE;
+}
+#endif /* !__KORBIT__ */
+
+void
+orbit_genrand(guchar *buffer, int buf_len)
+{
+ g_return_if_fail(buf_len);
+
+ if(genrand_dev(buffer, buf_len))
+ return;
+#ifndef __KORBIT__
+ else if(genrand_unix(buffer, buf_len))
+ return;
+#endif
+ else
+ g_error("Couldn't generate random data!");
+}
+
diff -urN linux-2.4.1/net/korbit/orb/genrand.h linux-2.4.1-korbit/net/korbit/orb/genrand.h
--- linux-2.4.1/net/korbit/orb/genrand.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/genrand.h Thu Feb 1 11:47:12 2001
@@ -0,0 +1,8 @@
+#ifndef ORBIT_GENRAND_H
+#define ORBIT_GENRAND_H 1
+
+#include <glib.h>
+
+void orbit_genrand(guchar *buffer, int buf_len);
+
+#endif /* ORBIT_GENRAND_H */
diff -urN linux-2.4.1/net/korbit/orb/iop.h linux-2.4.1-korbit/net/korbit/orb/iop.h
--- linux-2.4.1/net/korbit/orb/iop.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/iop.h Thu Feb 1 11:47:12 2001
@@ -0,0 +1,207 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#ifndef _ORBIT_IOP_H_
+#define _ORBIT_IOP_H_
+
+#include <ORBitutil/basic_types.h>
+
+#include <orb/corba_basic_sequences_type.h>
+
+#ifndef HAVE_CORBA_PRINCIPAL
+#define HAVE_CORBA_PRINCIPAL 1
+typedef CORBA_sequence_octet CORBA_Principal;
+#endif
+
+typedef CORBA_unsigned_long IOP_ProfileId;
+
+#define IOP_TAG_INTERNET_IOP 0
+#define IOP_TAG_MULTIPLE_COMPONENTS 1
+#define IOP_TAG_ORBIT_SPECIFIC 0xbadfaecal
+
+typedef struct IOP_TaggedProfile {
+ IOP_ProfileId tag;
+ CORBA_sequence_octet profile_data;
+} IOP_TaggedProfile;
+
+typedef struct CORBA_sequence_TaggedProfile {
+ CORBA_unsigned_long _maximum;
+ CORBA_unsigned_long _length;
+ IOP_TaggedProfile *_buffer;
+} CORBA_sequence_TaggedProfile;
+
+typedef struct IOP_IOR {
+ CORBA_char *type_id;
+ CORBA_sequence_TaggedProfile profiles;
+} IOP_IOR;
+
+typedef CORBA_unsigned_long IOP_ComponentId;
+
+typedef struct IOP_TaggedComponent {
+ IOP_ComponentId tag;
+ CORBA_sequence_octet component_data;
+} IOP_TaggedComponent;
+
+typedef struct CORBA_sequence_TaggedComponent {
+ CORBA_unsigned_long _maximum;
+ CORBA_unsigned_long _length;
+ IOP_TaggedComponent *_buffer;
+} CORBA_sequence_TaggedComponent;
+
+typedef struct CORBA_sequence_TaggedComponent IOP_MultipleComponentProfile;
+
+#define IOP_TAG_ORB_TYPE 0
+#define IOP_TAG_CODE_SETS 1
+#define IOP_TAG_SEC_NAME 14
+#define IOP_TAG_ASSOCIATION_OPTIONS 13
+#define IOP_TAG_GENERIC_SEC_MECH 12
+
+typedef CORBA_unsigned_long IOP_ServiceId;
+
+typedef struct IOP_ServiceContext {
+ IOP_ServiceId context_id;
+ CORBA_sequence_octet context_data;
+} IOP_ServiceContext;
+
+typedef struct CORBA_sequence_ServiceContext {
+ CORBA_unsigned_long _maximum;
+ CORBA_unsigned_long _length;
+ IOP_ServiceContext *_buffer;
+} CORBA_sequence_ServiceContext;
+
+typedef struct CORBA_sequence_ServiceContext IOP_ServiceContextList;
+
+#define IOP_TransactionService 0
+#define IOP_CodeSets 1
+
+typedef CORBA_unsigned_long CONV_FRAME_CodeSetId;
+
+typedef struct CORBA_sequence_CodeSetId {
+ CORBA_unsigned_long _maximum;
+ CORBA_unsigned_long _length;
+ CONV_FRAME_CodeSetId *_buffer;
+} CORBA_sequence_CodeSetId;
+
+typedef struct CONV_FRAME_CodeSetComponent {
+ CONV_FRAME_CodeSetId native_code_set;
+ CORBA_sequence_CodeSetId conversion_code_sets;
+} CONV_FRAME_CodeSetComponent;
+
+typedef struct CONV_FRAME_CodeSetComponentInfo {
+ CONV_FRAME_CodeSetComponent ForCharData;
+ CONV_FRAME_CodeSetComponent ForWcharData;
+} CONV_FRAME_CodeSetComponentInfo;
+
+typedef struct CONV_FRAME_CodeSetContext {
+ CONV_FRAME_CodeSetId char_data;
+ CONV_FRAME_CodeSetId wchar_data;
+} CONV_FRAME_CodeSetContext;
+
+typedef struct GIOP_Version {
+ CORBA_octet major;
+ CORBA_octet minor;
+} GIOP_Version;
+
+typedef enum {
+ GIOP_Request=0,
+ GIOP_Reply,
+ GIOP_CancelRequest,
+ GIOP_LocateRequest,
+ GIOP_LocateReply,
+ GIOP_CloseConnection,
+ GIOP_MessageError
+} GIOP_MsgType_1_0;
+
+typedef struct GIOP_MessageHeader_1_0 {
+ CORBA_char magic[4];
+ GIOP_Version GIOP_version;
+ CORBA_boolean byte_order;
+ CORBA_octet message_type;
+ CORBA_unsigned_long message_size;
+} GIOP_MessageHeader_1_0;
+
+typedef struct GIOP_MessageHeader_1_1 {
+ CORBA_char magic[4];
+ GIOP_Version GIOP_version;
+ CORBA_octet flags;
+ CORBA_octet message_type;
+ CORBA_unsigned_long message_size;
+} GIOP_MessageHeader_1_1;
+
+typedef struct GIOP_RequestHeader_1_0 {
+ IOP_ServiceContextList service_context;
+ CORBA_unsigned_long request_id;
+ CORBA_boolean response_expected;
+ CORBA_sequence_octet object_key;
+ CORBA_char *operation;
+ CORBA_Principal requesting_principal;
+} GIOP_RequestHeader_1_0;
+
+typedef struct GIOP_RequestHeader_1_1 {
+ IOP_ServiceContextList service_context;
+ CORBA_unsigned_long request_id;
+ CORBA_boolean response_expected;
+ CORBA_octet reserved[3];
+ CORBA_sequence_octet object_key;
+ CORBA_char *operation;
+ CORBA_Principal requesting_principal;
+} GIOP_RequestHeader_1_1;
+
+typedef struct GIOP_SystemExceptionReplyBody {
+ CORBA_char *exception_id;
+ CORBA_unsigned_long minor_code_value;
+ CORBA_unsigned_long completion_status;
+} GIOP_SystemExceptionReplyBody;
+
+typedef struct GIOP_CancelRequestHeader {
+ CORBA_unsigned_long request_id;
+} GIOP_CancelRequestHeader;
+
+typedef struct GIOP_LocateRequestHeader {
+ CORBA_unsigned_long request_id;
+ CORBA_sequence_octet object_key;
+} GIOP_LocateRequestHeader;
+
+typedef struct IIOP_Version {
+ CORBA_octet major;
+ CORBA_octet minor;
+} IIOP_Version;
+
+typedef struct IIOP_ProfileBody_1_0 {
+ IIOP_Version iiop_version;
+ CORBA_char *host;
+ CORBA_unsigned_short port;
+ CORBA_sequence_octet object_key;
+} IIOP_ProfileBody_1_0;
+
+typedef struct IIOP_ProfileBody_1_1 {
+ IIOP_Version iiop_version;
+ CORBA_char *host;
+ CORBA_unsigned_short port;
+ CORBA_sequence_octet object_key;
+ CORBA_sequence_TaggedComponent components;
+} IIOP_ProfileBody_1_1;
+
+#endif /* !_ORBIT_IOP_H_ */
diff -urN linux-2.4.1/net/korbit/orb/ir.c linux-2.4.1-korbit/net/korbit/orb/ir.c
--- linux-2.4.1/net/korbit/orb/ir.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/ir.c Thu Feb 1 11:47:12 2001
@@ -0,0 +1,293 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#include <stdlib.h>
+#include <assert.h>
+
+#include "orbit.h"
+
+/* FIXME: Right now this function doesn't record whether or not it has
+ already visited a given TypeCode. I'm not sure if every recursive
+ type will have a tk_recursive node in it; if not, then this will
+ need to be reworked a bit. */
+CORBA_boolean CORBA_TypeCode_equal(CORBA_TypeCode obj, CORBA_TypeCode tc, CORBA_Environment *ev)
+{
+ int i;
+
+ g_return_val_if_fail(obj!=NULL, CORBA_FALSE);
+ g_return_val_if_fail(tc!=NULL, CORBA_FALSE);
+
+ if (obj->kind != tc->kind) {
+ return CORBA_FALSE;
+ }
+
+ switch (obj->kind) {
+ case CORBA_tk_wstring:
+ case CORBA_tk_string:
+ return obj->length == tc->length;
+ case CORBA_tk_objref:
+ return ! strcmp (obj->repo_id, tc->repo_id);
+ case CORBA_tk_except:
+ case CORBA_tk_struct:
+ if (strcmp (obj->repo_id, tc->repo_id)
+ || obj->sub_parts != tc->sub_parts)
+ return CORBA_FALSE;
+ for (i = 0; i < obj->sub_parts; ++i)
+ if (! CORBA_TypeCode_equal (obj->subtypes[i],
+ tc->subtypes[i], ev))
+ return CORBA_FALSE;
+ break;
+ case CORBA_tk_union:
+ if (strcmp (obj->repo_id, tc->repo_id)
+ || obj->sub_parts != tc->sub_parts
+ || ! CORBA_TypeCode_equal (obj->discriminator,
+ tc->discriminator, ev)
+ || obj->default_index != tc->default_index)
+ return CORBA_FALSE;
+ for (i = 0; i < obj->sub_parts; ++i)
+
+ if (! CORBA_TypeCode_equal (obj->subtypes[i],
+ tc->subtypes[i], ev)
+ || ! ORBit_any_equivalent (obj->sublabels[i],
+ tc->sublabels[i], ev))
+ return CORBA_FALSE;
+
+ break;
+ case CORBA_tk_enum:
+ if (obj->sub_parts != tc->sub_parts
+ || strcmp (obj->repo_id, tc->repo_id))
+ return CORBA_FALSE;
+ for (i = 0; i < obj->sub_parts; ++i)
+ if (strcmp (obj->subnames[i], tc->subnames[i]))
+ return CORBA_FALSE;
+ break;
+ case CORBA_tk_sequence:
+ case CORBA_tk_array:
+ if (obj->length != tc->length)
+ return CORBA_FALSE;
+ g_assert (obj->sub_parts == 1);
+ g_assert (tc->sub_parts == 1);
+ return CORBA_TypeCode_equal (obj->subtypes[0], tc->subtypes[0],
+ ev);
+ case CORBA_tk_alias:
+ if (strcmp (obj->repo_id, tc->repo_id))
+ return CORBA_FALSE;
+
+ g_assert (obj->sub_parts == 1);
+ g_assert (tc->sub_parts == 1);
+
+ return CORBA_TypeCode_equal (obj->subtypes[0], tc->subtypes[0],
+ ev);
+ break;
+ case CORBA_tk_recursive:
+ return obj->recurse_depth == tc->recurse_depth;
+ case CORBA_tk_fixed:
+ return obj->digits == tc->digits && obj->scale == tc->scale;
+
+ default:
+ /* Everything else is primitive. */
+ break;
+ }
+
+ return CORBA_TRUE;
+}
+
+CORBA_TCKind CORBA_TypeCode_kind(CORBA_TypeCode obj, CORBA_Environment *ev)
+{
+ return obj->kind;
+}
+
+static void bad_kind (CORBA_Environment *ev)
+{
+ CORBA_TypeCode_BadKind *err;
+ err = g_new (CORBA_TypeCode_BadKind, 1);
+ if (err == NULL) {
+ CORBA_exception_set_system (ev, ex_CORBA_NO_MEMORY,
+ CORBA_COMPLETED_NO);
+ } else {
+ err->dummy = 23;
+ CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
+ "IDL:omg.org/CORBA/TypeCode/BadKind/1.0",
+ err);
+ }
+}
+
+CORBA_RepositoryId CORBA_TypeCode_id(CORBA_TypeCode obj, CORBA_Environment *ev)
+{
+ if (! (obj->kind == CORBA_tk_objref || obj->kind == CORBA_tk_struct
+ || obj->kind == CORBA_tk_enum || obj->kind == CORBA_tk_alias
+ || obj->kind == CORBA_tk_except)) {
+ bad_kind (ev);
+ return NULL;
+ }
+ return obj->repo_id;
+}
+
+CORBA_Identifier CORBA_TypeCode_name(CORBA_TypeCode obj, CORBA_Environment *ev)
+{
+ if (! (obj->kind == CORBA_tk_objref || obj->kind == CORBA_tk_struct
+ || obj->kind == CORBA_tk_enum || obj->kind == CORBA_tk_alias
+ || obj->kind == CORBA_tk_except)) {
+ bad_kind (ev);
+ return NULL;
+ }
+
+ return obj->name;
+}
+
+CORBA_unsigned_long CORBA_TypeCode_member_count(CORBA_TypeCode obj, CORBA_Environment *ev)
+{
+ if (! (obj->kind == CORBA_tk_struct || obj->kind == CORBA_tk_union
+ || obj->kind == CORBA_tk_enum)) {
+ bad_kind (ev);
+ return 0;
+ }
+ return obj->sub_parts;
+}
+
+static void bounds_error (CORBA_Environment *ev)
+{
+ CORBA_TypeCode_Bounds *err;
+ err = g_new (CORBA_TypeCode_Bounds, 1);
+ if (err == NULL) {
+ CORBA_exception_set_system (ev, ex_CORBA_NO_MEMORY,
+ CORBA_COMPLETED_NO);
+ } else {
+ err->dummy = 23;
+ CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
+ "IDL:omg.org/CORBA/TypeCode/Bounds/1.0",
+ err);
+ }
+}
+
+CORBA_Identifier CORBA_TypeCode_member_name(CORBA_TypeCode obj, CORBA_unsigned_long index, CORBA_Environment *ev)
+{
+ if (! (obj->kind == CORBA_tk_struct || obj->kind == CORBA_tk_union
+ || obj->kind == CORBA_tk_enum)) {
+ bad_kind (ev);
+ return NULL;
+ }
+ if (index > obj->sub_parts) {
+ bounds_error (ev);
+ return NULL;
+ }
+ return obj->subnames[index];
+}
+
+CORBA_TypeCode CORBA_TypeCode_member_type(CORBA_TypeCode obj, CORBA_unsigned_long index, CORBA_Environment *ev)
+{
+ if (! (obj->kind == CORBA_tk_struct || obj->kind == CORBA_tk_union
+ || obj->kind == CORBA_tk_enum)) {
+ bad_kind (ev);
+ return NULL;
+ }
+ if (index > obj->sub_parts) {
+ bounds_error (ev);
+ return NULL;
+ }
+ return obj->subtypes[index];
+}
+
+CORBA_any *CORBA_TypeCode_member_label(CORBA_TypeCode obj, CORBA_unsigned_long index, CORBA_Environment *ev)
+{
+ if (obj->kind != CORBA_tk_union) {
+ bad_kind (ev);
+ return NULL;
+ }
+ if (index > obj->sub_parts) {
+ bounds_error (ev);
+ return NULL;
+ }
+ return &obj->sublabels[index];
+}
+
+CORBA_TypeCode CORBA_TypeCode_discriminator_type(CORBA_TypeCode obj, CORBA_Environment *ev)
+{
+ if (obj->kind != CORBA_tk_union) {
+ bad_kind (ev);
+ return NULL;
+ }
+ return obj->discriminator;
+}
+
+CORBA_long CORBA_TypeCode_default_index(CORBA_TypeCode obj, CORBA_Environment *ev)
+{
+ if (obj->kind != CORBA_tk_union) {
+ bad_kind (ev);
+ return 0;
+ }
+ return obj->default_index;
+}
+
+CORBA_unsigned_long CORBA_TypeCode_length(CORBA_TypeCode obj, CORBA_Environment *ev)
+{
+ if (! (obj->kind == CORBA_tk_string || obj->kind == CORBA_tk_wstring
+ || obj->kind == CORBA_tk_array)) {
+ bad_kind (ev);
+ return 0;
+ }
+ return obj->length;
+}
+
+CORBA_TypeCode CORBA_TypeCode_content_type(CORBA_TypeCode obj, CORBA_Environment *ev)
+{
+ if (! (obj->kind == CORBA_tk_sequence || obj->kind == CORBA_tk_array
+ || obj->kind == CORBA_tk_alias)) {
+ bad_kind (ev);
+ return NULL;
+ }
+ g_assert (obj->sub_parts == 1);
+ return obj->subtypes[0];
+}
+
+CORBA_unsigned_short CORBA_TypeCode_fixed_digits(CORBA_TypeCode obj, CORBA_Environment *ev)
+{
+ if (obj->kind != CORBA_tk_fixed) {
+ bad_kind (ev);
+ return 0;
+ }
+ return obj->digits;
+}
+
+CORBA_short CORBA_TypeCode_fixed_scale(CORBA_TypeCode obj, CORBA_Environment *ev)
+{
+ if (obj->kind != CORBA_tk_fixed) {
+ bad_kind (ev);
+ return 0;
+ }
+ return obj->scale;
+}
+
+CORBA_long CORBA_TypeCode_param_count(CORBA_TypeCode obj, CORBA_Environment *ev)
+{
+ g_assert(!"Deprecated");
+ return(0);
+}
+
+CORBA_any *CORBA_TypeCode_parameter(CORBA_TypeCode obj, CORBA_long index, CORBA_Environment *ev)
+{
+ g_assert(!"Deprecated");
+ return(NULL);
+}
diff -urN linux-2.4.1/net/korbit/orb/ir.h linux-2.4.1-korbit/net/korbit/orb/ir.h
--- linux-2.4.1/net/korbit/orb/ir.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/ir.h Thu Feb 1 11:47:12 2001
@@ -0,0 +1,100 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#ifndef _ORBIT_IR_H_
+#define _ORBIT_IR_H_
+
+#include "orbit_types.h"
+
+extern CORBA_boolean CORBA_TypeCode_equal(
+ CORBA_TypeCode obj,
+ CORBA_TypeCode tc,
+ CORBA_Environment *ev);
+
+extern CORBA_TCKind CORBA_TypeCode_kind(
+ CORBA_TypeCode obj,
+ CORBA_Environment *ev);
+
+extern CORBA_RepositoryId CORBA_TypeCode_id(
+ CORBA_TypeCode obj,
+ CORBA_Environment *ev);
+
+extern CORBA_Identifier CORBA_TypeCode_name(
+ CORBA_TypeCode obj,
+ CORBA_Environment *ev);
+
+extern CORBA_unsigned_long CORBA_TypeCode_member_count(
+ CORBA_TypeCode obj,
+ CORBA_Environment *ev);
+
+extern CORBA_Identifier CORBA_TypeCode_member_name(
+ CORBA_TypeCode obj,
+ CORBA_unsigned_long index,
+ CORBA_Environment *ev);
+
+extern CORBA_TypeCode CORBA_TypeCode_member_type(
+ CORBA_TypeCode obj,
+ CORBA_unsigned_long index,
+ CORBA_Environment *ev);
+
+extern CORBA_any *CORBA_TypeCode_member_label(
+ CORBA_TypeCode obj,
+ CORBA_unsigned_long index,
+ CORBA_Environment *ev);
+
+extern CORBA_TypeCode CORBA_TypeCode_discriminator_type(
+ CORBA_TypeCode obj,
+ CORBA_Environment *ev);
+
+extern CORBA_long CORBA_TypeCode_default_index(
+ CORBA_TypeCode obj,
+ CORBA_Environment *ev);
+
+extern CORBA_unsigned_long CORBA_TypeCode_length(
+ CORBA_TypeCode obj,
+ CORBA_Environment *ev);
+
+extern CORBA_TypeCode CORBA_TypeCode_content_type(
+ CORBA_TypeCode obj,
+ CORBA_Environment *ev);
+
+extern CORBA_unsigned_short CORBA_TypeCode_fixed_digits(
+ CORBA_TypeCode obj,
+ CORBA_Environment *ev);
+
+extern CORBA_short CORBA_TypeCode_fixed_scale(
+ CORBA_TypeCode obj,
+ CORBA_Environment *ev);
+
+extern CORBA_long CORBA_TypeCode_param_count(
+ CORBA_TypeCode obj,
+ CORBA_Environment *ev);
+
+extern CORBA_any *CORBA_TypeCode_parameter(
+ CORBA_TypeCode obj,
+ CORBA_long index,
+ CORBA_Environment *ev);
+
+#endif /* !_ORBIT_IR_H_ */
diff -urN linux-2.4.1/net/korbit/orb/options.c linux-2.4.1-korbit/net/korbit/orb/options.c
--- linux-2.4.1/net/korbit/orb/options.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/options.c Thu Feb 1 11:47:12 2001
@@ -0,0 +1,160 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+/*
+ * Option parsing
+ *
+ * All ORB options are stripped from the application's argv, and argc is
+ * adjusted accordingly
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <glib.h>
+
+#include "options.h"
+
+#ifndef __KORBIT__
+void ORBit_option_set(ORBit_orb_options *option, const char *val)
+{
+ g_assert(option!=NULL);
+
+ if(option->type==no_arg && option->arg!=NULL) {
+ /* Treat as an int arg with val=1
+ */
+ int *int_arg=(int *)option->arg;
+
+ *int_arg=1;
+ } else {
+ if(option->type==string_arg && option->arg!=NULL) {
+ char **str_arg=(char **)option->arg;
+
+ /* free any existing value */
+ if(*str_arg!=NULL) {
+ g_free(*str_arg);
+ }
+ *str_arg=g_strdup(val);
+ } else if(option->type==int_arg && option->arg!=NULL) {
+ int *int_arg=(int *)option->arg;
+
+ *int_arg=atoi(val);
+ }
+
+ }
+}
+
+void ORBit_option_parse(int *argc, char **argv, ORBit_orb_options *options)
+{
+ int i,j,numargs;
+ char name[1024], *val;
+ ORBit_orb_options *search=NULL;
+ int *erase;
+
+ numargs=*argc;
+
+ erase=g_new0(int, *argc);
+
+ for(i=1; i< *argc; i++) {
+ if(argv[i][0]!='-') {
+ if(search==NULL) {
+ /* Skip non-option */
+ continue;
+ } else {
+ /* an required option value has been found */
+ erase[i]=1;
+ numargs-=1;
+
+ if(search->arg==NULL) {
+ /* dont store any values, just strip
+ * the argv
+ */
+ search=NULL;
+ continue;
+ }
+
+ ORBit_option_set(search, argv[i]);
+
+ search=NULL;
+ continue;
+ }
+ } else {
+ if(search!=NULL &&
+ (search->type==string_arg || search->type==int_arg)) {
+ fprintf(stderr, "Option %s requires an argument\n", search->name);
+ }
+ }
+
+ val=argv[i];
+ while(*val && *val=='-')
+ val++;
+
+ strncpy(name,val,1023);
+ name[1023]='\0';
+
+ val=strchr(name, '=');
+ if(val!=NULL) {
+ *val++='\0';
+ }
+
+ for(search=options;search->name!=NULL;search++) {
+ if(!strcmp(name, search->name)) {
+ break;
+ }
+ }
+
+ if(search->name==NULL) {
+ /* Didn't find it in our list of interesting options */
+ search=NULL;
+ } else {
+ /* Found it */
+ erase[i]=1;
+ numargs-=1;
+
+ if(search->type==no_arg || val!=NULL) {
+ ORBit_option_set(search, val);
+ search=NULL;
+ }
+ }
+ }
+
+ j=1;
+ for(i=1; i< *argc; i++) {
+ if(erase[i]==1) {
+ continue;
+ } else {
+ if(j<numargs) {
+ argv[j++]=argv[i];
+ } else {
+ argv[j++]='\0';
+ }
+ }
+ }
+
+ *argc=numargs;
+
+ g_free(erase);
+}
+#endif /* !__KORBIT__ */
diff -urN linux-2.4.1/net/korbit/orb/options.h linux-2.4.1-korbit/net/korbit/orb/options.h
--- linux-2.4.1/net/korbit/orb/options.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/options.h Thu Feb 1 11:47:13 2001
@@ -0,0 +1,46 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#ifndef _ORBIT_OPTIONS_H_
+#define _ORBIT_OPTIONS_H_
+
+typedef enum {
+ no_arg=0,
+ string_arg,
+ int_arg
+} ORBit_opt_type;
+
+typedef struct {
+ char *name;
+ ORBit_opt_type type;
+ void *arg;
+} ORBit_orb_options;
+
+#ifndef __KORBIT__
+extern void ORBit_option_set(ORBit_orb_options *found, const char *val);
+extern void ORBit_option_parse(int *argc, char **argv, ORBit_orb_options *options);
+#endif
+
+#endif /* !_ORBIT_OPTIONS_H_ */
diff -urN linux-2.4.1/net/korbit/orb/orb.c linux-2.4.1-korbit/net/korbit/orb/orb.c
--- linux-2.4.1/net/korbit/orb/orb.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/orb.c Thu Feb 1 11:47:13 2001
@@ -0,0 +1,1700 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter and Red Hat Software
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@acm.org>
+ * Elliot Lee <sopwith@redhat.com>
+ *
+ */
+
+#define o_return_val_if_fail(expr, val) if(!(expr)) { CORBA_exception_set_system(ev, ex_CORBA_BAD_PARAM, CORBA_COMPLETED_NO); return (val); }
+#define o_return_if_fail(expr) if(!(expr)) { CORBA_exception_set_system(ev, ex_CORBA_BAD_PARAM, CORBA_COMPLETED_NO); return; }
+
+#include "config.h"
+
+#include <unistd.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+#include <pwd.h>
+#include <time.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <utime.h>
+
+#include "../IIOP/iiop-endianP.h"
+#include "orbit.h"
+
+#include "orbit_poa.h"
+#include "orbit_object.h"
+#include "orbit_object_type.h"
+
+#ifndef __KERNEL__
+#define freeca(ptr)
+#endif
+
+#ifndef SUN_LEN
+/* This system is not POSIX.1g. */
+#define SUN_LEN(ptr) ((size_t) (((struct sockaddr_un *) 0)->sun_path) \
+ + strlen ((ptr)->sun_path))
+#endif
+
+static void ORBit_ORB_release(CORBA_ORB orb, CORBA_Environment *ev);
+
+static const ORBit_RootObject_Interface CORBA_ORB_epv =
+{
+ (void (*)(gpointer, CORBA_Environment *))ORBit_ORB_release
+};
+
+
+static int ORBit_ORBid_setup(CORBA_ORB orb, CORBA_ORBid id)
+{
+ g_assert(orb!=NULL);
+ g_assert(id!=NULL);
+
+ if(strcmp(id, "orbit-local-orb")) {
+#ifdef __KORBIT__
+ printf("ORBit_ORBid_setup: Unknown ORB id: %s\n", id);
+#else
+ fprintf(stderr, "ORBit_ORBid_setup: Unknown ORB id: %s\n", id);
+#endif
+ return(0);
+ }
+
+ orb->orb_identifier=g_strdup(id);
+
+ return(1);
+}
+
+#ifndef __KORBIT__
+static gboolean
+free_key_and_data(gpointer key, gpointer data, gpointer user_data)
+{
+ g_free(key); g_free(data);
+
+ return TRUE;
+}
+
+static void ORBit_rc_load(const char *rcfile, ORBit_orb_options *options)
+{
+ FILE *fp;
+ GHashTable *read_options;
+ ORBit_orb_options *search;
+
+ fp=fopen(rcfile, "r");
+
+ if(fp==NULL)
+ return;
+
+ read_options=g_hash_table_new(g_str_hash, g_str_equal);
+
+ while(!feof(fp)) {
+ char buf[1024];
+
+ if(fgets(buf, 1024, fp)!=NULL) {
+ guchar *bptr, *tmp, *key, *data;
+ size_t start, len;
+
+ if(buf[0]=='#')
+ continue;
+
+ bptr=buf;
+ tmp=strpbrk(bptr, " \t\n=");
+ if(tmp==NULL) continue;
+ *tmp++='\0';
+ key=g_strdup(bptr);
+ bptr=tmp;
+
+ start=0;
+ while(bptr+start != '\0' &&
+ (isspace(bptr[start]) || bptr[start]=='='))
+ start++;
+ len=strcspn(bptr+start, " \t\n");
+ bptr[start+len]='\0';
+ if(len>0) {
+ data=g_strdup(bptr+start);
+ } else {
+ data=g_strdup("TRUE");
+ }
+
+ g_hash_table_insert(read_options, key, data);
+ }
+ }
+ fclose(fp);
+
+ for(search=options;search->name!=NULL;search++) {
+ char *read_val;
+
+ read_val=g_hash_table_lookup(read_options, search->name);
+ if(read_val!=NULL) {
+ ORBit_option_set(search, read_val);
+ }
+ }
+
+ g_hash_table_foreach_remove(read_options, free_key_and_data, NULL);
+ g_hash_table_destroy(read_options);
+}
+#endif /* !__KORBIT__ */
+
+static void ORBit_ORB_release(CORBA_ORB orb, CORBA_Environment *ev)
+{
+ g_assert(orb!=NULL);
+
+ if(--(ORBIT_ROOT_OBJECT(orb)->refs))
+ return;
+
+ if(orb->orb_identifier!=NULL) {
+ g_free(orb->orb_identifier);
+ }
+ if(!CORBA_Object_is_nil(orb->imr, ev)) {
+ CORBA_Object_release(orb->imr, ev);
+ }
+ if(!CORBA_Object_is_nil(orb->ir, ev)) {
+ CORBA_Object_release(orb->ir, ev);
+ }
+ if(!CORBA_Object_is_nil(orb->naming, ev)) {
+ CORBA_Object_release(orb->naming, ev);
+ }
+ if(!CORBA_Object_is_nil(orb->root_poa, ev)) {
+ CORBA_Object_release(orb->root_poa, ev);
+ }
+ if(orb->cnx.ipv4)
+ giop_connection_unref(orb->cnx.ipv4);
+ if(orb->cnx.ipv6)
+ giop_connection_unref(orb->cnx.ipv6);
+#ifndef __KORBIT__
+ if(orb->cnx.usock)
+ giop_connection_unref(orb->cnx.usock);
+#endif
+
+ g_free(orb);
+}
+
+#ifndef __KORBIT__
+static GIOPConnection*
+ORBit_ORB_make_usock_connection(void)
+{
+ GIOPConnection *retval = NULL;
+ GString *tmpstr;
+ struct stat statbuf;
+
+ tmpstr = g_string_new(NULL);
+
+ g_string_sprintf(tmpstr, "/tmp/orbit-%s", g_get_user_name());
+
+ if(mkdir(tmpstr->str, 0700) != 0) {
+ int e = errno;
+
+ switch (e) {
+ case 0:
+ case EEXIST:
+ if (stat(tmpstr->str, &statbuf) != 0)
+ g_error ("Can not stat %s\n", tmpstr->str);
+
+ if (statbuf.st_uid != getuid ())
+ g_error ("Owner of %s is not the current user\n",
+ tmpstr->str);
+
+ if((statbuf.st_mode & (S_IRWXG|S_IRWXO))
+ || !S_ISDIR(statbuf.st_mode))
+ g_error ("Wrong permissions for %s\n",
+ tmpstr->str);
+ break;
+
+ default:
+ g_error("Unknown error on directory creation of %s (%s)\n",
+ tmpstr->str, g_strerror (e));
+ }
+ }
+
+ {
+ struct utimbuf utb;
+ memset(&utb, 0, sizeof(utb));
+ utime(tmpstr->str, &utb);
+ }
+
+
+#ifdef WE_DONT_CARE_ABOUT_STUPID_2DOT0DOTX_KERNELS
+ g_string_sprintf(tmpstr, "/tmp/orbit-%s",
+ g_get_user_name());
+ dirh = opendir(tmpstr->str);
+ while(!retval && (dent = readdir(dirh))) {
+ int usfd, ret;
+ struct sockaddr_un saddr;
+
+ saddr.sun_family = AF_UNIX;
+
+ if(strncmp(dent->d_name, "orb-", 4))
+ continue;
+
+ g_snprintf(saddr.sun_path, sizeof(saddr.sun_path),
+ "/tmp/orbit-%s/%s",
+ g_get_user_name(), dent->d_name);
+
+ usfd = socket(AF_UNIX, SOCK_STREAM, 0);
+ g_assert(usfd >= 0);
+
+ ret = connect(usfd, &saddr, SUN_LEN(&saddr));
+ close(usfd);
+
+ if(ret >= 0)
+ continue;
+
+ unlink(saddr.sun_path);
+ }
+ closedir(dirh);
+#endif /* WE_DONT_CARE_ABOUT_STUPID_2DOT0DOTX_KERNELS */
+
+ srand(time(NULL));
+ while(!retval) {
+ g_string_sprintf(tmpstr, "/tmp/orbit-%s/orb-%d%d",
+ g_get_user_name(), rand(), rand());
+ retval =
+ GIOP_CONNECTION(iiop_connection_server_unix(tmpstr->str));
+ }
+
+ g_string_free(tmpstr, TRUE);
+
+ return retval;
+}
+#endif /* !__KORBIT__ */
+
+
+// Synchronize between the user process starting up the orb and the ORB thread
+// this mutex gets released when the orb is all fired up and ready to go.
+static DECLARE_MUTEX(StartupSem);
+static CORBA_ORB TheOneTrueOrb = 0;
+
+struct CORBA_ORB_init_args { // A pointer to this struct is passed to
+ int *argc; // __CORBA_ORB_init
+ char **argv;
+ CORBA_ORBid orb_identifier;
+ CORBA_Environment *ev;
+};
+
+
+CORBA_ORB __CORBA_ORB_init(struct CORBA_ORB_init_args *Args) {
+ int *argc = Args->argc;
+ char **argv = Args->argv;
+ CORBA_ORBid orb_identifier = Args->orb_identifier;
+ CORBA_Environment *ev = Args->ev;
+
+ int no_iiop_server=0;
+ int no_iiop_proxy=0;
+#ifdef __KORBIT__
+ int use_ipv4=1;
+#else
+ int use_ipv4=0;
+#endif
+ int use_ipv6=0;
+ int use_usock=1;
+ int debug_level=0;
+ int debug_modules=0;
+ int nosysrc=0;
+ int nouserrc=0;
+ char *imr_ior=NULL, *imr_addr=NULL;
+ char *ir_ior=NULL, *ir_addr=NULL;
+ char *naming_ior=NULL, *naming_addr=NULL;
+ char *root_poa_ior=NULL, *root_poa_addr=NULL;
+ char *orb_id_opt=NULL;
+#ifndef __KORBIT__
+ char *ctmp;
+#endif
+ CORBA_ORB orb = 0;
+
+ /* The variable addresses in these structs need to be assigned at
+ * run-time if you want to compile with -pedantic
+ *
+ * (You will also get scads of warnings about "long long" too)
+ */
+
+ ORBit_orb_options pre_rc_options[]={
+ {"ORBNoSystemRC", no_arg, NULL},
+ {"ORBNoUserRC", no_arg, NULL},
+ {NULL, 0, NULL},
+ };
+
+ /* These options are compatible with MICO */
+ ORBit_orb_options options[]={
+ {"ORBNoIIOPServer", no_arg, NULL},
+ {"ORBNoIIOPProxy", no_arg, NULL},
+ {"ORBid", string_arg, NULL},
+ {"ORBImplRepoIOR", string_arg, NULL},
+ {"ORBImplRepoAddr", string_arg, NULL},
+ {"ORBIfaceRepoIOR", string_arg, NULL},
+ {"ORBIfaceRepoAddr", string_arg, NULL},
+ {"ORBNamingIOR", string_arg, NULL},
+ {"ORBNamingAddr", string_arg, NULL},
+ {"ORBDebugLevel", int_arg, NULL},
+ {"ORBBindAddr", string_arg, NULL}, /* XXX need to make
+ libIIOP support this */
+ {"ORBIIOPAddr", string_arg, NULL},
+
+ /* These options aren't */
+ {"ORBDebugModules", int_arg, NULL},
+ {"ORBRootPOAIOR", string_arg, NULL},
+ {"ORBRootPOAAddr", string_arg, NULL},
+ {"ORBIIOPUSock", int_arg, NULL},
+ {"ORBIIOPIPv4", int_arg, NULL},
+ {"ORBIIOPIPv6", int_arg, NULL},
+ {NULL,0,NULL},
+ };
+
+ if (ev == NULL || !argc || !argv || !orb_identifier) {
+ if (ev) {
+ CORBA_exception_set_system(ev, ex_CORBA_BAD_PARAM,
+ CORBA_COMPLETED_NO);
+ }
+ up(&StartupSem); // Okay, let the insmod thread continue...
+ return 0;
+ }
+
+ pre_rc_options[0].arg = (void *) &nosysrc;
+ pre_rc_options[1].arg = (void *) &nouserrc;
+ options[0].arg = (void *) &no_iiop_server;
+ options[1].arg = (void *) &no_iiop_proxy;
+ options[2].arg = (void *) &orb_id_opt;
+ options[3].arg = (void *) &imr_ior;
+ options[4].arg = (void *) &imr_addr;
+ options[5].arg = (void *) &ir_ior;
+ options[6].arg = (void *) &ir_addr;
+ options[7].arg = (void *) &naming_ior;
+ options[8].arg = (void *) &naming_addr;
+ options[9].arg = (void *) &debug_level;
+ options[12].arg = (void *) &debug_modules;
+ options[13].arg = (void *) &root_poa_ior;
+ options[14].arg = (void *) &root_poa_addr;
+ options[15].arg = (void *) &use_usock;
+ options[16].arg = (void *) &use_ipv4;
+ options[17].arg = (void *) &use_ipv6;
+
+#ifndef __KORBIT__
+ ORBit_option_parse(argc, argv, pre_rc_options);
+
+ if(!nosysrc) {
+ ORBit_rc_load(ORBit_SYSRC, options);
+ }
+
+ if(!nouserrc) {
+ char *buf;
+
+ ctmp = g_get_home_dir();
+
+ buf = alloca(strlen(ctmp) + sizeof("/.orbitrc"));
+ sprintf(buf, "%s/.orbitrc", ctmp);
+ ORBit_rc_load(buf, options);
+ freeca(buf);
+ }
+
+ ORBit_option_parse(argc, argv, options);
+#endif /* !__KORBIT__ */
+
+ ORBit_Trace_setLevel(debug_level);
+ ORBit_Trace_setModules(debug_modules);
+
+ CORBA_exception_init(ev);
+
+ ORBit_chunks_init();
+
+ giop_init(argv[0]);
+
+ orb=g_new0(struct CORBA_ORB_type, 1);
+
+ if(orb==NULL) {
+ CORBA_exception_set_system(ev, ex_CORBA_NO_MEMORY, CORBA_COMPLETED_NO);
+ goto error;
+ }
+
+ ORBit_pseudo_object_init(ORBIT_PSEUDO_OBJECT(orb), ORBIT_PSEUDO_ORB, ev);
+
+ ORBit_RootObject_set_interface(ORBIT_ROOT_OBJECT(orb),
+ (gpointer)&CORBA_ORB_epv, ev);
+
+ ORBIT_ROOT_OBJECT(orb)->refs = 1;
+
+ if(orb_id_opt!=NULL) {
+ if(!ORBit_ORBid_setup(orb, orb_id_opt))
+ goto error;
+ g_free(orb_id_opt);
+ } else if(orb_identifier!=NULL) {
+ if(!ORBit_ORBid_setup(orb, orb_identifier))
+ goto error;
+ } else {
+ orb->orb_identifier=g_strdup("orbit-local-orb");
+ }
+
+ if(orb->orb_identifier==NULL) {
+ CORBA_exception_set_system(ev, ex_CORBA_NO_MEMORY, CORBA_COMPLETED_NO);
+ goto error;
+ }
+
+ if(use_ipv4) {
+ orb->cnx.ipv4 = GIOP_CONNECTION(iiop_connection_server());
+
+ giop_connection_ref(orb->cnx.ipv4);
+ GIOP_CONNECTION(orb->cnx.ipv4)->orb_data = orb;
+ }
+
+ if(use_ipv6) {
+ orb->cnx.ipv6 = GIOP_CONNECTION(iiop_connection_server_ipv6());
+ giop_connection_ref(orb->cnx.ipv6);
+ GIOP_CONNECTION(orb->cnx.ipv6)->orb_data = orb;
+ }
+
+#ifndef __KORBIT__
+ if(use_usock) {
+ orb->cnx.usock = ORBit_ORB_make_usock_connection();
+
+ giop_connection_ref(orb->cnx.usock);
+ GIOP_CONNECTION(orb->cnx.usock)->orb_data = orb;
+ }
+#endif
+
+ orb->objrefs = g_hash_table_new((GHashFunc)g_CORBA_Object_hash,
+ (GCompareFunc)g_CORBA_Object_equal);
+ orb->poas = g_ptr_array_new();
+
+ /* when I figure out what MICO is doing with the iiop_proxy and
+ * iiop_server stuff, it'll get handled here.
+ */
+
+ /*
+ * Connect to / create implementation repository
+ */
+
+ {
+ CORBA_Object imr=NULL;
+
+ if(imr_ior!=NULL) {
+ imr=CORBA_ORB_string_to_object(orb, imr_ior, ev);
+ g_free(imr_ior);
+ } else if(imr_addr!=NULL) {
+ /*imr=CORBA_ORB_bind(orb, "IDL:omg.org/CORBA/ImplRepository:1.0", imr_addr, ev);*/
+ g_free(imr_addr);
+ }
+
+ if(!CORBA_Object_is_nil(imr, ev)) {
+ CORBA_ORB_set_initial_reference(orb, "ImplementationRepository", imr, ev);
+ }
+ }
+
+ /*
+ * Connect to / create interface repository
+ */
+
+ {
+ CORBA_Object ir=NULL;
+
+ if(ir_ior!=NULL) {
+ ir=CORBA_ORB_string_to_object(orb, ir_ior, ev);
+ g_free(ir_ior);
+ } else if(ir_addr!=NULL) {
+ /*ir=CORBA_ORB_bind(orb, "IDL:omg.org/CORBA/Repository:1.0", ir_addr, ev);*/
+ g_free(ir_addr);
+ }
+
+ if(!CORBA_Object_is_nil(ir, ev)) {
+ CORBA_ORB_set_initial_reference(orb, "InterfaceRepository", ir, ev);
+ }
+ }
+
+ /*
+ * Connect to naming service
+ */
+
+ {
+ CORBA_Object naming=NULL;
+
+ if(naming_ior!=NULL) {
+ naming=CORBA_ORB_string_to_object(orb, naming_ior, ev);
+ g_free(naming_ior);
+ } else if(naming_addr!=NULL) {
+ /*CORBA_ORB_ObjectTag tag=CORBA_ORB_string_to_tag(orb, "root", ev);*/
+
+ /*naming=CORBA_ORB_bind_tag(orb, "IDL:omg.org/CosNaming/NamingContext:1.0", tag, naming_addr, ev);*/
+ g_free(naming_addr);
+ }
+
+ if(!CORBA_Object_is_nil(naming, ev)) {
+ CORBA_ORB_set_initial_reference(orb, "NameService", naming, ev);
+ }
+ }
+
+ /*
+ * Connect to / create RootPOA
+ */
+
+ {
+ PortableServer_POA root_poa=CORBA_OBJECT_NIL;
+
+ if(root_poa_ior!=NULL) {
+ root_poa=(PortableServer_POA)
+ CORBA_ORB_string_to_object(orb,
+ root_poa_ior, ev);
+ g_free(root_poa_ior);
+ }
+
+ /* And attatch it to the orb */
+
+ if(!CORBA_Object_is_nil((CORBA_Object)root_poa, ev)) {
+ CORBA_ORB_set_initial_reference((CORBA_ORB)orb,
+ "RootPOA",
+ (CORBA_Object)root_poa,
+ ev);
+ }
+ }
+
+ ORBit_custom_run_setup(orb, ev);
+
+ if (!strcmp("server", argv[0])) // Only do this for servers.
+ TheOneTrueOrb = orb;
+ up(&StartupSem); // Okay, let the insmod thread continue...
+ return orb;
+
+error:
+ if(orb!=NULL) {
+ ORBit_ORB_release(orb, ev);
+ orb = NULL;
+ }
+ g_free(imr_ior);
+ g_free(imr_addr);
+ g_free(ir_ior);
+ g_free(ir_addr);
+ g_free(naming_ior);
+ g_free(naming_addr);
+ g_free(root_poa_ior);
+ g_free(root_poa_addr);
+ g_free(orb_id_opt);
+
+ TheOneTrueOrb = 0;
+ up(&StartupSem); // Okay, let the insmod thread continue...
+ return 0;
+}
+
+
+#if __KERNEL__
+#include <linux/smp_lock.h>
+#include <linux/proc_fs.h>
+
+// This is the main corba thread function...
+//
+void __CORBA_ORB_run(CORBA_ORB orb, CORBA_Environment *ev);
+int MainCORBAThread(void *Args) {
+ // Make a directory in /proc... yaay...
+ proc_mkdir("corba", 0);
+
+ __CORBA_ORB_init((struct CORBA_ORB_init_args*)Args);
+ if (TheOneTrueOrb == 0) return 0;
+
+ strcpy(current->comm, "korbit"); // Set the thread name...
+
+ lock_kernel(); /* This seems to be required for exit_mm */
+ exit_mm(current);
+
+ __CORBA_ORB_run(TheOneTrueOrb,
+ ((struct CORBA_ORB_init_args*)Args)->ev);
+ return 0;
+}
+#endif
+
+
+/* Section 4.4
+ *
+ * Adjusts argc and argv appropriately
+ */
+
+CORBA_ORB CORBA_ORB_init(int *argc, char **argv, CORBA_ORBid orb_identifier,
+ CORBA_Environment *ev) {
+
+ struct CORBA_ORB_init_args Args;
+ Args.argc = argc;
+ Args.argv = argv;
+ Args.orb_identifier = orb_identifier;
+ Args.ev = ev;
+
+#ifdef __KERNEL__
+ if (!strcmp(argv[0], "server")) { // Are we a server?
+ down(&StartupSem); // Grab the semaphore...
+ if (TheOneTrueOrb) {
+ CORBA_exception_init(ev);
+ goto out_success;
+ }
+
+ // This releases the semaphore when it is done initializing.
+ (void)kernel_thread(MainCORBAThread, &Args,
+ CLONE_FS | CLONE_FILES | CLONE_SIGHAND);
+
+ // This will block until the semaphore is released by the
+ // ORB thread.
+ down(&StartupSem);
+ } else { // If we are a corba client, like CorbaFS...
+ return __CORBA_ORB_init(&Args);
+ }
+
+ out_success:
+ up(&StartupSem); // Okay, we're now here.
+#else
+ __CORBA_ORB_init(&Args);
+#endif
+ if (TheOneTrueOrb)
+ return (CORBA_ORB)CORBA_Object_duplicate((CORBA_Object)TheOneTrueOrb, ev);
+ return 0;
+}
+
+
+
+
+typedef struct {
+ CORBA_Object obj;
+ CDR_Codec *codec;
+ gboolean emit_active;
+} profile_user_data;
+
+static void ORBit_emit_profile(gpointer item, gpointer userdata)
+{
+ ORBit_Object_info *profile=(ORBit_Object_info *)item;
+ profile_user_data *data=(profile_user_data *)userdata;
+ CORBA_Object obj=data->obj;
+ CDR_Codec encaps_codec_d;
+ CDR_Codec *codec=data->codec, *encaps = &encaps_codec_d;
+ gboolean emit_active=data->emit_active;
+ static const CORBA_octet iiopversion[] = {1,0};
+ CORBA_octet codecbuf[2048];
+
+ g_assert(obj!=NULL);
+ g_assert(codec!=NULL);
+ g_assert(profile!=NULL);
+
+ if((profile == obj->active_profile) && (emit_active == FALSE))
+ return; /* we already did this one */
+
+ switch(profile->profile_type) {
+ case IOP_TAG_INTERNET_IOP:
+ CDR_codec_init_static(encaps);
+ encaps->buffer = codecbuf;
+ encaps->release_buffer = CORBA_FALSE;
+ encaps->buf_len = 2048;
+ encaps->readonly = CORBA_FALSE;
+ encaps->host_endian = encaps->data_endian = FLAG_ENDIANNESS;
+
+ CDR_put_ulong(codec, IOP_TAG_INTERNET_IOP);
+ CDR_put_octet(encaps, FLAG_ENDIANNESS);
+ CDR_put_octets(encaps, (gpointer)iiopversion, sizeof(iiopversion));
+ CDR_put_string(encaps, profile->tag.iopinfo.host);
+ CDR_put_ushort(encaps, profile->tag.iopinfo.port);
+ CDR_put_ulong(encaps, profile->object_key._length);
+ CDR_put_octets(encaps, profile->object_key._buffer,
+ profile->object_key._length);
+ CDR_put_ulong(codec, encaps->wptr);
+ CDR_put_octets(codec, encaps->buffer, encaps->wptr);
+ break;
+
+ case IOP_TAG_ORBIT_SPECIFIC:
+ CDR_codec_init_static(encaps);
+ encaps->buffer = codecbuf;
+ encaps->release_buffer = CORBA_FALSE;
+ encaps->buf_len = 2048;
+ encaps->readonly = CORBA_FALSE;
+ encaps->host_endian = encaps->data_endian = FLAG_ENDIANNESS;
+
+ CDR_put_ulong(codec, IOP_TAG_ORBIT_SPECIFIC);
+ CDR_put_octet(encaps, FLAG_ENDIANNESS);
+ CDR_put_octets(encaps, (gpointer)iiopversion, sizeof(iiopversion));
+ CDR_put_string(encaps, profile->tag.orbitinfo.unix_sock_path);
+ CDR_put_ushort(encaps, profile->tag.orbitinfo.ipv6_port);
+ CDR_put_ulong(encaps, profile->object_key._length);
+ CDR_put_octets(encaps, profile->object_key._buffer,
+ profile->object_key._length);
+ CDR_put_ulong(codec, encaps->wptr);
+ CDR_put_octets(codec, encaps->buffer, encaps->wptr);
+ break;
+
+ default:
+ g_warning("Skipping tag %d", profile->profile_type);
+ break;
+ }
+}
+
+CORBA_char *CORBA_ORB_object_to_string(CORBA_ORB orb,
+ CORBA_Object obj,
+ CORBA_Environment *ev)
+{
+ int i;
+ CDR_Codec codec_d;
+ CDR_Codec *codec = &codec_d;
+ CORBA_char *rc = NULL;
+ CORBA_unsigned_long ntags;
+ profile_user_data data;
+ CORBA_octet codecbuf[2048];
+ char *ctmp;
+
+ g_return_val_if_fail(ev, NULL);
+ o_return_val_if_fail(orb && obj, NULL);
+
+ if(!obj || !orb) {
+ CORBA_exception_set_system(ev,
+ ex_CORBA_BAD_PARAM,
+ CORBA_COMPLETED_NO);
+ return NULL;
+ }
+
+ if(ORBIT_ROOT_OBJECT(obj)->is_pseudo_object) {
+ CORBA_exception_set_system(ev,
+ ex_CORBA_MARSHAL,
+ CORBA_COMPLETED_NO);
+ return NULL;
+ }
+
+ CDR_codec_init_static(codec);
+
+ codec->buffer = codecbuf;
+ codec->release_buffer = CORBA_FALSE;
+ codec->buf_len = 2048;
+ codec->readonly = CORBA_FALSE;
+ codec->host_endian = codec->data_endian = FLAG_ENDIANNESS;
+
+ CDR_put_octet(codec, FLAG_ENDIANNESS);
+
+ CDR_put_string(codec, obj->object_id);
+ ntags = g_slist_length(obj->profile_list);
+ CDR_put_ulong(codec, ntags);
+
+ data.obj=obj;
+ data.codec=codec;
+ data.emit_active=TRUE;
+ if(obj->active_profile != NULL)
+ ORBit_emit_profile(obj->active_profile, &data); /* do this one first */
+
+ data.emit_active=FALSE;
+ g_slist_foreach(obj->profile_list, ORBit_emit_profile, &data);
+
+ rc = CORBA_string_alloc(4 + (codec->wptr * 2) + 1);
+ strcpy(rc, "IOR:");
+
+#define hexdigit(n) (((n)>9)?(n+'a'-10):(n+'0'))
+
+ for(i = 0, ctmp = rc + strlen("IOR:"); i < codec->wptr; i++) {
+ *(ctmp++) = hexdigit((((codec->buffer[i]) & 0xF0) >> 4));
+ *(ctmp++) = hexdigit(((codec->buffer[i]) & 0xF));
+ }
+ *ctmp = '\0';
+
+ {
+ /* Debug check */
+ CORBA_Object obj;
+ CORBA_Environment myev;
+
+ CORBA_exception_init(&myev);
+
+ obj = CORBA_ORB_string_to_object(orb, rc, &myev);
+
+ if (CORBA_Object_is_nil(obj, &myev)) {
+ g_warning("Bug in %s, created bad IOR `%s'\n",
+ __FUNCTION__, rc);
+ CORBA_free(rc);
+ return NULL;
+ }
+
+ CORBA_Object_release(obj, &myev);
+ }
+
+ return rc;
+}
+
+/* Quote from the GNU libc manual:
+
+ "If you try to allocate more storage than the machine can provide,
+ you don't get a clean error message. Instead you get a fatal
+ signal like the one you would get from an infinite recursion;
+ probably a segmentation violation (see section Program Error
+ Signals)."
+
+ The man page claims alloca() returns NULL on failure; this appears
+ to be a load of shit on Linux where you just get flaming death, but
+ we check anyway in case other systems work that way.
+
+ On Linux we check that the size is less than MAX_STACK_ALLOC
+
+ Note that the CORBA_alloc() calls in here can still cause
+ program abort, and really that should be fixed in a similar
+ way since our lengths are coming in from unpredictable sources
+ like files or the network.
+*/
+
+#define MAX_STACK_ALLOC 8192
+
+CORBA_Object CORBA_ORB_string_to_object(CORBA_ORB orb, CORBA_char *str,
+ CORBA_Environment *ev)
+{
+ GSList *profiles=NULL;
+ CORBA_Object retval = NULL;
+ CORBA_char *type_id;
+ ORBit_Object_info *object_info;
+ CDR_Codec codec_d, encaps_codec_d;
+ CDR_Codec *codec = &codec_d, *encaps_codec = &encaps_codec_d;
+ CORBA_octet *buffer, endian;
+ int i, j;
+ CORBA_unsigned_long len, seq_len, misclen;
+
+ g_return_val_if_fail(ev, CORBA_OBJECT_NIL);
+ o_return_val_if_fail(orb && str, CORBA_OBJECT_NIL);
+
+ if(strncmp(str, "IOR:", 4)) {
+ CORBA_exception_set_system(ev, ex_CORBA_MARSHAL,
+ CORBA_COMPLETED_NO);
+ return(CORBA_OBJECT_NIL);
+ }
+
+ CDR_codec_init_static(codec);
+ len = strlen(str);
+
+ if((len % 2) || len <= 4) {
+ CORBA_exception_set_system(ev, ex_CORBA_MARSHAL,
+ CORBA_COMPLETED_NO);
+ return(CORBA_OBJECT_NIL);
+ }
+
+ codec->buf_len = (len-4)/2;
+ buffer = alloca(codec->buf_len);
+
+ codec->buffer=buffer;
+ codec->release_buffer = CORBA_FALSE;
+ codec->readonly = TRUE;
+
+ for(j = 0, i = 4; i < len; i+=2) {
+ buffer[j++] = HEXOCTET(str[i], str[i+1]);
+ };
+
+ CDR_get_octet(codec, &endian);
+
+ codec->data_endian = endian;
+ codec->host_endian = FLAG_ENDIANNESS;
+
+ CDR_get_string_static(codec, &type_id);
+
+ CDR_get_seq_begin(codec, &seq_len);
+
+ for(i = 0; i < seq_len; i++) {
+ IOP_ProfileId tag;
+
+ object_info=g_new0(ORBit_Object_info, 1);
+
+ if (!CDR_get_ulong(codec, &tag))
+ goto error_out;
+
+ switch(tag) {
+ case IOP_TAG_INTERNET_IOP:
+ if (!CDR_get_ulong(codec, &misclen))
+ goto error_out;
+
+ CDR_codec_init_static(encaps_codec);
+
+ if (misclen > MAX_STACK_ALLOC)
+ goto error_out;
+
+ encaps_codec->buffer = alloca(misclen);
+ if (encaps_codec->buffer == NULL)
+ /* misclen was probably junk */
+ goto error_out;
+
+ encaps_codec->release_buffer = FALSE;
+ if(!CDR_buffer_gets(codec, encaps_codec->buffer, misclen))
+ goto error_out;
+
+ encaps_codec->buf_len = misclen;
+ encaps_codec->readonly = CORBA_TRUE;
+ if(!CDR_get_octet(encaps_codec, &endian))
+ goto error_out;
+ encaps_codec->data_endian = endian;
+ encaps_codec->host_endian = FLAG_ENDIANNESS;
+
+ if (encaps_codec->data_endian > 1)
+ goto error_out;
+
+ object_info->profile_type = IOP_TAG_INTERNET_IOP;
+ if(!CDR_get_octet(encaps_codec, &object_info->iiop_major))
+ goto error_out;
+ if(object_info->iiop_major != 1)
+ goto error_out;
+ if(!CDR_get_octet(encaps_codec, &object_info->iiop_minor))
+ goto error_out;
+ if(!CDR_get_string(encaps_codec, &object_info->tag.iopinfo.host))
+ goto error_out;
+ if(!CDR_get_ushort(encaps_codec, &object_info->tag.iopinfo.port))
+ goto error_out;
+ if(!CDR_get_seq_begin(encaps_codec, &object_info->object_key._length))
+ goto error_out;
+
+ object_info->object_key._maximum = 0;
+
+ /* The POA gives out ORBit_alloc()d profiles, so we have to too */
+ object_info->object_key._buffer = ORBit_alloc(object_info->object_key._length, NULL, NULL);
+ if(!CDR_buffer_gets(encaps_codec, object_info->object_key._buffer,
+ object_info->object_key._length))
+ goto error_out;
+
+ ORBit_set_object_key(object_info);
+ profiles=g_slist_append(profiles, object_info);
+ break;
+
+ case IOP_TAG_MULTIPLE_COMPONENTS:
+ /* Just skip any multiple_components data, for now */
+ if(!CDR_get_ulong(codec, &misclen))
+ goto error_out;
+
+ CDR_codec_init_static(encaps_codec);
+
+ if (misclen > MAX_STACK_ALLOC)
+ goto error_out;
+
+ encaps_codec->buf_len = misclen;
+ encaps_codec->buffer = alloca(misclen);
+ if (encaps_codec->buffer == NULL)
+ /* misclen was probably junk */
+ goto error_out;
+
+ encaps_codec->release_buffer = FALSE;
+ encaps_codec->readonly = CORBA_TRUE;
+ if(!CDR_buffer_gets(codec, encaps_codec->buffer, misclen))
+ goto error_out;
+ break;
+
+ case IOP_TAG_ORBIT_SPECIFIC:
+ if(!CDR_get_ulong(codec, &misclen))
+ goto error_out;
+
+ CDR_codec_init_static(encaps_codec);
+
+ if (misclen > MAX_STACK_ALLOC)
+ goto error_out;
+
+ encaps_codec->buffer = alloca(misclen);
+ if (encaps_codec->buffer == NULL)
+ /* misclen was probably junk */
+ goto error_out;
+
+ encaps_codec->release_buffer = FALSE;
+ if(!CDR_buffer_gets(codec, encaps_codec->buffer, misclen))
+ goto error_out;
+
+ encaps_codec->buf_len = misclen;
+ encaps_codec->readonly = CORBA_TRUE;
+
+ if(!CDR_get_octet(encaps_codec, &endian))
+ goto error_out;
+
+ encaps_codec->data_endian = endian;
+ encaps_codec->host_endian = FLAG_ENDIANNESS;
+
+ if (encaps_codec->data_endian > 1)
+ goto error_out;
+
+ object_info->profile_type=IOP_TAG_ORBIT_SPECIFIC;
+ if(!CDR_get_octet(encaps_codec, &object_info->iiop_major))
+ goto error_out;
+
+ if(object_info->iiop_major != 1)
+ goto error_out;
+ if(!CDR_get_octet(encaps_codec, &object_info->iiop_minor))
+ goto error_out;
+
+ if(!CDR_get_string(encaps_codec, &object_info->tag.orbitinfo.unix_sock_path))
+ goto error_out;
+
+ if(!CDR_get_ushort(encaps_codec, &object_info->tag.orbitinfo.ipv6_port))
+ goto error_out;
+ if(!CDR_get_seq_begin(encaps_codec, &object_info->object_key._length))
+ goto error_out;
+ object_info->object_key._maximum = 0;
+
+ /* The POA gives out ORBit_alloc()d profiles, so we have to too */
+ object_info->object_key._buffer = ORBit_alloc(object_info->object_key._length, NULL, NULL);
+ if(!CDR_buffer_gets(encaps_codec, object_info->object_key._buffer,
+ object_info->object_key._length))
+ goto error_out;
+
+ ORBit_set_object_key(object_info);
+ profiles=g_slist_append(profiles, object_info);
+ break;
+ default:
+ g_warning("Unknown tag 0x%x", tag);
+
+ /* Skip it */
+ if(!CDR_get_ulong(codec, &misclen))
+ goto error_out;
+
+ CDR_codec_init_static(encaps_codec);
+
+ if (misclen > MAX_STACK_ALLOC)
+ goto error_out;
+
+ encaps_codec->buf_len = misclen;
+ encaps_codec->buffer = alloca(misclen);
+ if (encaps_codec->buffer == NULL)
+ /* misclen was probably junk */
+ goto error_out;
+
+ encaps_codec->release_buffer = FALSE;
+ encaps_codec->readonly = CORBA_TRUE;
+ if(!CDR_buffer_gets(codec, encaps_codec->buffer, misclen))
+ goto error_out;
+
+ break;
+ }
+ }
+
+ freeca(buffer); /* Same as codec->buffer */
+ freeca(encaps_codec->buffer);
+
+ return ORBit_create_object_with_info(profiles, type_id, orb, ev);
+
+ error_out:
+
+ if(object_info) {
+ CORBA_free(object_info->object_key._buffer);
+ g_free(object_info);
+ ORBit_delete_profiles(profiles);
+ }
+
+ freeca(buffer); /* Same as codec->buffer */
+ freeca(encaps_codec->buffer);
+
+ return retval;
+}
+
+/* Section 4.1.2 */
+CORBA_boolean CORBA_ORB_get_service_information(CORBA_ORB orb, CORBA_ServiceType service_type, CORBA_ServiceInformation *service_information, CORBA_Environment *ev)
+{
+ g_assert(!"Not yet implemented");
+ return(CORBA_FALSE);
+}
+
+CORBA_Current *CORBA_ORB_get_current(CORBA_ORB orb, CORBA_Environment *ev)
+{
+ g_return_val_if_fail(ev, NULL);
+ o_return_val_if_fail(orb, NULL);
+
+ /* XXX check this over */
+ return (CORBA_Current *)GET_THREAD_DATA();
+}
+
+/* Section 4.5 */
+CORBA_ORB_ObjectIdList *CORBA_ORB_list_initial_services(CORBA_ORB orb, CORBA_Environment *ev)
+{
+ static const char *services[] = {"RootPOA"};
+ CORBA_ORB_ObjectIdList *list;
+
+ g_return_val_if_fail(ev, NULL);
+ o_return_val_if_fail(orb, NULL);
+
+ list = (CORBA_ORB_ObjectIdList *)CORBA_sequence_octet__alloc();
+ list->_maximum=list->_length= 1;
+ list->_buffer = (CORBA_ORB_ObjectId *)services;
+ CORBA_sequence_set_release((void *)list, CORBA_FALSE);
+
+ /* defined reserved references are:
+ * RootPOA
+ * POACurrent
+ * InterfaceRepository
+ * NameService
+ * TradingService
+ * SecurityCurrent
+ * TransactionCurrent
+ */
+
+ return list;
+}
+
+/* Section 4.5
+ *
+ * raises InvalidName
+ */
+CORBA_Object CORBA_ORB_resolve_initial_references(CORBA_ORB orb, CORBA_ORB_ObjectId identifier, CORBA_Environment *ev)
+{
+ g_return_val_if_fail(ev, CORBA_OBJECT_NIL);
+ o_return_val_if_fail(orb, CORBA_OBJECT_NIL);
+
+ if(!strcmp(identifier, "ImplementationRepository"))
+ return CORBA_Object_duplicate(orb->imr, ev);
+ else if(!strcmp(identifier, "InterfaceRepository"))
+ return CORBA_Object_duplicate(orb->ir, ev);
+ else if(!strcmp(identifier, "NameService"))
+ return CORBA_Object_duplicate(orb->naming, ev);
+ else if(!strcmp(identifier, "RootPOA")) {
+ if(CORBA_Object_is_nil(orb->root_poa, ev)) {
+ CORBA_PolicyList policies = {0,0,NULL,CORBA_FALSE};
+ PortableServer_POAManager poa_mgr;
+ /* Create a poa manager */
+ poa_mgr = ORBit_POAManager_new(ev);
+ poa_mgr->orb = orb;
+
+ /* Create the root poa */
+ orb->root_poa = (CORBA_Object)
+ ORBit_POA_new(orb,
+ "RootPOA",
+ poa_mgr,
+ &policies,
+ ev);
+ CORBA_Object_duplicate(orb->root_poa, ev);
+ }
+
+ return CORBA_Object_duplicate(orb->root_poa, ev);
+ }
+
+ /* throw user exception: InvalidName */
+ CORBA_exception_set(ev,CORBA_USER_EXCEPTION,
+ ex_CORBA_ORB_InvalidName,
+ NULL);
+
+ goto error;
+error:
+ return(NULL);
+}
+
+/* This is a MICO extension
+ *
+ * raises InvalidName
+ */
+void CORBA_ORB_set_initial_reference(CORBA_ORB orb, CORBA_ORB_ObjectId identifier, CORBA_Object obj, CORBA_Environment *ev)
+{
+ g_return_if_fail(ev);
+ o_return_if_fail(orb && identifier && obj);
+
+ if(!strcmp(identifier, "ImplementationRepository")) {
+ if(!CORBA_Object_is_nil(orb->imr, ev)) {
+ CORBA_Object_release(orb->imr, ev);
+ }
+ orb->imr=CORBA_Object_duplicate(obj, ev);
+ } else if(!strcmp(identifier, "InterfaceRepository")) {
+ if(!CORBA_Object_is_nil(orb->ir, ev)) {
+ CORBA_Object_release(orb->ir, ev);
+ }
+ orb->ir=CORBA_Object_duplicate(obj, ev);
+ } else if(!strcmp(identifier, "NameService")) {
+ if(!CORBA_Object_is_nil(orb->naming, ev)) {
+ CORBA_Object_release(orb->naming, ev);
+ }
+ orb->naming=CORBA_Object_duplicate(obj, ev);
+ } else if(!strcmp(identifier, "RootPOA")) {
+ if(!CORBA_Object_is_nil(orb->root_poa, ev)) {
+ CORBA_Object_release(orb->root_poa, ev);
+ }
+ orb->root_poa=CORBA_Object_duplicate(obj, ev);
+ } else {
+ /* throw user exception: InvalidName */
+ CORBA_exception_set(ev,CORBA_USER_EXCEPTION,ex_CORBA_ORB_InvalidName,NULL);
+ goto error;
+ }
+
+ return;
+error:
+ return;
+}
+
+/* Section 4.9.1 */
+CORBA_boolean CORBA_ORB_work_pending(CORBA_ORB orb, CORBA_Environment *ev)
+{
+ g_assert(!"Not yet implemented");
+ return(CORBA_FALSE);
+}
+
+/* Section 4.9.2 */
+void CORBA_ORB_perform_work(CORBA_ORB orb, CORBA_Environment *ev)
+{
+ g_assert(!"Not yet implemented");
+ return;
+}
+
+/* Section 4.9.4 */
+void
+CORBA_ORB_shutdown(CORBA_ORB orb,
+ CORBA_boolean wait_for_completion,
+ CORBA_Environment *ev)
+{
+ g_return_if_fail(ev);
+ o_return_if_fail(orb);
+
+ /* XXX implement on a per-ORB basis, and also
+ handle whatever wait_for_completion means */
+
+ if(orb->cnx.ipv4)
+ giop_connection_unref(orb->cnx.ipv4);
+ if(orb->cnx.ipv6)
+ giop_connection_unref(orb->cnx.ipv6);
+#ifndef __KORBIT__
+ if(orb->cnx.usock)
+ giop_connection_unref(orb->cnx.usock);
+#endif
+
+ giop_main_quit();
+}
+
+/* Section 4.9.3 */
+/* CORBA_ORB_run is in server.c */
+
+/* Section 4.7 */
+CORBA_PolicyType
+CORBA_Policy__get_policy_type(CORBA_Policy obj, CORBA_Environment *ev)
+{
+ g_return_val_if_fail(ev, 0);
+ o_return_val_if_fail(obj, 0);
+
+ return obj->policy_type;
+}
+
+/* Section 4.7 */
+CORBA_Policy CORBA_Policy_copy(CORBA_Policy obj, CORBA_Environment *ev)
+{
+ g_return_val_if_fail(ev, CORBA_OBJECT_NIL);
+ o_return_val_if_fail(obj, CORBA_OBJECT_NIL);
+
+ ORBIT_ROOT_OBJECT_REF(obj);
+
+ return obj;
+}
+
+/* Section 4.7
+ *
+ * raises CORBA_NO_PERMISSION
+ */
+void CORBA_Policy_destroy(CORBA_Policy obj, CORBA_Environment *ev)
+{
+ g_return_if_fail(ev);
+ o_return_if_fail(obj);
+
+ ORBIT_ROOT_OBJECT_UNREF(obj);
+ if(ORBIT_ROOT_OBJECT(obj)->refs <= 0)
+ ORBIT_ROOT_OBJECT_release(obj, ev);
+}
+
+#ifndef __KORBIT__
+/* Section 4.8.2 */
+CORBA_Policy CORBA_DomainManager_get_domain_policy(CORBA_DomainManager obj, CORBA_PolicyType policy_type, CORBA_Environment *ev)
+{
+ g_return_val_if_fail(ev, CORBA_OBJECT_NIL);
+ o_return_val_if_fail(obj, CORBA_OBJECT_NIL);
+
+ g_assert(!"Not yet implemented");
+ return(NULL);
+}
+
+/* Section 4.8.2 */
+void CORBA_ConstructionPolicy_make_domain_manager(CORBA_ConstructionPolicy obj, CORBA_InterfaceDef object_type, CORBA_boolean constr_policy, CORBA_Environment *
+ev)
+{
+ g_return_if_fail(ev);
+ o_return_if_fail(obj && object_type);
+
+ g_assert(!"Not yet implemented");
+ return;
+}
+
+/* Section 4.2.8 */
+CORBA_DomainManagerList *CORBA_Object_get_domain_managers(CORBA_Object obj, CORBA_Environment *ev)
+{
+ g_return_val_if_fail(ev, NULL);
+ o_return_val_if_fail(obj, NULL);
+
+ g_assert(!"Not yet implemented");
+ return(NULL);
+}
+
+CORBA_TypeCode CORBA_ORB_create_struct_tc(CORBA_ORB obj, CORBA_RepositoryId id, CORBA_Identifier name, CORBA_StructMemberSeq members, CORBA_Environment *ev)
+{
+ CORBA_TypeCode tc;
+ int i;
+
+ tc=ORBIT_CHUNK_ALLOC(CORBA_TypeCode);
+ if(tc == NULL)
+ goto tc_alloc_failed;
+
+ tc->subtypes=g_new0(CORBA_TypeCode, members._length);
+ if(tc->subtypes == NULL)
+ goto subtypes_alloc_failed;
+
+ tc->subnames=g_new0(char *, members._length);
+ if(tc->subnames == NULL)
+ goto subnames_alloc_failed;
+
+ tc->kind=CORBA_tk_struct;
+ tc->name=g_strdup(name);
+ tc->repo_id=g_strdup(id);
+ tc->sub_parts=members._length;
+ tc->length=members._length;
+
+ for(i=0;i<members._length;i++) {
+ CORBA_StructMember *mem=(CORBA_StructMember *)&(members._buffer[i]);
+
+ g_assert(&(mem->type)!=NULL);
+
+ tc->subtypes[i] = ORBIT_CHUNK_ALLOC(CORBA_TypeCode);
+ memcpy(tc->subtypes[i], mem->type, (size_t)sizeof(struct CORBA_TypeCode_struct));
+ tc->subnames[i]=g_strdup(mem->name);
+ }
+
+ return(tc);
+
+ subnames_alloc_failed:
+ g_free(tc->subtypes);
+ subtypes_alloc_failed:
+ ORBIT_CHUNK_FREE(CORBA_TypeCode, tc);
+ tc_alloc_failed:
+ CORBA_exception_set_system(ev, ex_CORBA_NO_MEMORY, CORBA_COMPLETED_NO);
+ return NULL;
+}
+
+CORBA_TypeCode
+CORBA_ORB_create_union_tc(CORBA_ORB obj, CORBA_RepositoryId id,
+ CORBA_Identifier name,
+ CORBA_TypeCode discriminator_type,
+ CORBA_UnionMemberSeq members,
+ CORBA_Environment *ev)
+{
+ CORBA_TypeCode tc;
+ int i;
+
+ tc=ORBIT_CHUNK_ALLOC(CORBA_TypeCode);
+
+ if(tc == NULL)
+ goto tc_alloc_failed;
+
+ tc->discriminator = ORBIT_CHUNK_ALLOC(CORBA_TypeCode);
+
+ if(tc->discriminator == NULL)
+ goto discriminator_alloc_failed;
+
+ memcpy(tc->discriminator, discriminator_type, (size_t)sizeof(CORBA_TypeCode));
+
+ tc->subtypes=g_new0(CORBA_TypeCode, members._length);
+ if(tc->subtypes==NULL)
+ goto subtypes_alloc_failed;
+
+ tc->subnames=g_new0(char *, members._length);
+ if(tc->subnames==NULL)
+ goto subnames_alloc_failed;
+
+ tc->sublabels=g_new0(CORBA_any, members._length);
+ if(tc->sublabels == NULL)
+ goto sublabels_alloc_failed;
+
+ tc->kind=CORBA_tk_union;
+ tc->name=g_strdup(name);
+ tc->repo_id=g_strdup(id);
+ tc->sub_parts=members._length;
+ tc->length=members._length;
+ tc->default_index=-1;
+
+ for(i=0;i<members._length;i++) {
+ CORBA_UnionMember *mem=(CORBA_UnionMember *)&(members._buffer[i]);
+
+ g_assert(&(mem->label)!=NULL);
+ memcpy(&(tc->sublabels[i]), &(mem->label), (size_t)sizeof(CORBA_any));
+ g_assert(&(mem->type)!=NULL);
+ tc->subtypes[i] = ORBIT_CHUNK_ALLOC(CORBA_TypeCode);
+ memcpy(tc->subtypes[i], mem->type, (size_t)sizeof(struct CORBA_TypeCode_struct));
+ tc->subnames[i]=g_strdup(mem->name);
+
+ if(mem->label._type->kind==CORBA_tk_octet) {
+ tc->default_index=i;
+ }
+ }
+
+ return(tc);
+
+sublabels_alloc_failed:
+ g_free(tc->sublabels);
+subnames_alloc_failed:
+ g_free(tc->subtypes);
+subtypes_alloc_failed:
+ ORBIT_CHUNK_FREE(CORBA_TypeCode, tc->discriminator);
+discriminator_alloc_failed:
+ ORBIT_CHUNK_FREE(CORBA_TypeCode, tc);
+ tc_alloc_failed:
+ CORBA_exception_set_system(ev, ex_CORBA_NO_MEMORY, CORBA_COMPLETED_NO);
+ return NULL;
+}
+
+CORBA_TypeCode CORBA_ORB_create_enum_tc(CORBA_ORB obj, CORBA_RepositoryId id, CORBA_Identifier name, CORBA_EnumMemberSeq members, CORBA_Environment *ev)
+{
+ CORBA_TypeCode tc;
+ int i;
+
+ tc = ORBIT_CHUNK_ALLOC(CORBA_TypeCode);
+ if(tc == NULL)
+ goto tc_alloc_failed;
+
+ tc->subnames=g_new0(char *, members._length);
+ if(tc->subnames==NULL)
+ goto subnames_alloc_failed;
+
+ tc->kind = CORBA_tk_enum;
+ tc->name = g_strdup(name);
+ tc->repo_id = g_strdup(id);
+ tc->sub_parts = members._length;
+ tc->length = members._length;
+
+ for(i=0;i<members._length;i++) {
+ tc->subnames[i]=g_strdup(members._buffer[i]);
+ }
+
+ return(tc);
+
+ subnames_alloc_failed:
+ ORBIT_CHUNK_FREE(CORBA_TypeCode, tc);
+ tc_alloc_failed:
+ CORBA_exception_set_system(ev, ex_CORBA_NO_MEMORY, CORBA_COMPLETED_NO);
+ return(NULL);
+}
+
+CORBA_TypeCode CORBA_ORB_create_alias_tc(CORBA_ORB obj, CORBA_RepositoryId id, CORBA_Identifier name, CORBA_TypeCode original_type, CORBA_Environment *ev)
+{
+ CORBA_TypeCode tc;
+
+ tc = ORBIT_CHUNK_ALLOC(CORBA_TypeCode);
+ if(tc==NULL)
+ goto tc_alloc_failed;
+
+ /* Can't use chunks here, because it's sometimes an array. Doh! */
+ tc->subtypes=g_new0(CORBA_TypeCode, 1);
+ if(tc->subtypes==NULL)
+ goto subtypes_alloc_failed;
+
+ tc->kind=CORBA_tk_alias;
+ tc->name=g_strdup(name);
+ tc->repo_id=g_strdup(id);
+ tc->sub_parts=1;
+ tc->length=1;
+
+ tc->subtypes[0] = ORBIT_CHUNK_ALLOC(CORBA_TypeCode);
+ memcpy(tc->subtypes[0], original_type, (size_t)sizeof(struct CORBA_TypeCode_struct));
+
+ return(tc);
+ subtypes_alloc_failed:
+ ORBIT_CHUNK_FREE(CORBA_TypeCode, tc);
+tc_alloc_failed:
+ CORBA_exception_set_system(ev, ex_CORBA_NO_MEMORY, CORBA_COMPLETED_NO);
+ return NULL;
+}
+
+CORBA_TypeCode CORBA_ORB_create_exception_tc(CORBA_ORB obj, CORBA_RepositoryId id, CORBA_Identifier name, CORBA_StructMemberSeq members, CORBA_Environment *ev)
+{
+ CORBA_TypeCode tc;
+ int i;
+
+ tc=ORBIT_CHUNK_ALLOC(CORBA_TypeCode);
+ if(tc==NULL)
+ goto tc_alloc_failed;
+
+ tc->subtypes=g_new0(CORBA_TypeCode, members._length);
+ if(tc->subtypes==NULL)
+ goto subtypes_alloc_failed;
+
+ tc->subnames=g_new0(char *, members._length);
+ if(tc->subnames==NULL)
+ goto subnames_alloc_failed;
+
+ tc->kind=CORBA_tk_except;
+ tc->name=g_strdup(name);
+ tc->repo_id=g_strdup(id);
+ tc->sub_parts=members._length;
+ tc->length=members._length;
+
+ for(i=0;i<members._length;i++) {
+ CORBA_StructMember *mem=(CORBA_StructMember *)&(members._buffer[i]);
+
+ g_assert(mem->type != NULL);
+ tc->subtypes[i] = ORBIT_CHUNK_ALLOC(CORBA_TypeCode);
+ memcpy(tc->subtypes[i], mem->type, (size_t)sizeof(struct CORBA_TypeCode_struct));
+ tc->subnames[i]=g_strdup(mem->name);
+ }
+
+ return(tc);
+
+ subnames_alloc_failed:
+ g_free(tc->subtypes);
+ subtypes_alloc_failed:
+ ORBIT_CHUNK_FREE(CORBA_TypeCode, tc);
+ tc_alloc_failed:
+ CORBA_exception_set_system(ev, ex_CORBA_NO_MEMORY, CORBA_COMPLETED_NO);
+ return(NULL);
+}
+
+CORBA_TypeCode CORBA_ORB_create_interface_tc(CORBA_ORB obj, CORBA_RepositoryId id, CORBA_Identifier name, CORBA_Environment *ev)
+{
+ CORBA_TypeCode tc;
+
+ tc=ORBIT_CHUNK_ALLOC(CORBA_TypeCode);
+ if(tc==NULL) {
+ CORBA_exception_set_system(ev, ex_CORBA_NO_MEMORY,
+ CORBA_COMPLETED_NO);
+ return(NULL);
+ }
+
+ tc->kind=CORBA_tk_objref;
+ tc->name=g_strdup(name);
+ tc->repo_id=g_strdup(id);
+
+ return(tc);
+}
+
+CORBA_TypeCode CORBA_ORB_create_string_tc(CORBA_ORB obj, CORBA_unsigned_long bound, CORBA_Environment *ev)
+{
+ CORBA_TypeCode tc;
+
+ tc=ORBIT_CHUNK_ALLOC(CORBA_TypeCode);
+ if(tc==NULL) {
+ CORBA_exception_set_system(ev, ex_CORBA_NO_MEMORY, CORBA_COMPLETED_NO);
+ return(NULL);
+ }
+
+ tc->kind=CORBA_tk_string;
+ tc->length=bound;
+
+ return(tc);
+}
+
+CORBA_TypeCode CORBA_ORB_create_wstring_tc(CORBA_ORB obj, CORBA_unsigned_long bound, CORBA_Environment *ev)
+{
+ CORBA_TypeCode tc;
+
+ tc=ORBIT_CHUNK_ALLOC(CORBA_TypeCode);
+ if(tc==NULL) {
+ CORBA_exception_set_system(ev, ex_CORBA_NO_MEMORY, CORBA_COMPLETED_NO);
+ return(NULL);
+ }
+
+ tc->kind=CORBA_tk_wstring;
+ tc->length=bound;
+
+ return(tc);
+}
+
+CORBA_TypeCode CORBA_ORB_create_fixed_tc(CORBA_ORB obj, CORBA_unsigned_short digits, CORBA_short scale, CORBA_Environment *ev)
+{
+ CORBA_TypeCode tc;
+
+ tc=ORBIT_CHUNK_ALLOC(CORBA_TypeCode);
+ if(tc==NULL) {
+ CORBA_exception_set_system(ev, ex_CORBA_NO_MEMORY, CORBA_COMPLETED_NO);
+ return(NULL);
+ }
+
+ tc->kind=CORBA_tk_fixed;
+ tc->digits=digits;
+ tc->scale=scale;
+
+ return(tc);
+}
+
+CORBA_TypeCode CORBA_ORB_create_sequence_tc(CORBA_ORB obj, CORBA_unsigned_long bound, CORBA_TypeCode element_type, CORBA_Environment *ev)
+{
+ CORBA_TypeCode tc;
+
+ tc=ORBIT_CHUNK_ALLOC(CORBA_TypeCode);
+ if(tc==NULL)
+ goto tc_alloc_failed;
+
+ /* Can't use chunks here because we can only be sure of getting
+ one consecutive chunk from glib */
+ tc->subtypes=g_new0(CORBA_TypeCode, 1);
+ if(tc->subtypes==NULL)
+ goto subtypes_alloc_failed;
+
+ tc->kind=CORBA_tk_sequence;
+ tc->sub_parts=1;
+ tc->length=bound;
+
+ tc->subtypes[0] = ORBIT_CHUNK_ALLOC(CORBA_TypeCode);
+ memcpy(tc->subtypes[0], element_type,
+ (size_t)sizeof(struct CORBA_TypeCode_struct));
+
+ return(tc);
+
+ subtypes_alloc_failed:
+ ORBIT_CHUNK_FREE(CORBA_TypeCode, tc);
+ tc_alloc_failed:
+ CORBA_exception_set_system(ev, ex_CORBA_NO_MEMORY, CORBA_COMPLETED_NO);
+ return(NULL);
+}
+
+CORBA_TypeCode CORBA_ORB_create_recursive_sequence_tc(CORBA_ORB obj, CORBA_unsigned_long bound, CORBA_unsigned_long offset, CORBA_Environment *ev)
+{
+ CORBA_TypeCode tc;
+
+ tc=ORBIT_CHUNK_ALLOC(CORBA_TypeCode);
+ if(tc==NULL)
+ goto tc_alloc_failed;
+
+ tc->subtypes=g_new0(CORBA_TypeCode, 1);
+ if(tc->subtypes==NULL)
+ goto subtypes_alloc_failed;
+
+ tc->kind=CORBA_tk_sequence;
+ tc->sub_parts=1;
+ tc->length=bound;
+
+ tc->subtypes[0] = ORBIT_CHUNK_ALLOC(CORBA_TypeCode);
+ tc->subtypes[0]->kind=CORBA_tk_recursive;
+ tc->subtypes[0]->recurse_depth=offset;
+
+ return(tc);
+
+ subtypes_alloc_failed:
+ ORBIT_CHUNK_FREE(CORBA_TypeCode, tc);
+ tc_alloc_failed:
+ CORBA_exception_set_system(ev, ex_CORBA_NO_MEMORY, CORBA_COMPLETED_NO);
+ return(NULL);
+}
+
+CORBA_TypeCode CORBA_ORB_create_array_tc(CORBA_ORB obj, CORBA_unsigned_long length, CORBA_TypeCode element_type, CORBA_Environment *ev)
+{
+ CORBA_TypeCode tc;
+
+ tc=ORBIT_CHUNK_ALLOC(CORBA_TypeCode);
+ if(tc==NULL)
+ goto tc_alloc_failed;
+
+ tc->subtypes=g_new0(CORBA_TypeCode, 1);
+ if(tc->subtypes==NULL)
+ goto subtypes_alloc_failed;
+
+ tc->kind=CORBA_tk_array;
+ tc->sub_parts=1;
+ tc->length=length;
+
+ tc->subtypes[0] = ORBIT_CHUNK_ALLOC(CORBA_TypeCode);
+ memcpy(tc->subtypes[0], element_type, (size_t)sizeof(CORBA_TypeCode));
+
+ return(tc);
+
+ subtypes_alloc_failed:
+ ORBIT_CHUNK_FREE(CORBA_TypeCode, tc);
+ tc_alloc_failed:
+ CORBA_exception_set_system(ev, ex_CORBA_NO_MEMORY, CORBA_COMPLETED_NO);
+ return(NULL);
+}
+#endif /* !__KORBIT__ */
diff -urN linux-2.4.1/net/korbit/orb/orb.h linux-2.4.1-korbit/net/korbit/orb/orb.h
--- linux-2.4.1/net/korbit/orb/orb.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/orb.h Thu Feb 1 11:47:13 2001
@@ -0,0 +1,231 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#ifndef _ORBIT_ORB_H_
+#define _ORBIT_ORB_H_
+
+#include "orb/orbit_types.h"
+#ifndef __KORBIT__
+#include "orb/interface_repository.h"
+#endif /* !__KORBIT__ */
+
+extern CORBA_ORB CORBA_ORB_init(
+ int *argc,
+ char **argv,
+ CORBA_ORBid orb_identifier,
+ CORBA_Environment *ev);
+
+extern CORBA_char *CORBA_ORB_object_to_string(
+ CORBA_ORB orb,
+ CORBA_Object obj,
+ CORBA_Environment *ev);
+
+extern CORBA_Object CORBA_ORB_string_to_object(
+ CORBA_ORB orb,
+ CORBA_char *str,
+ CORBA_Environment *ev);
+
+extern CORBA_Status CORBA_ORB_get_default_context(
+ CORBA_ORB orb,
+ CORBA_Context *ctx,
+ CORBA_Environment *ev);
+
+extern CORBA_boolean CORBA_ORB_get_service_information(
+ CORBA_ORB orb,
+ CORBA_ServiceType service_type,
+ CORBA_ServiceInformation *service_information,
+ CORBA_Environment *ev);
+
+extern CORBA_Current *CORBA_ORB_get_current(
+ CORBA_ORB orb,
+ CORBA_Environment *ev);
+
+extern CORBA_ORB_ObjectIdList* CORBA_ORB_list_initial_services(
+ CORBA_ORB orb,
+ CORBA_Environment *ev);
+
+extern CORBA_Object CORBA_ORB_resolve_initial_references(
+ CORBA_ORB orb,
+ CORBA_ORB_ObjectId identifier,
+ CORBA_Environment *ev);
+
+extern void CORBA_ORB_set_initial_reference(
+ CORBA_ORB orb,
+ CORBA_ORB_ObjectId identifier,
+ CORBA_Object obj,
+ CORBA_Environment *ev);
+
+extern CORBA_boolean CORBA_ORB_work_pending(
+ CORBA_ORB orb,
+ CORBA_Environment *ev);
+
+extern void CORBA_ORB_perform_work(
+ CORBA_ORB orb,
+ CORBA_Environment *ev);
+
+extern void CORBA_ORB_shutdown(
+ CORBA_ORB orb,
+ CORBA_boolean wait_for_completion,
+ CORBA_Environment *ev);
+
+extern void CORBA_ORB_run(
+ CORBA_ORB orb,
+ CORBA_Environment *ev);
+
+extern CORBA_PolicyType CORBA_Policy__get_policy_type(
+ CORBA_Policy obj,
+ CORBA_Environment *ev);
+
+extern CORBA_Policy CORBA_Policy_copy(
+ CORBA_Policy obj,
+ CORBA_Environment *ev);
+
+extern void CORBA_Policy_destroy(
+ CORBA_Policy obj,
+ CORBA_Environment *ev);
+
+#ifndef __KORBIT__
+extern CORBA_InterfaceDef CORBA_Object_get_interface(
+ CORBA_Object obj,
+ CORBA_Environment *ev);
+#endif /* !__KORBIT__ */
+
+extern CORBA_boolean CORBA_Object_is_nil(
+ CORBA_Object obj,
+ CORBA_Environment *ev);
+
+extern CORBA_Object CORBA_Object_duplicate(
+ CORBA_Object obj,
+ CORBA_Environment *ev);
+
+extern void CORBA_Object_release(
+ CORBA_Object obj,
+ CORBA_Environment *ev);
+
+extern CORBA_boolean CORBA_Object_non_existent(
+ CORBA_Object obj,
+ CORBA_Environment *ev);
+
+extern CORBA_boolean CORBA_Object_is_equivalent(
+ CORBA_Object obj,
+ CORBA_Object other_object,
+ CORBA_Environment *ev);
+
+extern CORBA_unsigned_long CORBA_Object_hash(
+ CORBA_Object obj,
+ CORBA_unsigned_long maximum,
+ CORBA_Environment *ev);
+
+extern CORBA_Policy CORBA_Object_get_policy(
+ CORBA_Object obj,
+ CORBA_PolicyType policy_type,
+ CORBA_Environment *ev);
+
+#ifndef __KORBIT__
+extern CORBA_DomainManagerList *CORBA_Object_get_domain_managers(
+ CORBA_Object obj,
+ CORBA_Environment *ev);
+
+extern CORBA_Policy CORBA_DomainManager_get_domain_policy(
+ CORBA_DomainManager obj,
+ CORBA_PolicyType policy_type,
+ CORBA_Environment *ev);
+
+extern void CORBA_ConstructionPolicy_make_domain_manager(
+ CORBA_ConstructionPolicy obj,
+ CORBA_Object /*CORBA_InterfaceDef*/ object_type,
+ CORBA_boolean constr_policy,
+ CORBA_Environment *ev);
+
+CORBA_TypeCode CORBA_ORB_create_struct_tc(CORBA_ORB obj,
+ CORBA_RepositoryId id,
+ CORBA_Identifier name,
+ CORBA_StructMemberSeq members,
+ CORBA_Environment *ev);
+
+CORBA_TypeCode CORBA_ORB_create_union_tc(CORBA_ORB obj,
+ CORBA_RepositoryId id,
+ CORBA_Identifier name,
+ CORBA_TypeCode discriminator_type,
+ CORBA_UnionMemberSeq members,
+ CORBA_Environment *ev);
+
+CORBA_TypeCode CORBA_ORB_create_enum_tc(CORBA_ORB obj,
+ CORBA_RepositoryId id,
+ CORBA_Identifier name,
+ CORBA_EnumMemberSeq members,
+ CORBA_Environment *ev);
+
+CORBA_TypeCode CORBA_ORB_create_alias_tc(CORBA_ORB obj,
+ CORBA_RepositoryId id,
+ CORBA_Identifier name,
+ CORBA_TypeCode original_type,
+ CORBA_Environment *ev);
+
+CORBA_TypeCode CORBA_ORB_create_exception_tc(CORBA_ORB obj,
+ CORBA_RepositoryId id,
+ CORBA_Identifier name,
+ CORBA_StructMemberSeq members,
+ CORBA_Environment *ev);
+
+CORBA_TypeCode CORBA_ORB_create_interface_tc(CORBA_ORB obj,
+ CORBA_RepositoryId id,
+ CORBA_Identifier name,
+ CORBA_Environment *ev);
+
+CORBA_TypeCode CORBA_ORB_create_string_tc(CORBA_ORB obj,
+ CORBA_unsigned_long bound,
+ CORBA_Environment *ev);
+
+CORBA_TypeCode CORBA_ORB_create_wstring_tc(CORBA_ORB obj,
+ CORBA_unsigned_long bound,
+ CORBA_Environment *ev);
+
+CORBA_TypeCode CORBA_ORB_create_fixed_tc(CORBA_ORB obj,
+ CORBA_unsigned_short digits,
+ CORBA_short scale,
+ CORBA_Environment *ev);
+
+extern CORBA_TypeCode CORBA_ORB_create_sequence_tc(
+ CORBA_ORB obj,
+ CORBA_unsigned_long bound,
+ CORBA_TypeCode element_type,
+ CORBA_Environment *ev);
+
+extern CORBA_TypeCode CORBA_ORB_create_recursive_sequence_tc(
+ CORBA_ORB obj,
+ CORBA_unsigned_long bound,
+ CORBA_unsigned_long offset,
+ CORBA_Environment *ev);
+
+extern CORBA_TypeCode CORBA_ORB_create_array_tc(
+ CORBA_ORB obj,
+ CORBA_unsigned_long length,
+ CORBA_TypeCode element_type,
+ CORBA_Environment *ev);
+
+#endif /* !__KORBIT__ */
+
+#endif /* !_ORBIT_ORB_H_ */
diff -urN linux-2.4.1/net/korbit/orb/orbit.c linux-2.4.1-korbit/net/korbit/orb/orbit.c
--- linux-2.4.1/net/korbit/orb/orbit.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/orbit.c Thu Feb 1 11:47:13 2001
@@ -0,0 +1,387 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter and Red Hat Software
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+/*
+ * This file is a repository for random functions that don't fit anywhere
+ * else, and for ORBit-specific stuff.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <assert.h>
+#include <math.h>
+
+#include "orbit.h"
+
+const guint orbit_major_version = ORBIT_MAJOR_VERSION,
+ orbit_minor_version = ORBIT_MINOR_VERSION,
+ orbit_micro_version = ORBIT_MICRO_VERSION;
+const char orbit_version[] = ORBIT_VERSION;
+
+typedef struct ORBitClassInfo ORBitClassInfo;
+
+typedef void (*ORBitObjectInitFunc)(CORBA_Object _handle_to_be, gpointer class_data);
+
+struct ORBitClassInfo {
+ char *name;
+ gulong id;
+ gpointer method_stubs, method_skels;
+ ORBitObjectInitFunc class_vtable_init_func;
+ ORBitClassInfo **parent_classes;
+};
+
+GHashTable *orbit_class_list = NULL, *orbit_class_byid;
+glong class_id_counter = -1;
+
+void CORBA_any_set_release(CORBA_any *any, CORBA_boolean flag)
+{
+ g_assert(any!=NULL);
+
+ if(flag==CORBA_TRUE) {
+ any->_release |= CORBA_ANYFLAGS_RELEASE;
+ } else {
+ any->_release &= ~CORBA_ANYFLAGS_RELEASE;
+ }
+
+}
+
+CORBA_boolean CORBA_any_get_release(CORBA_any *any)
+{
+ g_assert(any!=NULL);
+
+ if(any->_release & CORBA_ANYFLAGS_RELEASE)
+ return(CORBA_TRUE);
+ else
+ return(CORBA_FALSE);
+}
+
+void CORBA_sequence_set_release(void *seq, CORBA_boolean flag)
+{
+ struct CORBA_Sequence_type *sequence;
+
+ g_assert(seq!=NULL);
+
+ sequence=(struct CORBA_Sequence_type *)seq;
+
+ if(flag==CORBA_TRUE) {
+ sequence->_release |= CORBA_ANYFLAGS_RELEASE;
+ } else {
+ sequence->_release &= ~CORBA_ANYFLAGS_RELEASE;
+ }
+}
+
+CORBA_boolean CORBA_sequence_get_release(void *seq)
+{
+ struct CORBA_Sequence_type *sequence;
+
+ g_assert(seq!=NULL);
+
+ sequence=(struct CORBA_Sequence_type *)seq;
+
+ if(sequence->_release & CORBA_ANYFLAGS_RELEASE)
+ return(CORBA_TRUE);
+ else
+ return(CORBA_FALSE);
+}
+
+/*
+ * As far as I understand, values returned by CORBA_*_alloc() are supposed to be
+ * freeable by CORBA_free(), so we can't use memory chunks here in any reasonable
+ * fashion.
+ */
+gpointer
+CORBA_any__free(gpointer mem, gpointer func_data, CORBA_boolean free_strings)
+{
+ CORBA_any *aval = mem;
+
+ if(aval->_release)
+ ORBit_free(aval->_value, free_strings);
+ CORBA_Object_release((CORBA_Object)aval->_type, NULL);
+
+ return aval + 1;
+}
+
+CORBA_any *CORBA_any_alloc(void)
+{
+ CORBA_any *retval = ORBit_alloc(sizeof(CORBA_any), &CORBA_any__free,
+ GINT_TO_POINTER(1));
+
+ memset(retval, 0, sizeof(CORBA_any)); /* Make things easier on stubs */
+
+ return retval;
+}
+
+/*
+ * Compares the typecodes of each any
+ */
+CORBA_boolean ORBit_any_equivalent(CORBA_any obj, CORBA_any any, CORBA_Environment *ev)
+{
+ return(CORBA_FALSE);
+}
+
+/* This is needed by skels, that generate a __free function when they see
+ the TypeCode interface */
+gpointer
+CORBA_TypeCode__free(gpointer mem, gpointer func_data, CORBA_boolean free_strings)
+{
+ CORBA_Object_release(*(CORBA_Object *)mem, NULL);
+ return ((guchar *)mem) + sizeof(CORBA_TypeCode);
+}
+
+CORBA_char *CORBA_string_dup(const CORBA_char *string)
+{
+ if(!string)
+ return NULL;
+
+ return strcpy(ORBit_alloc(strlen(string)+1, NULL, NULL), string);
+}
+
+CORBA_char *CORBA_string_alloc(CORBA_unsigned_long len)
+{
+ return ORBit_alloc(len + 1, NULL, NULL);
+}
+
+CORBA_wchar *CORBA_wstring_alloc(CORBA_unsigned_long len)
+{
+ return ORBit_alloc(len + 1, NULL, NULL);
+}
+
+gpointer
+CORBA_string__free(gpointer str, gpointer dat, CORBA_boolean free_strings)
+{
+ if(free_strings)
+ CORBA_free(*((gpointer *)str));
+ return (gpointer)((guchar *)str + sizeof(CORBA_char *));
+}
+
+gpointer CORBA_Object__free(gpointer str, gpointer dat, CORBA_boolean free_strings)
+{
+ CORBA_Environment ev;
+ CORBA_exception_init(&ev);
+ CORBA_Object_release(*((gpointer *)str), &ev);
+ CORBA_exception_free(&ev);
+ return (gpointer)((guchar *)str + sizeof(CORBA_Object));
+}
+
+/* 19.14 */
+
+/* The big picture for fixeds.
+ We have to represent a number in memory.
+
+ 1 2 3 . 4 5 6 7
+
+ There are three pieces of information in a fixed:
+
+ - Number of significant digits. (_digits)
+
+ - The scale. The number of places the decimal point is to the right
+ of the first significant digit. (_scale)
+
+ - The digits themselves (_value)
+
+ */
+CORBA_long CORBA_fixed_integer_part(const void *fp)
+{
+ CORBA_long retval = 0;
+ int i, power_of_ten, digit;
+ const CORBA_fixed_d_s *val = fp;
+
+ g_return_val_if_fail(fp != NULL, INT_MIN);
+
+ for(i = 0; i < (val->_digits - val->_scale); i++) {
+ power_of_ten = val->_digits - i - val->_scale - 1;
+ digit = val->_value[i];
+ retval += digit * ((int)pow(10, power_of_ten));
+ }
+
+ return retval;
+}
+
+CORBA_long CORBA_fixed_fraction_part(const void *fp)
+{
+ CORBA_long retval = 0;
+ int i, power_of_ten, digit;
+ const CORBA_fixed_d_s *val = fp;
+
+ g_return_val_if_fail(fp != NULL, INT_MIN);
+
+ for(i = val->_digits - val->_scale; i < val->_digits; i++){
+ power_of_ten = val->_digits - i - 1;
+ digit = val->_value[i];
+ retval += digit * ((int)pow(10, power_of_ten));
+ }
+
+ return retval;
+}
+
+static inline
+CORBA_long do_div (CORBA_long *n)
+{
+ int __res;
+
+ __res = (*n) % (unsigned) 10;
+ *n = (*n) / (unsigned) 10;
+
+ return __res;
+}
+
+void CORBA_fixed_set(void *rp, CORBA_long i, CORBA_long f)
+{
+ CORBA_fixed_d_s *val = rp;
+ CORBA_long left_to_eat, cur;
+ signed char sign = 1;
+
+ g_return_if_fail(rp != NULL);
+
+ memset(val->_value, 0, val->_digits);
+
+ if(i) sign = i/abs(i);
+ val->_sign = sign;
+ i = abs(i);
+ f = abs(f);
+
+ for(cur = 0, left_to_eat = i;
+ left_to_eat != 0 && cur < val->_digits; cur++) {
+ val->_value[cur] = do_div(&left_to_eat) * sign;
+ sign = 1;
+ }
+
+ val->_scale = cur - 1;
+
+ for(left_to_eat = f;
+ left_to_eat != 0 && cur < val->_digits; cur++) {
+ val->_value[cur] = do_div(&left_to_eat);
+ }
+}
+
+void CORBA_fixed_add(void *rp, const void *f1p, const void *f2p)
+{
+ g_assert(!"Not yet implemented");
+}
+
+void CORBA_fixed_sub(void *rp, const void *f1p, const void *f2p)
+{
+ g_assert(!"Not yet implemented");
+}
+
+void CORBA_fixed_mul(void *rp, const void *f1p, const void *f2p)
+{
+ g_assert(!"Not yet implemented");
+}
+
+void CORBA_fixed_div(void *rp, const void *f1p, const void *f2p)
+{
+ g_assert(!"Not yet implemented");
+}
+
+CORBA_fixed_d_s *CORBA_fixed_alloc(CORBA_unsigned_short d)
+{
+ return (CORBA_fixed_d_s *)
+ g_malloc(sizeof(CORBA_fixed_d_s) + d + 1);
+}
+
+void CORBA_free(void *storage)
+{
+ ORBit_free(storage, CORBA_TRUE);
+}
+
+int ORBit_parse_unixsock(CORBA_Object obj,
+ char *sockpath,
+ gboolean existing_only)
+{
+ if(!sockpath || !*sockpath)
+ return -1;
+
+ obj->connection =
+ GIOP_CONNECTION(iiop_connection_unix_get(sockpath,
+ existing_only));
+
+ if(!obj->connection)
+ return -1;
+
+ giop_connection_ref(obj->connection);
+ return 0;
+}
+
+int ORBit_parse_inet(CORBA_Object obj, char *hostname, unsigned short port,
+ gboolean existing_only)
+{
+ obj->connection = GIOP_CONNECTION(iiop_connection_get(hostname, port, existing_only));
+
+ if(!obj->connection)
+ return -1;
+ giop_connection_ref(obj->connection);
+ return 0;
+}
+
+static const CORBA_unsigned_long zero_int = 0;
+struct iovec ORBit_default_principal_iovec = {(gpointer)&zero_int, sizeof(zero_int)};
+
+void ORBit_set_default_principal(CORBA_Principal *principal)
+{
+ gpointer t;
+
+ if((gpointer)ORBit_default_principal_iovec.iov_base != (gpointer)&zero_int)
+ g_free(ORBit_default_principal_iovec.iov_base);
+
+ ORBit_default_principal_iovec.iov_len = principal->_length
+ + sizeof(CORBA_unsigned_long);
+
+ t = ORBit_default_principal_iovec.iov_base =
+ g_malloc(ORBit_default_principal_iovec.iov_len);
+
+ memcpy(t, &principal->_length, sizeof(principal->_length));
+
+ t = ((guchar *)t) + sizeof(principal->_length);
+ memcpy(t, principal->_buffer, principal->_length);
+}
+
+CORBA_unsigned_long ORBit_class_assignment_counter = 0;
+GHashTable *ORBit_class_assignments = NULL;
+
+/* XXX not thread-safe */
+CORBA_unsigned_long
+ORBit_register_class(const PortableServer_ClassInfo *class_info)
+{
+ CORBA_unsigned_long retval;
+
+ if(!ORBit_class_assignments)
+ ORBit_class_assignments = g_hash_table_new(g_str_hash, g_str_equal);
+
+ /* This needs to be pre-increment - we don't want to give out
+ classid 0, because (a) that is reserved for the base Object class
+ (b) all the routines allocate a new id if the variable
+ storing their ID == 0 */
+ retval = ++ORBit_class_assignment_counter;
+
+ g_hash_table_insert(ORBit_class_assignments, (gpointer)class_info->class_name,
+ GINT_TO_POINTER(retval));
+
+ return retval;
+}
diff -urN linux-2.4.1/net/korbit/orb/orbit.h linux-2.4.1-korbit/net/korbit/orb/orbit.h
--- linux-2.4.1/net/korbit/orb/orbit.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/orbit.h Thu Feb 1 11:47:13 2001
@@ -0,0 +1,207 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@acm.org>
+ * Elliot Lee <sopwith@redhat.com>
+ *
+ */
+
+/* these two blocks are outside of the main header for good reason...
+ People may include headers from many different stubs, and we want to
+ have the version checked on all of them.
+ */
+#ifndef ORBIT_SERIAL
+#define ORBIT_SERIAL 9
+#endif
+
+#ifdef ORBIT_IDL_SERIAL
+#if ORBIT_IDL_SERIAL < 9
+#error "You need to rerun 'orbit-idl' on the .idl file whose stubs you are using. These stubs were generated with an older version of ORBit, and need to be regenerated."
+#endif
+#endif
+
+#ifndef _ORBIT_H_
+#define _ORBIT_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include <glib.h>
+
+#define BACKWARDS_COMPAT_0_4
+#undef NOT_BACKWARDS_COMPAT_0_4
+
+#include <sys/types.h>
+#include <sys/uio.h>
+#include <IIOP/IIOP.h>
+#include <ORBitutil/util.h>
+#include <orb/orbit_config.h>
+#include <orb/orbit_types.h>
+#include <orb/allocators.h>
+#include <orb/cdr.h>
+#include <orb/dii.h>
+#ifndef __KORBIT__
+#include <orb/dynany.h>
+#endif
+#include <orb/env.h>
+#include <orb/iop.h>
+#include <orb/ir.h>
+#include <orb/options.h>
+#include <orb/orb.h>
+#include <orb/poa.h>
+#include <orb/sequences.h>
+#include <orb/orbit_typecode.h>
+#include <orb/typecode.h>
+
+#ifndef ORBIT_MAJOR_VERSION
+#define ORBIT_MAJOR_VERSION (0)
+#define ORBIT_MINOR_VERSION (5)
+#define ORBIT_MICRO_VERSION (3)
+#endif
+
+extern const guint orbit_major_version,
+ orbit_minor_version,
+ orbit_micro_version;
+extern const char orbit_version[];
+
+extern void CORBA_any_set_release(
+ CORBA_any *,
+ CORBA_boolean);
+
+extern CORBA_boolean CORBA_any_get_release(
+ CORBA_any *);
+
+extern void CORBA_sequence_set_release(
+ void *,
+ CORBA_boolean);
+
+extern CORBA_boolean CORBA_sequence_get_release(
+ void *);
+
+#define CORBA_any__alloc CORBA_any_alloc
+extern CORBA_any *CORBA_any_alloc(
+ void);
+
+extern gpointer CORBA_any__free(gpointer mem, gpointer func_data,
+ CORBA_boolean free_strings);
+extern gpointer CORBA_TypeCode__free(gpointer mem, gpointer func_data,
+ CORBA_boolean free_strings);
+
+extern CORBA_boolean ORBit_any_equivalent(
+ CORBA_any obj,
+ CORBA_any any,
+ CORBA_Environment *ev);
+
+extern CORBA_char *CORBA_string_dup(const CORBA_char *string);
+extern CORBA_char *CORBA_string_alloc(CORBA_unsigned_long len);
+extern gpointer CORBA_string__free(gpointer str, gpointer dat, CORBA_boolean free_strings);
+
+gpointer CORBA_Object__free(gpointer str, gpointer dat, CORBA_boolean free_strings);
+
+extern CORBA_wchar *CORBA_wstring_alloc(CORBA_unsigned_long len);
+#define CORBA_wstring_free CORBA_string_free
+
+/* 19.14 */
+extern CORBA_long CORBA_fixed_integer_part(
+ const void *fp);
+
+extern CORBA_long CORBA_fixed_fraction_part(
+ const void *fp);
+
+extern void CORBA_fixed_set(
+ void *rp,
+ CORBA_long i,
+ CORBA_long f);
+
+extern void CORBA_fixed_add(
+ void *rp,
+ const void *f1p,
+ const void *f2p);
+
+extern void CORBA_fixed_sub(
+ void *rp,
+ const void *f1p,
+ const void *f2p);
+
+extern void CORBA_fixed_mul(
+ void *rp,
+ const void *f1p,
+ const void *f2p);
+
+extern void CORBA_fixed_div(
+ void *rp,
+ const void *f1p,
+ const void *f2p);
+
+extern CORBA_fixed_d_s *CORBA_fixed_alloc(
+ CORBA_unsigned_short d);
+
+extern void CORBA_free(
+ void *storage);
+
+extern int ORBit_parse_inet(
+ CORBA_Object obj,
+ char *hostname,
+ unsigned short port,
+ gboolean existing_only);
+
+extern int ORBit_parse_unixsock(CORBA_Object obj,
+ char *sockpath,
+ gboolean existing_only);
+
+/****
+ This function lets you use your own event loop, if you so wish.
+ Also see IIOP.h's IIOP{Add,Remove}ConnectionHandler function pointers,
+ which are app-settable (you should set them before CORBA_ORB_init,
+ if you want them to be useful)
+ ****/
+
+ /* needs to be called by your event loop when data comes in on one of the
+ GIOPConnection fd's */
+void ORBit_custom_run_setup(CORBA_ORB orb, CORBA_Environment *ev);
+ void ORBit_handle_incoming(GIOPConnection *connection);
+
+/* Returns CORBA_TRUE if the request is OK to proceed. */
+typedef enum {
+ ORBIT_MESSAGE_BAD,
+ ORBIT_MESSAGE_ALLOW,
+ ORBIT_MESSAGE_ALLOW_ALL /* Allow all subsequent messages on
+ this connection with no checking */
+} ORBit_MessageValidationResult;
+typedef ORBit_MessageValidationResult (*ORBit_request_validate)
+ (CORBA_unsigned_long request_id,
+ CORBA_Principal *principal,
+ CORBA_char *operation);
+void ORBit_set_request_validation_handler(ORBit_request_validate validator);
+
+extern struct iovec ORBit_default_principal_iovec;
+void ORBit_set_default_principal(CORBA_Principal *principal);
+
+extern CORBA_unsigned_long ORBit_class_assignment_counter;
+
+CORBA_unsigned_long ORBit_register_class(const PortableServer_ClassInfo *class_info);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* !_ORBIT_H_ */
diff -urN linux-2.4.1/net/korbit/orb/orbit.h.in linux-2.4.1-korbit/net/korbit/orb/orbit.h.in
--- linux-2.4.1/net/korbit/orb/orbit.h.in Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/orbit.h.in Thu Feb 1 11:47:13 2001
@@ -0,0 +1,205 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@acm.org>
+ * Elliot Lee <sopwith@redhat.com>
+ *
+ */
+
+/* these two blocks are outside of the main header for good reason...
+ People may include headers from many different stubs, and we want to
+ have the version checked on all of them.
+ */
+#ifndef ORBIT_SERIAL
+#define ORBIT_SERIAL @ORBIT_SERIAL@
+#endif
+
+#ifdef ORBIT_IDL_SERIAL
+#if ORBIT_IDL_SERIAL < @ORBIT_SERIAL@
+#error "You need to rerun 'orbit-idl' on the .idl file whose stubs you are using. These stubs were generated with an older version of ORBit, and need to be regenerated."
+#endif
+#endif
+
+#ifndef _ORBIT_H_
+#define _ORBIT_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include <glib.h>
+
+#define BACKWARDS_COMPAT_0_4
+#undef NOT_BACKWARDS_COMPAT_0_4
+
+#include <sys/types.h>
+#include <sys/uio.h>
+#include <IIOP/IIOP.h>
+#include <ORBitutil/util.h>
+#include <orb/orbit_config.h>
+#include <orb/orbit_types.h>
+#include <orb/allocators.h>
+#include <orb/cdr.h>
+#include <orb/dii.h>
+#include <orb/dynany.h>
+#include <orb/env.h>
+#include <orb/iop.h>
+#include <orb/ir.h>
+#include <orb/options.h>
+#include <orb/orb.h>
+#include <orb/poa.h>
+#include <orb/sequences.h>
+#include <orb/orbit_typecode.h>
+#include <orb/typecode.h>
+
+#ifndef ORBIT_MAJOR_VERSION
+#define ORBIT_MAJOR_VERSION (@ORBIT_MAJOR_VERSION@)
+#define ORBIT_MINOR_VERSION (@ORBIT_MINOR_VERSION@)
+#define ORBIT_MICRO_VERSION (@ORBIT_MICRO_VERSION@)
+#endif
+
+extern const guint orbit_major_version,
+ orbit_minor_version,
+ orbit_micro_version;
+extern const char orbit_version[];
+
+extern void CORBA_any_set_release(
+ CORBA_any *,
+ CORBA_boolean);
+
+extern CORBA_boolean CORBA_any_get_release(
+ CORBA_any *);
+
+extern void CORBA_sequence_set_release(
+ void *,
+ CORBA_boolean);
+
+extern CORBA_boolean CORBA_sequence_get_release(
+ void *);
+
+#define CORBA_any__alloc CORBA_any_alloc
+extern CORBA_any *CORBA_any_alloc(
+ void);
+
+extern gpointer CORBA_any__free(gpointer mem, gpointer func_data,
+ CORBA_boolean free_strings);
+extern gpointer CORBA_TypeCode__free(gpointer mem, gpointer func_data,
+ CORBA_boolean free_strings);
+
+extern CORBA_boolean ORBit_any_equivalent(
+ CORBA_any obj,
+ CORBA_any any,
+ CORBA_Environment *ev);
+
+extern CORBA_char *CORBA_string_dup(const CORBA_char *string);
+extern CORBA_char *CORBA_string_alloc(CORBA_unsigned_long len);
+extern gpointer CORBA_string__free(gpointer str, gpointer dat, CORBA_boolean free_strings);
+
+gpointer CORBA_Object__free(gpointer str, gpointer dat, CORBA_boolean free_strings);
+
+extern CORBA_wchar *CORBA_wstring_alloc(CORBA_unsigned_long len);
+#define CORBA_wstring_free CORBA_string_free
+
+/* 19.14 */
+extern CORBA_long CORBA_fixed_integer_part(
+ const void *fp);
+
+extern CORBA_long CORBA_fixed_fraction_part(
+ const void *fp);
+
+extern void CORBA_fixed_set(
+ void *rp,
+ CORBA_long i,
+ CORBA_long f);
+
+extern void CORBA_fixed_add(
+ void *rp,
+ const void *f1p,
+ const void *f2p);
+
+extern void CORBA_fixed_sub(
+ void *rp,
+ const void *f1p,
+ const void *f2p);
+
+extern void CORBA_fixed_mul(
+ void *rp,
+ const void *f1p,
+ const void *f2p);
+
+extern void CORBA_fixed_div(
+ void *rp,
+ const void *f1p,
+ const void *f2p);
+
+extern CORBA_fixed_d_s *CORBA_fixed_alloc(
+ CORBA_unsigned_short d);
+
+extern void CORBA_free(
+ void *storage);
+
+extern int ORBit_parse_inet(
+ CORBA_Object obj,
+ char *hostname,
+ unsigned short port,
+ gboolean existing_only);
+
+extern int ORBit_parse_unixsock(CORBA_Object obj,
+ char *sockpath,
+ gboolean existing_only);
+
+/****
+ This function lets you use your own event loop, if you so wish.
+ Also see IIOP.h's IIOP{Add,Remove}ConnectionHandler function pointers,
+ which are app-settable (you should set them before CORBA_ORB_init,
+ if you want them to be useful)
+ ****/
+
+ /* needs to be called by your event loop when data comes in on one of the
+ GIOPConnection fd's */
+void ORBit_custom_run_setup(CORBA_ORB orb, CORBA_Environment *ev);
+ void ORBit_handle_incoming(GIOPConnection *connection);
+
+/* Returns CORBA_TRUE if the request is OK to proceed. */
+typedef enum {
+ ORBIT_MESSAGE_BAD,
+ ORBIT_MESSAGE_ALLOW,
+ ORBIT_MESSAGE_ALLOW_ALL /* Allow all subsequent messages on
+ this connection with no checking */
+} ORBit_MessageValidationResult;
+typedef ORBit_MessageValidationResult (*ORBit_request_validate)
+ (CORBA_unsigned_long request_id,
+ CORBA_Principal *principal,
+ CORBA_char *operation);
+void ORBit_set_request_validation_handler(ORBit_request_validate validator);
+
+extern struct iovec ORBit_default_principal_iovec;
+void ORBit_set_default_principal(CORBA_Principal *principal);
+
+extern CORBA_unsigned_long ORBit_class_assignment_counter;
+
+CORBA_unsigned_long ORBit_register_class(const PortableServer_ClassInfo *class_info);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* !_ORBIT_H_ */
diff -urN linux-2.4.1/net/korbit/orb/orbit_config.h linux-2.4.1-korbit/net/korbit/orb/orbit_config.h
--- linux-2.4.1/net/korbit/orb/orbit_config.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/orbit_config.h Thu Feb 1 11:47:13 2001
@@ -0,0 +1,9 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+#ifndef ORB_CONFIG_H
+#define ORB_CONFIG_H 1
+
+/* When creating a memory pool for a particular type, how many chunks
+ do we want to pre-allocated? */
+#define ORBIT_CHUNKS_PREALLOC 2
+
+#endif /* ORB_CONFIG_H */
diff -urN linux-2.4.1/net/korbit/orb/orbit_object.c linux-2.4.1-korbit/net/korbit/orb/orbit_object.c
--- linux-2.4.1/net/korbit/orb/orbit_object.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/orbit_object.c Thu Feb 1 11:47:13 2001
@@ -0,0 +1,699 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter and Red Hat Software
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Phil Dawes <philipd@parallax.co.uk>
+ * Elliot Lee <sopwith@redhat.com>
+ *
+ */
+
+/*
+ * ORBit specific CORBA_Object functions.
+ *
+ */
+
+#include <string.h>
+#include "config.h"
+#include "../IIOP/iiop-endianP.h"
+#include "orbit_object_type.h"
+#include "corba_object_type.h"
+#include "allocators.h"
+#include "iop.h"
+#include <IIOP/IIOP.h>
+
+static void ORBit_object_try_existing_connections(CORBA_Object obj);
+static void CORBA_Object_release_fn(CORBA_Object obj, CORBA_Environment *ev);
+
+static ORBit_RootObject_Interface CORBA_Object_epv =
+{
+ (void (*)(gpointer, CORBA_Environment *))CORBA_Object_release_fn,
+};
+
+void ORBit_pseudo_object_init(ORBit_PseudoObject obj,
+ ORBit_PseudoObject_type obj_type,
+ CORBA_Environment *ev)
+{
+ ORBIT_ROOT_OBJECT(obj)->is_pseudo_object = TRUE;
+ ORBIT_ROOT_OBJECT(obj)->refs = 0;
+ ORBIT_PSEUDO_OBJECT(obj)->pseudo_object_type = obj_type;
+}
+
+static const ORBit_RootObject_Interface CORBA_Policy__epv =
+{
+ (void (*)(gpointer, CORBA_Environment *))CORBA_Policy_destroy
+};
+
+void ORBit_policy_object_init(CORBA_Policy obj,
+ CORBA_PolicyType obj_type,
+ CORBA_Environment *ev)
+{
+ ORBit_pseudo_object_init(ORBIT_PSEUDO_OBJECT(obj),
+ ORBIT_PSEUDO_POLICY, ev);
+
+ obj->policy_type = obj_type;
+
+ ORBit_RootObject_set_interface(ORBIT_ROOT_OBJECT(obj),
+ (gpointer)&CORBA_Policy__epv,
+ ev);
+}
+
+void ORBit_object_reference_init(CORBA_Object obj, CORBA_Environment *ev)
+{
+ /* set the interface up */
+ ORBit_RootObject_set_interface(ORBIT_ROOT_OBJECT(obj),&CORBA_Object_epv,ev);
+ /* initialise the reference count */
+ ORBIT_ROOT_OBJECT(obj)->refs = 0;
+ ORBIT_ROOT_OBJECT(obj)->is_pseudo_object = FALSE;
+}
+
+CORBA_Object
+ORBit_CORBA_Object_new(CORBA_Environment *ev)
+{
+ CORBA_Object obj;
+ /* Create the object */
+ obj = ORBIT_CHUNK_ALLOC(CORBA_Object);
+ memset(obj, '\0', sizeof(struct CORBA_Object_struct));
+
+ ORBit_object_reference_init(obj, ev);
+
+ return obj;
+
+}
+
+void
+ORBit_set_object_key(ORBit_Object_info *info)
+{
+ g_assert(info);
+
+ g_assert(info->object_key._length);
+
+ info->object_key_data = g_malloc(sizeof(CORBA_unsigned_long) + info->object_key._length);
+ info->object_key_data->_length = info->object_key._length;
+ memcpy(info->object_key_data->_buffer, info->object_key._buffer, info->object_key._length);
+
+ info->object_key_vec.iov_base =
+ (gpointer)info->object_key_data;
+ info->object_key_vec.iov_len = sizeof(CORBA_unsigned_long) + info->object_key._length;
+}
+
+static void ORBit_free_profile(gpointer item, gpointer data)
+{
+ ORBit_Object_info *info=(ORBit_Object_info *)item;
+
+ g_assert(info);
+
+ g_free(info->object_key_data);
+ CORBA_free(info->object_key._buffer);
+
+ if(info->profile_type == IOP_TAG_INTERNET_IOP) {
+ g_free(info->tag.iopinfo.host);
+ } else if(info->profile_type == IOP_TAG_ORBIT_SPECIFIC) {
+ g_free(info->tag.orbitinfo.unix_sock_path);
+ } else {
+ g_warning("ORBit_free_profile asked to free type %d", info->profile_type);
+ }
+
+ g_free(info); /* Check its safe to free the item within a foreach func */
+}
+
+void ORBit_delete_profiles(GSList *profile_list)
+{
+ g_slist_foreach(profile_list, ORBit_free_profile, NULL);
+ g_slist_free(profile_list);
+}
+
+/* this function is wired up to the RootObject interface */
+void
+CORBA_Object_release_fn(CORBA_Object obj, CORBA_Environment *ev)
+{
+
+ g_assert(obj!=NULL);
+
+ ORBIT_ROOT_OBJECT_UNREF(obj);
+
+ if(ORBIT_ROOT_OBJECT(obj)->refs <= 0) {
+ g_hash_table_remove(obj->orb->objrefs, obj);
+
+ if(obj->connection)
+ giop_connection_unref(obj->connection);
+
+ g_free(obj->object_id);
+ ORBit_delete_profiles(obj->profile_list);
+ ORBit_delete_profiles(obj->forward_locations);
+
+ ORBIT_CHUNK_FREE(CORBA_Object, obj);
+ }
+}
+
+
+/* Sets the interface member in the RootObject to the epv specified*/
+void
+ORBit_RootObject_set_interface(ORBit_RootObject obj,
+ ORBit_RootObject_Interface* epv,
+ CORBA_Environment *ev)
+{
+ g_assert(obj!=NULL);
+ g_assert(epv!=NULL);
+
+ obj->interface = epv;
+}
+
+#define GET_ATOM(x) G_STMT_START{ GIOP_RECV_BUFFER(recv_buffer)->decoder(&x, (GIOP_RECV_BUFFER(recv_buffer)->cur), sizeof(x)); \
+GIOP_RECV_BUFFER(recv_buffer)->cur = ((guchar *)GIOP_RECV_BUFFER(recv_buffer)->cur) + sizeof(x); \
+}G_STMT_END
+#define ALIGNFOR(x) recv_buffer->cur = ALIGN_ADDRESS(recv_buffer->cur, sizeof(x))
+
+CORBA_Object
+ORBit_create_object_with_info(GSList *profiles,
+ const CORBA_char *type_id,
+ CORBA_ORB orb,
+ CORBA_Environment *ev)
+{
+ CORBA_Object new;
+ struct CORBA_Object_struct refcheck;
+
+ if(!type_id || !*type_id) {
+ g_warning("Failing object creation because object has no type");
+ CORBA_exception_set_system(ev, ex_CORBA_MARSHAL,
+ CORBA_COMPLETED_MAYBE);
+ return CORBA_OBJECT_NIL;
+ }
+
+ if(g_slist_length(profiles) < 1) {
+ g_warning("Failing object creation because object has no profiles");
+ CORBA_exception_set_system(ev, ex_CORBA_MARSHAL,
+ CORBA_COMPLETED_MAYBE);
+ return CORBA_OBJECT_NIL;
+ }
+
+ /* XXX badhack :) */
+ refcheck.object_id = type_id;
+ refcheck.profile_list = profiles;
+
+ new = g_hash_table_lookup(orb->objrefs, &refcheck);
+ if(new) {
+ ORBit_delete_profiles(profiles);
+ return CORBA_Object_duplicate(new, ev);
+ }
+
+ new = ORBit_CORBA_Object_new(ev);
+ new->connection = NULL;
+ new->object_id = g_strdup(type_id);
+ new->orb = (CORBA_ORB)CORBA_Object_duplicate((CORBA_Object)orb, ev);
+ new->profile_list = profiles;
+ new->active_profile = NULL;
+
+ ORBit_object_try_existing_connections(new);
+
+ g_hash_table_insert(orb->objrefs, new, new);
+
+ return CORBA_Object_duplicate(new, ev);
+}
+
+static ORBit_Object_info *
+ORBit_demarshal_profile(GIOPRecvBuffer *recv_buffer, IOP_ProfileId profile_id)
+{
+ ORBit_Object_info *object_info;
+ CORBA_unsigned_long subpart_len;
+ CORBA_octet o;
+ CDR_Codec codec_d;
+ CDR_Codec *codec=&codec_d;
+
+ object_info = g_new0(ORBit_Object_info, 1);
+
+ switch(profile_id) {
+ case IOP_TAG_INTERNET_IOP:
+ GET_ATOM(subpart_len); /* The length of the embedded sequence */
+ CDR_codec_init_static(codec);
+ codec->buffer = recv_buffer->cur;
+ codec->release_buffer = CORBA_FALSE;
+ recv_buffer->cur = ((guchar *)recv_buffer->cur) + subpart_len;
+
+ codec->readonly = CORBA_TRUE;
+ codec->host_endian = codec->data_endian = FLAG_ENDIANNESS;
+ codec->buf_len = subpart_len;
+
+ CDR_get_octet(codec, &o);
+ codec->data_endian = o;
+
+ object_info->profile_type = IOP_TAG_INTERNET_IOP;
+ CDR_get_octet(codec, &object_info->iiop_major);
+
+ if(object_info->iiop_major != 1)
+ goto error_exit;
+ /* XXX should we check for a specific minor version? */
+ CDR_get_octet(codec, &object_info->iiop_minor);
+
+ CDR_get_string(codec, &object_info->tag.iopinfo.host);
+
+ CDR_get_ushort(codec, &object_info->tag.iopinfo.port);
+
+ CDR_get_seq_begin(codec, &object_info->object_key._length);
+ object_info->object_key._buffer =
+ ORBit_alloc(object_info->object_key._length, NULL, NULL);
+ CDR_buffer_gets(codec, object_info->object_key._buffer,
+ object_info->object_key._length);
+ object_info->object_key._maximum = object_info->object_key._release = 0;
+
+ ORBit_set_object_key(object_info);
+
+ return(object_info);
+ break;
+
+ case IOP_TAG_MULTIPLE_COMPONENTS:
+ default:
+ GET_ATOM(subpart_len);
+ g_warning("IOP_TAG_MULTIPLE_COMPONENTS decoding needs finishing");
+ object_info->profile_type = IOP_TAG_MULTIPLE_COMPONENTS;
+ recv_buffer->cur = ((guchar *)recv_buffer->cur) + subpart_len;
+ return(object_info);
+ break;
+
+ case IOP_TAG_ORBIT_SPECIFIC:
+ GET_ATOM(subpart_len);
+ CDR_codec_init_static(codec);
+ codec->buffer = recv_buffer->cur;
+ codec->release_buffer = CORBA_FALSE;
+ recv_buffer->cur = ((guchar *)recv_buffer->cur) + subpart_len;
+
+ codec->readonly = CORBA_TRUE;
+ codec->host_endian = codec->data_endian = FLAG_ENDIANNESS;
+ codec->buf_len = subpart_len;
+
+ CDR_get_octet(codec, &o);
+ codec->data_endian = o;
+
+ object_info->profile_type = IOP_TAG_ORBIT_SPECIFIC;
+ CDR_get_octet(codec, &object_info->iiop_major);
+
+ if(object_info->iiop_major != 1)
+ goto error_exit;
+ /* XXX should we check for a specific minor version? */
+ CDR_get_octet(codec, &object_info->iiop_minor);
+
+ CDR_get_string(codec, &object_info->tag.orbitinfo.unix_sock_path);
+ CDR_get_ushort(codec, &object_info->tag.orbitinfo.ipv6_port);
+
+ CDR_get_seq_begin(codec, &object_info->object_key._length);
+ object_info->object_key._buffer =
+ ORBit_alloc(object_info->object_key._length, NULL, NULL);
+ CDR_buffer_gets(codec, object_info->object_key._buffer,
+ object_info->object_key._length);
+ object_info->object_key._maximum = object_info->object_key._release = 0;
+
+ ORBit_set_object_key(object_info);
+
+ return(object_info);
+ break;
+ }
+
+error_exit:
+ g_message("demarshal_profile(): IIOP major is %d",
+ object_info->iiop_major);
+ g_free(object_info);
+
+ return(NULL);
+}
+
+GSList *ORBit_demarshal_IOR(GIOPRecvBuffer *recv_buffer)
+{
+ GSList *profiles=NULL;
+ ORBit_Object_info *object_info;
+ CORBA_unsigned_long len, seq_len;
+ IOP_ProfileId profile_id;
+ int i;
+
+ /* Get type_id */
+ ALIGNFOR(CORBA_unsigned_long);
+ GET_ATOM(len);
+
+ if(len == 0)
+ return(NULL);
+
+ recv_buffer->cur = ((guchar *)recv_buffer->cur) + len;
+
+ /* Decode the sequence<TaggedProfile> */
+ ALIGNFOR(CORBA_unsigned_long);
+ GET_ATOM(seq_len);
+ for(i = 0; i < seq_len; i++) {
+ ALIGNFOR(CORBA_unsigned_long);
+ GET_ATOM(profile_id);
+ object_info=ORBit_demarshal_profile(recv_buffer, profile_id);
+ if(object_info==NULL) {
+ goto error_exit;
+ } else {
+ profiles=g_slist_append(profiles, object_info);
+ }
+ }
+
+ return(profiles);
+
+error_exit:
+ ORBit_delete_profiles(profiles);
+ return(NULL);
+}
+
+CORBA_Object
+ORBit_demarshal_object(GIOPRecvBuffer *recv_buffer, CORBA_ORB orb)
+{
+ GSList *profiles=NULL;
+ ORBit_Object_info *object_info;
+ CORBA_char *type_id;
+ CORBA_unsigned_long len, seq_len;
+ IOP_ProfileId profile_id;
+ int i;
+ CORBA_Environment ev;
+ CORBA_Object retval;
+
+ CORBA_exception_init(&ev);
+
+ /* Get type_id */
+ ALIGNFOR(CORBA_unsigned_long);
+ GET_ATOM(len);
+
+ type_id = recv_buffer->cur;
+ recv_buffer->cur = ((guchar *)recv_buffer->cur) + len;
+
+ /* Decode the sequence<TaggedProfile> */
+ ALIGNFOR(CORBA_unsigned_long);
+ GET_ATOM(seq_len);
+
+ if(!seq_len)
+ return CORBA_OBJECT_NIL;
+
+ for(i = 0; i < seq_len; i++) {
+ ALIGNFOR(CORBA_unsigned_long);
+ GET_ATOM(profile_id);
+ object_info=ORBit_demarshal_profile(recv_buffer, profile_id);
+ if(object_info)
+ profiles=g_slist_append(profiles, object_info);
+ }
+
+ if(!profiles)
+ goto error_exit;
+
+ retval = ORBit_create_object_with_info(profiles, type_id, orb, &ev);
+
+ return retval;
+
+ error_exit:
+ ORBit_delete_profiles(profiles);
+
+ CORBA_exception_set_system(&ev, ex_CORBA_MARSHAL,
+ CORBA_COMPLETED_MAYBE);
+ return CORBA_OBJECT_NIL;
+}
+
+static void ORBit_marshal_profile(gpointer item, gpointer data)
+{
+ ORBit_Object_info *info = (ORBit_Object_info *)item;
+ GIOPSendBuffer *send_buffer = (GIOPSendBuffer *)data;
+ static const CORBA_unsigned_long ioptag = IOP_TAG_INTERNET_IOP,
+ orbittag = IOP_TAG_ORBIT_SPECIFIC;
+ CDR_Codec codec_d;
+ CDR_Codec *codec = &codec_d;
+ CORBA_unsigned_long len;
+ CORBA_octet codecbuf[2048];
+ static const CORBA_octet oc_endian = FLAG_ENDIANNESS;
+ static const CORBA_octet iiopversion[] = {1,0};
+
+ g_assert(info);
+ g_assert(send_buffer);
+
+ if(info->profile_type == IOP_TAG_INTERNET_IOP) {
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(send_buffer),
+ &ioptag, sizeof(ioptag));
+
+ CDR_codec_init_static(codec);
+ codec->buffer = codecbuf;
+ codec->buf_len = 2048;
+ codec->release_buffer = CORBA_FALSE;
+ codec->readonly = CORBA_FALSE;
+ codec->data_endian = codec->host_endian = FLAG_ENDIANNESS;
+ CDR_put_octet(codec, oc_endian);
+ CDR_put_octet(codec, iiopversion[0]);
+ CDR_put_octet(codec, iiopversion[1]);
+ CDR_put_string(codec, info->tag.iopinfo.host);
+ CDR_put_ushort(codec, info->tag.iopinfo.port);
+ CDR_put_ulong(codec, info->object_key._length);
+ CDR_put_octets(codec, info->object_key._buffer,
+ info->object_key._length);
+ len = codec->wptr;
+ giop_send_buffer_append_mem_indirect_a(send_buffer,
+ &len, sizeof(len));
+ giop_send_buffer_append_mem_indirect(send_buffer,
+ codec->buffer, codec->wptr);
+ } else if(info->profile_type==IOP_TAG_ORBIT_SPECIFIC) {
+ giop_message_buffer_append_mem_a(GIOP_MESSAGE_BUFFER(send_buffer),
+ &orbittag, sizeof(orbittag));
+ CDR_codec_init_static(codec);
+ codec->buffer = codecbuf;
+ codec->release_buffer = CORBA_FALSE;
+ codec->buf_len = 2048;
+ codec->readonly = CORBA_FALSE;
+ codec->data_endian = codec->host_endian = FLAG_ENDIANNESS;
+ CDR_put_octet(codec, oc_endian);
+ CDR_put_octets(codec, (gpointer)iiopversion, sizeof(iiopversion));
+ CDR_put_string(codec, info->tag.orbitinfo.unix_sock_path);
+ CDR_put_ushort(codec, info->tag.orbitinfo.ipv6_port);
+ CDR_put_ulong(codec, info->object_key._length);
+ CDR_put_octets(codec, info->object_key._buffer,
+ info->object_key._length);
+ len = codec->wptr;
+ giop_send_buffer_append_mem_indirect_a(send_buffer,
+ &len, sizeof(len));
+ giop_send_buffer_append_mem_indirect(send_buffer,
+ codec->buffer, codec->wptr);
+ } else {
+ g_warning("ORBit_marshal_profile ask to marshal type %d\n", info->profile_type);
+ }
+}
+
+void
+ORBit_marshal_object(GIOPSendBuffer *send_buffer, CORBA_Object obj)
+{
+ CORBA_unsigned_long len;
+
+
+ if(!obj) {
+ static const CORBA_unsigned_long zero = 0, one = 1;
+ /* zero-length typename */
+ giop_message_buffer_append_mem_a(GIOP_MESSAGE_BUFFER(send_buffer),
+ &one, sizeof(one));
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(send_buffer),
+ &zero, 1);
+
+ /* zero profiles */
+ giop_message_buffer_append_mem_a(GIOP_MESSAGE_BUFFER(send_buffer),
+ &zero, sizeof(zero));
+ return;
+ }
+ g_return_if_fail(ORBIT_ROOT_OBJECT(obj)->refs > 0);
+
+ len = strlen(obj->object_id) + 1;
+ giop_send_buffer_append_mem_indirect_a(send_buffer, &len,
+ sizeof(len));
+ giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(send_buffer),
+ obj->object_id, len);
+
+ len = g_slist_length(obj->profile_list);
+ giop_send_buffer_append_mem_indirect_a(GIOP_SEND_BUFFER(send_buffer),
+ &len, sizeof(len));
+
+ /* Marshal active first? */
+ g_slist_foreach(obj->profile_list, ORBit_marshal_profile, send_buffer);
+}
+
+static void ORBit_test_profile(gpointer item, gpointer data)
+{
+ ORBit_Object_info *info = (ORBit_Object_info *)item;
+ CORBA_Object obj = (CORBA_Object)data;
+
+ if(obj->active_profile != NULL)
+ return; /* we already have a good profile */
+
+ if(info->profile_type == IOP_TAG_ORBIT_SPECIFIC) {
+ if(!ORBit_parse_unixsock(obj, info->tag.orbitinfo.unix_sock_path, TRUE)) {
+ /* success */
+ obj->active_profile=info;
+ }
+ } else if(info->profile_type == IOP_TAG_INTERNET_IOP) {
+ if(!ORBit_parse_inet(obj, info->tag.iopinfo.host, info->tag.iopinfo.port, TRUE)) {
+ /* success */
+ obj->active_profile=info;
+ }
+ }
+}
+
+static void
+ORBit_object_try_existing_connections(CORBA_Object obj)
+{
+ g_slist_foreach(obj->profile_list, ORBit_test_profile, obj);
+}
+
+static void ORBit_activate_profile(gpointer item, gpointer data)
+{
+ ORBit_Object_info *info = (ORBit_Object_info *)item;
+ CORBA_Object obj = (CORBA_Object)data;
+
+ if(obj->active_profile != NULL)
+ return; /* we already have a good profile */
+
+ if(info->profile_type == IOP_TAG_ORBIT_SPECIFIC) {
+ if(!ORBit_parse_unixsock(obj, info->tag.orbitinfo.unix_sock_path, FALSE)) {
+ /* success */
+ obj->active_profile=info;
+ }
+ } else if(info->profile_type == IOP_TAG_INTERNET_IOP) {
+ if(!ORBit_parse_inet(obj, info->tag.iopinfo.host, info->tag.iopinfo.port, FALSE)) {
+ /* success */
+ obj->active_profile=info;
+ }
+ }
+}
+
+GIOPConnection *
+_ORBit_object_get_connection(CORBA_Object obj)
+{
+ g_return_val_if_fail(obj, NULL);
+
+ if (obj->connection) {
+ giop_connection_unref(obj->connection);
+ obj->connection = NULL;
+ obj->active_profile = NULL;
+ }
+
+ g_slist_foreach(obj->profile_list, ORBit_activate_profile, obj);
+
+ if(obj->active_profile == NULL || !obj->connection)
+ return NULL;
+
+ obj->connection->orb_data = obj->orb;
+
+ return obj->connection;
+}
+
+GIOPConnection *
+ORBit_object_get_forwarded_connection(CORBA_Object obj)
+{
+ g_return_val_if_fail(obj, NULL);
+
+ if (obj->connection) {
+ giop_connection_unref(obj->connection);
+ obj->connection = NULL;
+ obj->active_profile = NULL;
+ }
+
+ g_slist_foreach(obj->forward_locations, ORBit_activate_profile, obj);
+
+ if(obj->active_profile == NULL || !obj->connection)
+ return NULL;
+
+ obj->connection->orb_data = obj->orb;
+
+ return obj->connection;
+}
+
+/* This function is heavily based on the idl stubs output. Any changes there
+ will probably have to be reflected here also. */
+
+void ORBit_object_locate(CORBA_Object obj, CORBA_Environment *ev)
+{
+ GIOPConnection *cnx;
+ GIOPSendBuffer *send_buffer;
+ GIOPRecvBuffer *recv_buffer;
+ GIOP_unsigned_long request_id;
+
+ g_return_if_fail(obj!=NULL);
+ g_return_if_fail(ev!=NULL);
+
+ /* Send a LOCATE_REQUEST, wait for a LOCATE_REPLY. The reply will
+ either say "Object here", or will carry a new location. We set
+ obj->active_profile appropriately */
+
+ cnx=ORBit_object_get_connection(obj);
+ if((cnx==NULL) || (obj->active_profile==NULL)) {
+ CORBA_exception_set_system(ev, ex_CORBA_COMM_FAILURE, CORBA_COMPLETED_NO);
+ return;
+ }
+ request_id=giop_get_request_id();
+ send_buffer=giop_send_locate_request_buffer_use(cnx, request_id, &(obj->active_profile->object_key_vec));
+ if(!send_buffer) {
+ CORBA_exception_set_system(ev, ex_CORBA_COMM_FAILURE, CORBA_COMPLETED_NO);
+ return;
+ }
+
+ giop_send_buffer_write(send_buffer);
+ giop_send_buffer_unuse(send_buffer);
+
+ recv_buffer=giop_recv_locate_reply_buffer_use(request_id, TRUE);
+ if(recv_buffer==NULL || recv_buffer->message_buffer.message_header.message_type!=GIOP_LOCATEREPLY) {
+ CORBA_exception_set_system(ev, ex_CORBA_COMM_FAILURE, CORBA_COMPLETED_MAYBE);
+ if(recv_buffer)
+ giop_recv_buffer_unuse(recv_buffer);
+
+ return;
+ }
+
+ ev->_major=CORBA_NO_EXCEPTION;
+ switch(recv_buffer->message.u.locate_reply.locate_status) {
+ case GIOP_UNKNOWN_OBJECT:
+ CORBA_exception_set_system(ev, ex_CORBA_OBJECT_NOT_EXIST, CORBA_COMPLETED_NO);
+ break;
+
+ case GIOP_OBJECT_HERE:
+ /* No further processing necessary */
+ break;
+
+ case GIOP_OBJECT_FORWARD:
+ /* We've been forwarded onto somewhere else. The message body
+ contains the new IOR */
+ if(obj->forward_locations != NULL) {
+ ORBit_delete_profiles(obj->forward_locations);
+ }
+ obj->forward_locations=ORBit_demarshal_IOR(recv_buffer);
+
+ /* This will adjust obj->active_profile */
+ cnx=ORBit_object_get_forwarded_connection(obj);
+ break;
+
+ default:
+ g_message("Bad Reply in ORBit_locate_object()\n");
+ break;
+
+ }
+
+ giop_recv_buffer_unuse(recv_buffer);
+}
+
+GIOPConnection *
+ORBit_handle_location_forward(GIOPRecvBuffer *rb, CORBA_Object obj)
+{
+ GIOPConnection *retval;
+
+ if(obj->forward_locations)
+ ORBit_delete_profiles(obj->forward_locations);
+ obj->forward_locations = ORBit_demarshal_IOR(rb);
+
+ retval = ORBit_object_get_forwarded_connection(obj);
+ giop_recv_buffer_unuse(rb);
+
+ return retval;
+}
diff -urN linux-2.4.1/net/korbit/orb/orbit_object.h linux-2.4.1-korbit/net/korbit/orb/orbit_object.h
--- linux-2.4.1/net/korbit/orb/orbit_object.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/orbit_object.h Thu Feb 1 16:20:50 2001
@@ -0,0 +1,114 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter and Red Hat Software
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Phil Dawes <philipd@parallax.co.uk>
+ *
+ */
+
+/*
+ * ORBit specific CORBA_Object funcitons.
+ *
+ */
+#ifndef _ORBIT_ORBIT_OBJECT_H_
+#define _ORBIT_ORBIT_OBJECT_H_
+
+#include <IIOP/IIOP.h>
+#include "corba_object.h"
+
+extern CORBA_Object ORBit_CORBA_Object_new(CORBA_Environment *ev);
+extern void ORBit_CORBA_Object_free(CORBA_Object obj, CORBA_Environment *ev);
+
+
+typedef enum {
+ ORBIT_PSEUDO_ORB,
+ ORBIT_PSEUDO_POA,
+ ORBIT_PSEUDO_POAMANAGER,
+ ORBIT_PSEUDO_POLICY,
+ ORBIT_PSEUDO_TYPECODE,
+ ORBIT_PSEUDO_REQUEST,
+ ORBIT_PSEUDO_SERVERREQUEST,
+ ORBIT_PSEUDO_CONTEXT
+} ORBit_PseudoObject_type;
+typedef struct ORBit_PseudoObject_struct *ORBit_PseudoObject;
+
+void ORBit_pseudo_object_init(ORBit_PseudoObject obj,
+ ORBit_PseudoObject_type obj_type,
+ CORBA_Environment *ev);
+void ORBit_policy_object_init(CORBA_Policy obj,
+ CORBA_PolicyType obj_type,
+ CORBA_Environment *ev);
+
+/* Use ORBit_CORBA_Object_new() */
+void ORBit_object_reference_init(CORBA_Object obj, CORBA_Environment *ev);
+
+typedef struct {
+ CORBA_char *host;
+ CORBA_unsigned_short port;
+} TAG_INTERNET_IOP_info;
+
+typedef struct {
+ CORBA_char *unix_sock_path;
+ CORBA_unsigned_short ipv6_port;
+} TAG_ORBIT_SPECIFIC_info;
+
+typedef struct {
+ int fill_me_in;
+} TAG_MULTIPLE_COMPONENTS_info;
+
+typedef struct {
+ CORBA_octet iiop_major, iiop_minor;
+ IOP_ProfileId profile_type;
+ union {
+ TAG_INTERNET_IOP_info iopinfo;
+ TAG_ORBIT_SPECIFIC_info orbitinfo;
+ TAG_MULTIPLE_COMPONENTS_info mcinfo;
+ } tag;
+
+ /* If the object key is invariant wrt to the various profiles, then
+ this should probably go in CORBA_Object_struct
+ */
+ CORBA_sequence_octet object_key;
+ struct { CORBA_unsigned_long _length; char _buffer[1]; } *object_key_data;
+ struct iovec object_key_vec;
+} ORBit_Object_info;
+
+void ORBit_set_object_key(ORBit_Object_info *info);
+
+CORBA_Object ORBit_create_object_with_info(GSList *profiles,
+ const CORBA_char *type_id,
+ CORBA_ORB orb,
+ CORBA_Environment *ev);
+
+#define ORBit_object_get_connection(obj) \
+ ((obj)->connection && (obj)->connection->is_valid)?((obj)->connection):_ORBit_object_get_connection(obj)
+GIOPConnection *_ORBit_object_get_connection(CORBA_Object obj);
+GIOPConnection *ORBit_object_get_forwarded_connection(CORBA_Object obj);
+void ORBit_object_locate(CORBA_Object obj, CORBA_Environment *ev);
+
+void ORBit_marshal_object(GIOPSendBuffer *send_buffer, CORBA_Object obj);
+CORBA_Object ORBit_demarshal_object(GIOPRecvBuffer *recv_buffer,
+ CORBA_ORB orb);
+GSList *ORBit_demarshal_IOR(GIOPRecvBuffer *recv_buffer);
+
+extern void ORBit_delete_profiles(GSList *profile_list);
+GIOPConnection *ORBit_handle_location_forward(GIOPRecvBuffer *rb, CORBA_Object obj);
+
+#endif /* _ORBIT_ORBIT_OBJECT_H_ */
diff -urN linux-2.4.1/net/korbit/orb/orbit_object_type.h linux-2.4.1-korbit/net/korbit/orb/orbit_object_type.h
--- linux-2.4.1/net/korbit/orb/orbit_object_type.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/orbit_object_type.h Thu Feb 1 16:20:50 2001
@@ -0,0 +1,87 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ * Philip Dawes
+ * Elliot Lee <sopwith@redhat.com>
+ *
+ */
+
+#ifndef _ORBIT_ORBIT_OBJECT_TYPE_H_
+#define _ORBIT_ORBIT_OBJECT_TYPE_H_
+
+#include "orbit_object.h"
+
+
+/****** Root object **********/
+/*****************************/
+
+typedef struct ORBit_RootObject_Interface_struct ORBit_RootObject_Interface;
+struct ORBit_RootObject_Interface_struct
+{
+ void (*release)(gpointer obj, CORBA_Environment *ev);
+};
+
+
+
+#define ORBIT_ROOT_OBJECT(x) ((ORBit_RootObject)(x))
+
+
+typedef struct ORBit_RootObject_struct *ORBit_RootObject;
+struct ORBit_RootObject_struct {
+ ORBit_RootObject_Interface* interface; /* the interface */
+
+ guchar is_pseudo_object;
+ gint refs;
+};
+
+
+/* Reference counting interface */
+
+#define ORBIT_ROOT_OBJECT_REF(obj) (ORBIT_ROOT_OBJECT(obj)->refs++)
+#define ORBIT_ROOT_OBJECT_UNREF(obj) (ORBIT_ROOT_OBJECT(obj)->refs--)
+
+
+ /* Virtual function interface*/
+
+#define ORBIT_ROOT_OBJECT_release(obj,ev) \
+(ORBIT_ROOT_OBJECT(obj)->interface->release(obj,ev))
+
+
+
+extern void ORBit_RootObject_set_interface(ORBit_RootObject obj,
+ ORBit_RootObject_Interface* epv,
+ CORBA_Environment *ev);
+
+
+
+/****** Pseudo object --> RootObject ********/
+/*********************************************/
+
+#define ORBIT_PSEUDO_OBJECT(x) ((ORBit_PseudoObject)(x))
+
+struct ORBit_PseudoObject_struct {
+ struct ORBit_RootObject_struct parent;
+ ORBit_PseudoObject_type pseudo_object_type;
+};
+
+
+#endif /* !_ORBIT_CORBA_OBJECT_TYPE_H_ */
diff -urN linux-2.4.1/net/korbit/orb/orbit_poa.c linux-2.4.1-korbit/net/korbit/orb/orbit_poa.c
--- linux-2.4.1/net/korbit/orb/orbit_poa.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/orbit_poa.c Thu Feb 1 11:47:13 2001
@@ -0,0 +1,809 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter and Red Hat Software
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Phil Dawes <philipd@parallax.co.uk>
+ * Elliot Lee <sopwith@redhat.com>
+ *
+ */
+
+/*
+ * ORBit specific POA funcitons.
+ *
+ */
+
+#include <string.h>
+#include "orbit.h"
+#include "orbit_poa_type.h"
+#include "orbit_poa.h"
+#include "genrand.h"
+
+#define POA_KEY_LEN (sizeof(CORBA_unsigned_long) + ORBIT_RAND_KEY_LEN)
+#define OBJ_KEY_LEN (sizeof(CORBA_unsigned_long) + ORBIT_RAND_KEY_LEN)
+
+static void ORBit_POAManager_release(PortableServer_POAManager poa_mgr,
+ CORBA_Environment *ev);
+
+static void ORBit_POA_release(PortableServer_POA poa,
+ CORBA_Environment *ev);
+
+static PortableServer_Servant
+ORBit_POA_ServantManager_use_servant(PortableServer_POA poa,
+ GIOPRecvBuffer *recv_buffer,
+ PortableServer_ServantLocator_Cookie *the_cookie,
+ PortableServer_ObjectId *oid,
+ ORBit_POAObject *fake_obj_impl,
+ CORBA_Environment *ev);
+static void
+ORBit_POA_ServantManager_unuse_servant(PortableServer_Servant servant,
+ PortableServer_POA poa,
+ GIOPRecvBuffer *recv_buffer,
+ PortableServer_ServantLocator_Cookie cookie,
+ PortableServer_ObjectId *oid,
+ ORBit_POAObject *fake_obj_impl,
+ CORBA_Environment *ev);
+
+static const ORBit_RootObject_Interface CORBA_POAManager_epv =
+{
+ (void (*)(gpointer, CORBA_Environment *))ORBit_POAManager_release,
+};
+
+static const ORBit_RootObject_Interface CORBA_POA_epv =
+{
+ (void (*)(gpointer, CORBA_Environment *))ORBit_POA_release,
+};
+
+guint
+g_sequence_octet_hash(CORBA_sequence_octet *so)
+{
+ const char *s = (char*)so->_buffer;
+ const char *p, *e = ((char *)so->_buffer) + so->_length;
+ guint h=0, g;
+
+ for(p = s; p < e; p ++) {
+ h = ( h << 4 ) + *p;
+ if ( ( g = h & 0xf0000000 ) ) {
+ h = h ^ (g >> 24);
+ h = h ^ g;
+ }
+ }
+
+ return h;
+}
+
+gint
+g_sequence_octet_compare(CORBA_sequence_octet *s1, CORBA_sequence_octet *s2)
+{
+ if(s2->_length != s1->_length)
+ return FALSE;
+
+ return !memcmp(s1->_buffer, s2->_buffer, s1->_length);
+}
+
+PortableServer_POAManager
+ORBit_POAManager_new(CORBA_Environment *ev)
+{
+ PortableServer_POAManager poa_mgr;
+
+ poa_mgr = g_new0(struct PortableServer_POAManager_type, 1);
+
+ if(poa_mgr == NULL) {
+ CORBA_exception_set_system(ev, ex_CORBA_NO_MEMORY, CORBA_COMPLETED_NO);
+ goto error;
+ }
+
+ /* Initialise poa manager */
+
+ ORBit_pseudo_object_init(ORBIT_PSEUDO_OBJECT(poa_mgr),
+ ORBIT_PSEUDO_POAMANAGER, ev);
+ ORBIT_ROOT_OBJECT(poa_mgr)->refs = 0;
+ ORBit_RootObject_set_interface(ORBIT_ROOT_OBJECT(poa_mgr),
+ (gpointer)&CORBA_POAManager_epv, ev);
+
+ poa_mgr->poa_collection = NULL;
+ poa_mgr->state = PortableServer_POAManager_HOLDING;
+
+ return poa_mgr;
+
+error:
+ if(poa_mgr != NULL){
+ ORBit_POAManager_release(poa_mgr, ev);
+ }
+ return NULL;
+}
+
+static void
+ORBit_POAManager_release(PortableServer_POAManager poa_mgr,
+ CORBA_Environment *ev)
+{
+
+ if(--(ORBIT_ROOT_OBJECT(poa_mgr)->refs) > 0)
+ return;
+
+ if(poa_mgr != NULL) {
+ if(poa_mgr->poa_collection != NULL) {
+ g_slist_free(poa_mgr->poa_collection);
+ poa_mgr->poa_collection = NULL;
+ }
+ g_free(poa_mgr);
+ poa_mgr = NULL;
+ }
+}
+
+static void
+ORBit_POAManager_register_poa(PortableServer_POAManager poa_mgr,
+ PortableServer_POA poa,
+ CORBA_Environment *ev)
+{
+ poa_mgr->poa_collection = g_slist_remove(poa_mgr->poa_collection, poa);
+ poa_mgr->poa_collection =
+ g_slist_append(poa_mgr->poa_collection, poa);
+}
+
+static void
+ORBit_POAManager_unregister_poa(PortableServer_POAManager poa_mgr,
+ PortableServer_POA poa,
+ CORBA_Environment *ev)
+{
+ poa_mgr->poa_collection = g_slist_remove(poa_mgr->poa_collection, poa);
+}
+
+static void
+ORBit_POA_set_policy(PortableServer_POA poa,
+ CORBA_Policy policy,
+ CORBA_Environment *ev)
+{
+ switch(policy->policy_type) {
+ case PortableServer_THREAD_POLICY_ID:
+ poa->thread = ((PortableServer_ThreadPolicy)policy)->value;
+ break;
+ case PortableServer_LIFESPAN_POLICY_ID:
+ poa->lifespan = ((PortableServer_LifespanPolicy)policy)->value;
+ break;
+ case PortableServer_ID_UNIQUENESS_POLICY_ID:
+ poa->id_uniqueness = ((PortableServer_IdUniquenessPolicy)policy)->value;
+ break;
+ case PortableServer_ID_ASSIGNMENT_POLICY_ID:
+ poa->id_assignment = ((PortableServer_IdAssignmentPolicy)policy)->value;
+ break;
+ case PortableServer_IMPLICIT_ACTIVATION_POLICY_ID:
+ poa->implicit_activation = ((PortableServer_ImplicitActivationPolicy)policy)->value;
+ break;
+ case PortableServer_SERVANT_RETENTION_POLICY_ID:
+ poa->servant_retention = ((PortableServer_ServantRetentionPolicy)policy)->value;
+ break;
+ case PortableServer_REQUEST_PROCESSING_POLICY_ID:
+ poa->request_processing = ((PortableServer_ServantRetentionPolicy)policy)->value;
+ break;
+ default:
+ g_warning("Unknown policy type, cannot set it on this POA");
+ }
+}
+
+
+static void
+ORBit_POA_check_policy_conflicts(PortableServer_POA poa,
+ CORBA_Environment *ev)
+{
+
+ /* Check for those policy combinations that aren't allowed */
+ if ((poa->servant_retention == PortableServer_NON_RETAIN &&
+ poa->request_processing == PortableServer_USE_ACTIVE_OBJECT_MAP_ONLY) ||
+
+ (poa->request_processing == PortableServer_USE_DEFAULT_SERVANT &&
+ poa->id_uniqueness == PortableServer_UNIQUE_ID) ||
+
+ (poa->implicit_activation == PortableServer_IMPLICIT_ACTIVATION &&
+ (poa->id_assignment == PortableServer_USER_ID ||
+ poa->servant_retention == PortableServer_NON_RETAIN))
+ )
+ {
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_PortableServer_POA_InvalidPolicy,
+ NULL);
+ }
+}
+
+
+static void
+ORBit_POA_set_policylist(PortableServer_POA poa,
+ CORBA_PolicyList *policies,
+ CORBA_Environment *ev)
+{
+ CORBA_unsigned_long i;
+
+ for(i = 0; i < policies->_length; i++) {
+ if(ev->_major != CORBA_NO_EXCEPTION)
+ break;
+ ORBit_POA_set_policy(poa, policies->_buffer[i], ev);
+ }
+}
+
+PortableServer_POA
+ORBit_POA_new(CORBA_ORB orb,
+ CORBA_char *adapter_name,
+ PortableServer_POAManager the_POAManager,
+ CORBA_PolicyList *policies,
+ CORBA_Environment *ev)
+{
+ PortableServer_POA poa;
+
+ /* Create the object */
+ poa = (PortableServer_POA) g_new0(struct PortableServer_POA_type, 1);
+ if(poa == NULL) {
+ CORBA_exception_set_system(ev, ex_CORBA_NO_MEMORY, CORBA_COMPLETED_NO);
+ goto error;
+ }
+
+ ORBit_pseudo_object_init(ORBIT_PSEUDO_OBJECT(poa), ORBIT_PSEUDO_POA, ev);
+
+ ORBIT_ROOT_OBJECT(poa)->refs = 0;
+ ORBit_RootObject_set_interface(ORBIT_ROOT_OBJECT(poa),
+ (gpointer)&CORBA_POA_epv, ev);
+
+ if(ev->_major != CORBA_NO_EXCEPTION) goto error;
+
+ /* If no POAManager was specified, create one */
+ if(the_POAManager == NULL) {
+ the_POAManager = ORBit_POAManager_new(ev);
+ }
+
+ /* Register this poa with the poa manager */
+ if(the_POAManager != NULL)
+ ORBit_POAManager_register_poa(the_POAManager,poa,ev);
+ if(ev->_major != CORBA_NO_EXCEPTION) goto error;
+
+ /* Wire up the poa_manager */
+ poa->the_POAManager = the_POAManager;
+
+ /* Initialise the child poas table */
+ poa->child_POAs = NULL; /* initialise the slist */
+
+ poa->held_requests = NULL;
+
+ poa->poaID = orb->poas->len;
+ g_ptr_array_set_size(orb->poas, orb->poas->len + 1);
+ g_ptr_array_index(orb->poas, poa->poaID) = poa;
+
+ poa->orb = orb;
+
+ g_return_val_if_fail(ev->_major == CORBA_NO_EXCEPTION, NULL);
+
+ /* Need to initialise poa policies etc.. here */
+ poa->thread = PortableServer_ORB_CTRL_MODEL;
+ poa->lifespan = PortableServer_TRANSIENT;
+ poa->id_uniqueness = PortableServer_UNIQUE_ID;
+ poa->id_assignment = PortableServer_SYSTEM_ID;
+ poa->servant_retention = PortableServer_RETAIN;
+ poa->request_processing = PortableServer_USE_ACTIVE_OBJECT_MAP_ONLY;
+ poa->implicit_activation = PortableServer_NO_IMPLICIT_ACTIVATION;
+ if (policies) {
+ ORBit_POA_set_policylist(poa, policies, ev);
+ ORBit_POA_check_policy_conflicts(poa, ev);
+ if(ev->_major != CORBA_NO_EXCEPTION) goto error;
+ }
+
+ /* copy the name */
+ poa->the_name = CORBA_string_dup(adapter_name);
+
+ poa->active_object_map = g_hash_table_new((GHashFunc)g_sequence_octet_hash,
+ (GCompareFunc)g_sequence_octet_compare);
+ poa->objnum_to_obj = g_ptr_array_new();
+ g_ptr_array_set_size(poa->objnum_to_obj, 1);
+ g_ptr_array_index(poa->objnum_to_obj, 0) = NULL;
+
+ orbit_genrand(poa->rand_data, ORBIT_RAND_KEY_LEN);
+
+ return poa;
+
+error:
+ if(poa && poa->the_name){
+ CORBA_free(poa->the_name);
+ }
+
+ if(poa != NULL){
+ ORBit_POA_release(poa, NULL);
+ }
+ return NULL;
+}
+
+static void
+ORBit_POA_release(PortableServer_POA poa,
+ CORBA_Environment *ev)
+{
+ ORBIT_ROOT_OBJECT_UNREF(poa);
+
+ if(ORBIT_ROOT_OBJECT(poa)->refs <= 0) {
+ CORBA_free(poa->the_name);
+
+ g_slist_foreach(poa->child_POAs, (GFunc)CORBA_Object_release,
+ ev);
+
+ if(poa->parent_poa)
+ ORBit_POA_remove_child(poa->parent_poa, poa, ev);
+
+ ORBit_POAManager_unregister_poa(poa->the_POAManager,
+ poa, ev);
+
+ g_ptr_array_index(poa->orb->poas, poa->poaID) = NULL;
+
+ g_free(poa);
+ }
+}
+
+void
+ORBit_POA_add_child(PortableServer_POA poa,
+ PortableServer_POA child_poa,
+ CORBA_Environment *ev)
+
+{
+ g_return_if_fail(poa != NULL);
+ g_return_if_fail(child_poa != NULL);
+
+ poa->child_POAs = g_slist_prepend(poa->child_POAs, child_poa);
+}
+
+void
+ORBit_POA_remove_child(PortableServer_POA poa,
+ PortableServer_POA child_poa,
+ CORBA_Environment *ev)
+{
+ g_return_if_fail(poa != NULL);
+ g_return_if_fail(child_poa != NULL);
+
+ poa->child_POAs = g_slist_remove(poa->child_POAs, child_poa);
+}
+
+extern ORBit_request_validate ORBIT_request_validator;
+
+gboolean
+ORBit_POA_handle_request(GIOPRecvBuffer *recv_buffer,
+ PortableServer_POA poa)
+{
+ PortableServer_ServantBase *servant;
+ PortableServer_ServantLocator_Cookie cookie;
+ ORBit_POAObject *obj_impl = NULL, tmp_obj_impl;
+ ORBitSkeleton skel;
+ gpointer imp = NULL;
+ CORBA_Environment ev;
+ GIOPSendBuffer *send_buffer;
+ guchar *opname;
+ PortableServer_ObjectId *oid = NULL;
+
+ CORBA_exception_init(&ev);
+
+ switch(poa->the_POAManager->state) {
+ case PortableServer_POAManager_HOLDING:
+ poa->held_requests = g_slist_prepend(poa->held_requests,
+ recv_buffer);
+ return FALSE;
+ break;
+ case PortableServer_POAManager_DISCARDING:
+ send_buffer = giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(recv_buffer)->connection,
+ NULL,
+ recv_buffer->message.u.request.request_id,
+ CORBA_SYSTEM_EXCEPTION);
+ CORBA_exception_set_system(&ev,
+ ex_CORBA_TRANSIENT,
+ CORBA_COMPLETED_NO);
+ ORBit_send_system_exception(send_buffer, &ev);
+ giop_send_buffer_write(send_buffer);
+ giop_recv_buffer_unuse(recv_buffer);
+ giop_send_buffer_unuse(send_buffer);
+ CORBA_exception_free(&ev);
+ return TRUE;
+ break;
+ case PortableServer_POAManager_INACTIVE:
+ send_buffer = giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(recv_buffer)->connection,
+ NULL,
+ recv_buffer->message.u.request.request_id,
+ CORBA_SYSTEM_EXCEPTION);
+ CORBA_exception_set_system(&ev,
+ ex_CORBA_OBJ_ADAPTER,
+ CORBA_COMPLETED_NO);
+ ORBit_send_system_exception(send_buffer, &ev);
+ giop_send_buffer_write(send_buffer);
+ giop_recv_buffer_unuse(recv_buffer);
+ giop_send_buffer_unuse(send_buffer);
+ CORBA_exception_free(&ev);
+ return TRUE;
+ break;
+ case PortableServer_POAManager_ACTIVE:
+ default:
+ break;
+ }
+
+ servant = NULL;
+
+ if(recv_buffer->message.u.request.object_key._length
+ < (POA_KEY_LEN + sizeof(CORBA_unsigned_long))) {
+ CORBA_exception_set_system(&ev,
+ ex_CORBA_OBJECT_NOT_EXIST,
+ CORBA_COMPLETED_NO);
+ goto errout;
+ }
+
+ obj_impl = ORBit_POA_find_oid_for_object_key(poa, &(recv_buffer->message.u.request.object_key), &oid);
+
+ if(poa->servant_retention == PortableServer_RETAIN
+ && obj_impl) {
+ servant = obj_impl->servant;
+ oid = obj_impl->object_id;
+ }
+
+ if(!servant) {
+ switch(poa->request_processing) {
+ case PortableServer_USE_SERVANT_MANAGER:
+ servant = ORBit_POA_ServantManager_use_servant(poa,
+ recv_buffer,
+ &cookie,
+ oid,
+ &tmp_obj_impl,
+ &ev);
+ break;
+ case PortableServer_USE_DEFAULT_SERVANT:
+ servant = poa->default_servant;
+ if(servant == NULL) {
+ CORBA_exception_set_system(&ev,
+ ex_CORBA_OBJ_ADAPTER,
+ CORBA_COMPLETED_NO);
+ goto errout;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ if(!poa || !servant || !servant->_private) {
+ CORBA_exception_set_system(&ev,
+ ex_CORBA_OBJECT_NOT_EXIST,
+ CORBA_COMPLETED_NO);
+ goto errout;
+ }
+
+ opname = recv_buffer->message.u.request.operation;
+
+ skel = ORBIT_OBJECT_KEY(servant->_private)->class_info->relay_call(servant, recv_buffer, &imp);
+
+ if(!skel) {
+ if (opname[0] == '_' && strcmp(opname + 1, "is_a") == 0) {
+ skel = (gpointer)&ORBit_impl_CORBA_Object_is_a;
+ }
+ else {
+ CORBA_exception_set_system(&ev, ex_CORBA_BAD_OPERATION,
+ CORBA_COMPLETED_NO);
+ goto errout;
+ }
+ }
+ else if (!imp) {
+ CORBA_exception_set_system(&ev, ex_CORBA_NO_IMPLEMENT,
+ CORBA_COMPLETED_NO);
+ goto errout;
+ }
+
+ /* If it got through the random keys, and nobody else had the opportunity to say otherwise, it must be auth'd */
+
+ if(!ORBIT_request_validator)
+ GIOP_MESSAGE_BUFFER(recv_buffer)->connection->is_auth = TRUE;
+
+ skel(servant, recv_buffer, &ev, imp);
+
+ if(poa->request_processing == PortableServer_USE_SERVANT_MANAGER) {
+ ORBit_POA_ServantManager_unuse_servant(servant,
+ poa,
+ recv_buffer,
+ cookie, oid,
+ &tmp_obj_impl,
+ &ev);
+ }
+
+ if(!obj_impl)
+ CORBA_free(oid);
+
+ CORBA_exception_free(&ev);
+
+ return TRUE;
+
+ errout:
+ if(ev._major == CORBA_SYSTEM_EXCEPTION) {
+ GIOPSendBuffer *reply_buf;
+
+ reply_buf =
+ giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(recv_buffer)->connection,
+ NULL,
+ recv_buffer->message.u.request.request_id,
+ CORBA_SYSTEM_EXCEPTION);
+
+ ORBit_send_system_exception(reply_buf, &ev);
+
+ giop_send_buffer_write(reply_buf);
+ giop_send_buffer_unuse(reply_buf);
+ } else /* User exceptions are handled in the skels! */
+ g_assert(ev._major == CORBA_NO_EXCEPTION);
+
+ if(!obj_impl)
+ CORBA_free(oid);
+
+ CORBA_exception_free(&ev);
+
+ return TRUE;
+}
+
+PortableServer_POA
+ORBit_POA_find_POA_for_object_key(PortableServer_POA root_poa,
+ CORBA_sequence_octet *key)
+{
+ CORBA_unsigned_long pid;
+
+ if(key->_length < (sizeof(CORBA_unsigned_long) + ORBIT_RAND_KEY_LEN))
+ return NULL;
+
+ pid = *((CORBA_unsigned_long *)key->_buffer);
+
+ if(pid < root_poa->orb->poas->len) {
+ PortableServer_POA poa;
+ poa = g_ptr_array_index(root_poa->orb->poas, pid);
+ if(!poa)
+ return NULL;
+ if(memcmp(poa->rand_data, key->_buffer + sizeof(CORBA_unsigned_long), ORBIT_RAND_KEY_LEN))
+ return NULL;
+ return poa;
+ } else
+ return NULL;
+}
+
+void
+ORBit_POA_find_object_key_for_oid(PortableServer_POA poa,
+ ORBit_POAObject *obj,
+ PortableServer_ObjectId *oid,
+ CORBA_sequence_octet *retval)
+{
+ CORBA_long *vptr;
+
+ g_return_if_fail(poa && (obj || oid));
+ g_return_if_fail(retval);
+
+ if(oid)
+ g_assert(!oid->_buffer[oid->_length - 1]);
+
+ if(obj)
+ retval->_length = POA_KEY_LEN + OBJ_KEY_LEN;
+ else
+ retval->_length = POA_KEY_LEN + sizeof(CORBA_long) + oid->_length;
+ retval->_buffer = CORBA_octet_allocbuf(retval->_length);
+ CORBA_sequence_set_release(retval, CORBA_TRUE);
+
+ vptr = (CORBA_long *)retval->_buffer;
+ *vptr = poa->poaID;
+ memcpy(retval->_buffer + sizeof(CORBA_unsigned_long), poa->rand_data, ORBIT_RAND_KEY_LEN);
+
+ vptr = (CORBA_long *)(retval->_buffer + POA_KEY_LEN);
+ if(obj) {
+ *vptr = obj->objnum;
+ memcpy(retval->_buffer + POA_KEY_LEN + sizeof(CORBA_unsigned_long), obj->rand_data, ORBIT_RAND_KEY_LEN);
+ } else {
+ *vptr = -((CORBA_long)oid->_length);
+ memcpy(retval->_buffer + POA_KEY_LEN + sizeof(CORBA_unsigned_long), oid->_buffer, oid->_length);
+ }
+}
+
+ORBit_POAObject *
+ORBit_POA_find_oid_for_object_key(PortableServer_POA poa,
+ CORBA_sequence_octet *object_key,
+ PortableServer_ObjectId **oid)
+{
+ CORBA_long onum;
+ guchar *nptr;
+ ORBit_POAObject *objinfo;
+
+ *oid = NULL;
+ nptr = object_key->_buffer + POA_KEY_LEN;
+
+ if(object_key->_length < (POA_KEY_LEN + sizeof(CORBA_long))) {
+ return NULL;
+ }
+
+ onum = *((CORBA_long *)nptr);
+
+ if(onum < 0) {
+ /* onum will be the -strlen(ObjectId) */
+ if(object_key->_length < (POA_KEY_LEN + sizeof(CORBA_long) - onum))
+ return NULL;
+
+ *oid = (PortableServer_ObjectId *)CORBA_sequence_octet__alloc();
+ (*oid)->_length = -onum;
+ (*oid)->_buffer = CORBA_octet_allocbuf((*oid)->_length);
+ memcpy((*oid)->_buffer, object_key->_buffer + POA_KEY_LEN + sizeof(CORBA_long), (*oid)->_length);
+
+ return NULL;
+ }
+
+ if(onum >= poa->objnum_to_obj->len)
+ return NULL;
+
+ objinfo = g_ptr_array_index(poa->objnum_to_obj, onum);
+
+ if(GPOINTER_TO_UINT(objinfo) <= poa->objnum_to_obj->len)
+ return NULL;
+
+ if(object_key->_length < (POA_KEY_LEN + OBJ_KEY_LEN))
+ return NULL;
+
+ if(memcmp(object_key->_buffer + POA_KEY_LEN + sizeof(CORBA_long), objinfo->rand_data, ORBIT_RAND_KEY_LEN))
+ return NULL;
+
+ return objinfo;
+}
+
+DEFINE_LOCK(id_assignment_counter);
+static int id_assignment_counter = 0;
+
+PortableServer_ObjectId *
+ORBit_POA_allocate_oid(PortableServer_POA poa,
+ const char *basis)
+{
+ PortableServer_ObjectId *new_objid;
+ char buf[512];
+ int len;
+
+ new_objid = (PortableServer_ObjectId *)CORBA_sequence_octet__alloc();
+
+ GET_LOCK(id_assignment_counter);
+ g_snprintf(buf, sizeof(buf), "%s%d", basis?basis:"Object",
+ id_assignment_counter);
+ id_assignment_counter++;
+ RELEASE_LOCK(id_assignment_counter);
+
+ len = strlen(buf)+1;
+ new_objid->_buffer = CORBA_octet_allocbuf(len);
+ new_objid->_length = len;
+ new_objid->_maximum = len;
+ new_objid->_release = CORBA_TRUE;
+
+ strcpy((CORBA_char *)new_objid->_buffer, buf);
+
+ return new_objid;
+}
+
+static PortableServer_Servant
+ORBit_POA_ServantManager_use_servant(PortableServer_POA poa,
+ GIOPRecvBuffer *recv_buffer,
+ PortableServer_ServantLocator_Cookie *the_cookie,
+ PortableServer_ObjectId *oid,
+ ORBit_POAObject *fake_obj_impl,
+ CORBA_Environment *ev)
+{
+ if(poa->servant_retention == PortableServer_RETAIN) {
+ POA_PortableServer_ServantActivator *sm;
+ POA_PortableServer_ServantActivator__epv *epv;
+
+ sm = (POA_PortableServer_ServantActivator *)poa->servant_manager;
+ epv = sm->vepv->PortableServer_ServantActivator_epv;
+ return epv->incarnate(sm, oid, poa, ev);
+ } else {
+ POA_PortableServer_ServantLocator *sm;
+ POA_PortableServer_ServantLocator__epv *epv;
+ PortableServer_ServantBase *retval;
+
+ sm = (POA_PortableServer_ServantLocator *)poa->servant_manager;
+ epv = sm->vepv->PortableServer_ServantLocator_epv;
+ retval = epv->preinvoke(sm, oid,
+ poa, recv_buffer->message.u.request.operation,
+ the_cookie,
+ ev);
+
+ ((ORBit_ObjectKey *)retval->_private)->object = fake_obj_impl;
+ fake_obj_impl->object_id = oid;
+ fake_obj_impl->poa = poa;
+ fake_obj_impl->orb = poa->orb;
+ fake_obj_impl->objnum = -1;
+#ifdef NOT_BACKWARDS_COMPAT_0_4
+ fake_obj_impl->use_count = NULL;
+ fake_obj_impl->death_callback = NULL;
+#endif
+
+ return retval;
+ }
+}
+
+static void
+ORBit_POA_ServantManager_unuse_servant(PortableServer_Servant servant,
+ PortableServer_POA poa,
+ GIOPRecvBuffer *recv_buffer,
+ PortableServer_ServantLocator_Cookie cookie,
+ PortableServer_ObjectId *oid,
+ ORBit_POAObject *fake_obj_impl,
+ CORBA_Environment *ev)
+{
+ POA_PortableServer_ServantLocator *sm;
+ POA_PortableServer_ServantLocator__epv *epv;
+
+ if(poa->servant_retention != PortableServer_NON_RETAIN)
+ return;
+
+ sm = (POA_PortableServer_ServantLocator *)poa->servant_manager;
+ epv = sm->vepv->PortableServer_ServantLocator_epv;
+
+ ((ORBit_ObjectKey *)((PortableServer_ServantBase *)servant)->_private)->object = NULL;
+ epv->postinvoke(sm, oid,
+ poa, recv_buffer->message.u.request.operation,
+ cookie, servant, ev);
+
+}
+
+typedef struct {
+ PortableServer_POA poa;
+ CORBA_Environment *ev;
+} EtherealizeInfo;
+
+void
+ORBit_POA_etherealize_object(PortableServer_ObjectId *oid,
+ ORBit_POAObject *obj_impl,
+ EtherealizeInfo *ei)
+{
+ POA_PortableServer_ServantActivator__epv *epv;
+ POA_PortableServer_ServantActivator *sm;
+
+ g_assert(ei->poa->servant_manager);
+
+ g_hash_table_remove(ei->poa->active_object_map,
+ obj_impl->object_id);
+
+ sm = (POA_PortableServer_ServantActivator *)ei->poa->servant_manager;
+ epv = sm->vepv->PortableServer_ServantActivator_epv;
+ epv->etherealize(sm, obj_impl->object_id, ei->poa,
+ obj_impl->servant,
+ CORBA_TRUE, CORBA_FALSE, ei->ev);
+}
+
+void
+ORBit_POA_etherealize_objects(PortableServer_POA poa,
+ CORBA_Environment *ev)
+{
+ EtherealizeInfo ei;
+
+ ei.poa = poa;
+ ei.ev = ev;
+
+ if(poa->servant_retention == PortableServer_RETAIN
+ && poa->request_processing == PortableServer_USE_SERVANT_MANAGER) {
+
+ g_hash_table_foreach(poa->active_object_map,
+ (GHFunc)ORBit_POA_etherealize_object,
+ &ei);
+ }
+}
+
+#ifdef NOT_BACKWARDS_COMPAT_0_4
+void ORBit_servant_set_deathwatch(PortableServer_ServantBase *servant,
+ int *use_count,
+ GFunc death_func,
+ gpointer user_data)
+{
+ ORBit_POAObject *pobj;
+
+ pobj = ORBIT_OBJECT_KEY(servant->_private)->object;
+
+ pobj->use_count = use_count;
+ pobj->death_callback = death_func;
+ pobj->user_data = user_data;
+}
+#endif
diff -urN linux-2.4.1/net/korbit/orb/orbit_poa.h linux-2.4.1-korbit/net/korbit/orb/orbit_poa.h
--- linux-2.4.1/net/korbit/orb/orbit_poa.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/orbit_poa.h Thu Feb 1 16:20:50 2001
@@ -0,0 +1,89 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter and Red Hat Software
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Phil Dawes <philipd@parallax.co.uk>
+ *
+ */
+
+/*
+ * ORBit specific POA funcitons.
+ *
+ */
+
+#ifndef _ORBIT_ORBIT_POA_H_
+#define _ORBIT_ORBIT_POA_H_
+
+#include "orbit_types.h"
+#include "orbit_poa_type.h"
+
+/*
+ * Creates a new POAManager
+ */
+
+extern PortableServer_POAManager ORBit_POAManager_new(CORBA_Environment *ev);
+
+extern void ORBit_POAManager_free(PortableServer_POAManager poa_mgr,
+ CORBA_Environment *ev);
+
+extern PortableServer_POA ORBit_POA_new(CORBA_ORB orb,
+ CORBA_char *adapter_name,
+ PortableServer_POAManager the_POAManager,
+ CORBA_PolicyList *policies,
+ CORBA_Environment *ev);
+
+extern void ORBit_POA_free(PortableServer_POA poa, CORBA_Environment *ev);
+
+extern void ORBit_POA_add_child(PortableServer_POA poa,
+ PortableServer_POA child_poa,
+ CORBA_Environment *ev);
+void ORBit_POA_remove_child(PortableServer_POA poa,
+ PortableServer_POA child_poa,
+ CORBA_Environment *ev);
+
+gboolean ORBit_POA_handle_request(GIOPRecvBuffer *recv_buffer,
+ PortableServer_POA poa);
+PortableServer_POA
+ORBit_POA_find_POA_for_object_key(PortableServer_POA root_poa,
+ CORBA_sequence_octet *key);
+void
+ORBit_POA_find_object_key_for_oid(PortableServer_POA poa,
+ ORBit_POAObject *obj,
+ PortableServer_ObjectId *oid,
+ CORBA_sequence_octet *retval);
+ORBit_POAObject *
+ORBit_POA_find_oid_for_object_key(PortableServer_POA poa,
+ CORBA_sequence_octet *object_key,
+ PortableServer_ObjectId **oid);
+
+PortableServer_ObjectId *ORBit_POA_allocate_oid(PortableServer_POA poa,
+ const char *basis);
+
+void ORBit_POA_etherealize_objects(PortableServer_POA poa, CORBA_Environment *ev);
+
+#ifdef NOT_BACKWARDS_COMPAT_0_4
+/* Bad hack for shared libraries */
+void ORBit_servant_set_deathwatch(PortableServer_ServantBase *servant,
+ int *use_count,
+ GFunc death_func,
+ gpointer user_data);
+#endif
+
+#endif /* !_ORBIT_ORBIT_POA_H_ */
diff -urN linux-2.4.1/net/korbit/orb/orbit_poa_type.h linux-2.4.1-korbit/net/korbit/orb/orbit_poa_type.h
--- linux-2.4.1/net/korbit/orb/orbit_poa_type.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/orbit_poa_type.h Thu Feb 1 11:47:13 2001
@@ -0,0 +1,112 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter and Red Hat Software
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Phil Dawes <philipd@parallax.co.uk>
+ *
+ */
+
+/*
+ * ORBit specific POA funcitons.
+ *
+ */
+
+#ifndef _ORBIT_ORBIT_POA_TYPE_H_
+#define _ORBIT_ORBIT_POA_TYPE_H_
+
+typedef void (*ORBitSkeleton)(PortableServer_ServantBase *_ORBIT_servant,
+ gpointer _ORBIT_recv_buffer,
+ CORBA_Environment *ev,
+ gpointer implementation);
+typedef ORBitSkeleton (*ORBit_impl_finder)(PortableServer_ServantBase *servant,
+ gpointer _ORBIT_recv_buffer,
+ gpointer *implementation);
+typedef void (*ORBit_local_objref_init)(CORBA_Object obj,
+ PortableServer_ServantBase *servant);
+typedef struct {
+ ORBit_impl_finder relay_call;
+ const gchar *class_name;
+ ORBit_local_objref_init init_local_objref;
+} PortableServer_ClassInfo;
+
+#define ORBIT_RAND_KEY_LEN 8
+
+typedef struct {
+ PortableServer_ObjectId *object_id;
+ PortableServer_Servant servant;
+ PortableServer_POA poa;
+ CORBA_ORB orb;
+ CORBA_unsigned_long objnum;
+
+ /* Stuff for doing shared libraries nicely */
+ guchar rand_data[ORBIT_RAND_KEY_LEN];
+
+#ifdef NOT_BACKWARDS_COMPAT_0_4
+ int *use_count;
+ GFunc death_callback;
+ gpointer user_data;
+#endif
+} ORBit_POAObject;
+
+typedef struct {
+ PortableServer_ClassInfo *class_info;
+ ORBit_POAObject *object;
+} ORBit_ObjectKey;
+
+#define ORBIT_OBJECT_KEY(x) ((ORBit_ObjectKey *)(x))
+
+struct PortableServer_POA_type {
+ struct ORBit_PseudoObject_struct parent;
+
+ PortableServer_POA parent_poa;
+ CORBA_ORB orb;
+ CORBA_unsigned_long poaID;
+
+ GHashTable *active_object_map;
+ GPtrArray *objnum_to_obj; /* maps objnums to ORBit_POAObject's */
+ CORBA_long first_free_id;
+
+ /* Requests received while in a HOLDING state */
+ GSList *held_requests;
+
+ /* this'll be a hash table when I can be arsed to look up
+ how to implement efficient hash tables - Phil.*/
+ GSList *child_POAs;
+
+ CORBA_char *the_name;
+ PortableServer_POAManager the_POAManager;
+
+ PortableServer_AdapterActivator the_activator;
+
+ PortableServer_ServantManager servant_manager;
+ PortableServer_Servant default_servant;
+
+ PortableServer_ThreadPolicyValue thread;
+ PortableServer_LifespanPolicyValue lifespan;
+ PortableServer_IdUniquenessPolicyValue id_uniqueness;
+ PortableServer_IdAssignmentPolicyValue id_assignment;
+ PortableServer_ImplicitActivationPolicyValue implicit_activation;
+ PortableServer_ServantRetentionPolicyValue servant_retention;
+ PortableServer_RequestProcessingPolicyValue request_processing;
+
+ guchar rand_data[ORBIT_RAND_KEY_LEN];
+};
+
+#endif /* !_ORBIT_ORBIT_POA_TYPE_H_ */
diff -urN linux-2.4.1/net/korbit/orb/orbit_typecode.c linux-2.4.1-korbit/net/korbit/orb/orbit_typecode.c
--- linux-2.4.1/net/korbit/orb/orbit_typecode.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/orbit_typecode.c Thu Feb 1 11:47:14 2001
@@ -0,0 +1,593 @@
+#include "orbit.h"
+#include "orbit_typecode.h"
+#include "cdr.h"
+#include "corba_typecode_type.h"
+#include <IIOP/giop-msg-buffer.h>
+#include "../IIOP/iiop-endianP.h"
+
+#if 0
+#define CORBA_Object_release(x, y) ({ g_message(__FILE__ ":%d Releasing object %#x from %d", __LINE__, \
+x, ORBIT_ROOT_OBJECT(x)->refs); CORBA_Object_release(x, y); })
+#define CORBA_Object_duplicate(x, y) ({ g_message(__FILE__ ":%d Duping object %#x from %d", __LINE__, \
+x, ORBIT_ROOT_OBJECT(x)->refs); CORBA_Object_duplicate(x, y); })
+#endif
+
+typedef struct{
+ CORBA_TypeCode tc;
+ guint index;
+}TCRecursionNode;
+
+typedef struct{
+ GSList* prior_tcs; /* Could be a hash table by typecode */
+ guint current_idx; /* The "top-level" index of the start of the current codec */
+}TCEncodeContext;
+
+typedef struct{
+ GSList* prior_tcs; /* Could be a hash table by offset */
+ guint current_idx;
+}TCDecodeContext;
+
+
+
+static void tc_enc(CORBA_TypeCode t, CDR_Codec* c, TCEncodeContext* ctx);
+static void tc_dec(CORBA_TypeCode* t, CDR_Codec* c, TCDecodeContext* ctx);
+static void tc_enc_tk_objref(CORBA_TypeCode t, CDR_Codec* c, TCEncodeContext* ctx);
+static void tc_dec_tk_objref(CORBA_TypeCode t, CDR_Codec* c, TCDecodeContext* ctx);
+static void tc_enc_tk_sequence(CORBA_TypeCode t, CDR_Codec* c, TCEncodeContext* ctx);
+static void tc_dec_tk_sequence(CORBA_TypeCode t, CDR_Codec* c, TCDecodeContext* ctx);
+static void tc_enc_tk_string(CORBA_TypeCode t, CDR_Codec* c, TCEncodeContext* ctx);
+static void tc_dec_tk_string(CORBA_TypeCode t, CDR_Codec* c, TCDecodeContext* ctx);
+static void tc_enc_tk_struct(CORBA_TypeCode t, CDR_Codec* c, TCEncodeContext* ctx);
+static void tc_dec_tk_struct(CORBA_TypeCode t, CDR_Codec* c, TCDecodeContext* ctx);
+static void tc_enc_tk_union(CORBA_TypeCode t, CDR_Codec* c, TCEncodeContext* ctx);
+static void tc_dec_tk_union(CORBA_TypeCode t, CDR_Codec* c, TCDecodeContext* ctx);
+static void tc_enc_tk_enum(CORBA_TypeCode t, CDR_Codec* c, TCEncodeContext* ctx);
+static void tc_dec_tk_enum(CORBA_TypeCode t, CDR_Codec* c, TCDecodeContext* ctx);
+static void tc_enc_tk_alias(CORBA_TypeCode t, CDR_Codec* c, TCEncodeContext* ctx);
+static void tc_dec_tk_alias(CORBA_TypeCode t, CDR_Codec* c, TCDecodeContext* ctx);
+static void tc_enc_tk_except(CORBA_TypeCode t, CDR_Codec* c, TCEncodeContext* ctx);
+static void tc_dec_tk_except(CORBA_TypeCode t, CDR_Codec* c, TCDecodeContext* ctx);
+static void tc_enc_tk_array(CORBA_TypeCode t, CDR_Codec* c, TCEncodeContext* ctx);
+static void tc_dec_tk_array(CORBA_TypeCode t, CDR_Codec* c, TCDecodeContext* ctx);
+static void tc_enc_tk_fixed(CORBA_TypeCode t, CDR_Codec* c, TCEncodeContext* ctx);
+static void tc_dec_tk_fixed(CORBA_TypeCode t, CDR_Codec* c, TCDecodeContext* ctx);
+static void tc_enc_tk_wstring(CORBA_TypeCode t, CDR_Codec* c, TCEncodeContext* ctx);
+static void tc_dec_tk_wstring(CORBA_TypeCode t, CDR_Codec* c, TCDecodeContext* ctx);
+
+
+
+typedef void
+(*CORBA_TypeCodeEncoder)(CORBA_TypeCode t,
+ CDR_Codec* c,
+ TCEncodeContext* ctx);
+
+typedef void
+(*CORBA_TypeCodeDecoder)(CORBA_TypeCode t,
+ CDR_Codec* c,
+ TCDecodeContext* ctx);
+
+
+typedef enum{
+ TK_EMPTY,
+ TK_SIMPLE,
+ TK_COMPLEX
+} TkType;
+
+typedef struct{
+ TkType type;
+ CORBA_TypeCodeEncoder encoder;
+ CORBA_TypeCodeDecoder decoder;
+} TkInfo;
+
+static const TkInfo tk_info[CORBA_tk_last]={
+ {TK_EMPTY, NULL, NULL}, /* tk_null */
+ {TK_EMPTY, NULL, NULL}, /* tk_void */
+ {TK_EMPTY, NULL, NULL}, /* tk_short */
+ {TK_EMPTY, NULL, NULL}, /* tk_long */
+ {TK_EMPTY, NULL, NULL}, /* tk_ushort */
+ {TK_EMPTY, NULL, NULL}, /* tk_ulong */
+ {TK_EMPTY, NULL, NULL}, /* tk_float */
+ {TK_EMPTY, NULL, NULL}, /* tk_double */
+ {TK_EMPTY, NULL, NULL}, /* tk_boolean */
+ {TK_EMPTY, NULL, NULL}, /* tk_char */
+ {TK_EMPTY, NULL, NULL}, /* tk_octet */
+ {TK_EMPTY, NULL, NULL}, /* tk_any */
+ {TK_EMPTY, NULL, NULL}, /* tk_TypeCode */
+ {TK_EMPTY, NULL, NULL}, /* tk_Principal */
+ {TK_COMPLEX, tc_enc_tk_objref, tc_dec_tk_objref}, /* tk_objref */
+ {TK_COMPLEX, tc_enc_tk_struct, tc_dec_tk_struct}, /* tk_struct */
+ {TK_COMPLEX, tc_enc_tk_union, tc_dec_tk_union}, /* tk_union */
+ {TK_COMPLEX, tc_enc_tk_enum, tc_dec_tk_enum}, /* tk_enum */
+ {TK_SIMPLE, tc_enc_tk_string, tc_dec_tk_string}, /* tk_string */
+ {TK_COMPLEX, tc_enc_tk_sequence, tc_dec_tk_sequence}, /* tk_sequence */
+ {TK_COMPLEX, tc_enc_tk_array, tc_dec_tk_array}, /* tk_array */
+ {TK_COMPLEX, tc_enc_tk_alias, tc_dec_tk_alias}, /* tk_alias */
+ {TK_COMPLEX, tc_enc_tk_except, tc_dec_tk_except}, /* tk_except */
+ {TK_EMPTY, NULL, NULL}, /* tk_longlong */
+ {TK_EMPTY, NULL, NULL}, /* tk_ulonglong */
+ {TK_EMPTY, NULL, NULL}, /* tk_longdouble */
+ {TK_EMPTY, NULL, NULL}, /* tk_wchar */
+ {TK_SIMPLE, tc_enc_tk_wstring, tc_dec_tk_wstring}, /* tk_wstring */
+ {TK_SIMPLE, tc_enc_tk_fixed, tc_dec_tk_fixed} /* tk_fixed */
+};
+
+void ORBit_encode_CORBA_TypeCode(CORBA_TypeCode t, GIOPSendBuffer* buf)
+{
+ CDR_Codec codec_d;
+ CDR_Codec* codec = &codec_d;
+ TCEncodeContext ctx;
+ GSList* l;
+ CORBA_octet codecbuf[2048];
+
+ CDR_codec_init_static(codec);
+
+ codec->wptr = 0;
+ codec->buffer = codecbuf;
+ codec->release_buffer = FALSE;
+ codec->buf_len = 2048;
+ codec->data_endian=FLAG_ENDIANNESS;
+
+ ctx.current_idx=0;
+ ctx.prior_tcs=NULL;
+ tc_enc(t, codec, &ctx);
+ for(l=ctx.prior_tcs;l;l=l->next)
+ g_free(l->data);
+ g_slist_free(ctx.prior_tcs);
+ giop_send_buffer_append_mem_indirect(buf,
+ codec->buffer,
+ codec->wptr);
+}
+
+void ORBit_decode_CORBA_TypeCode(CORBA_TypeCode* t, GIOPRecvBuffer* buf)
+{
+ CDR_Codec codec_d;
+ CDR_Codec* codec = &codec_d;
+ TCDecodeContext ctx;
+ GSList* l;
+
+ CDR_codec_init_static(codec);
+ codec->buffer=buf->cur;
+ codec->release_buffer=CORBA_FALSE;
+ codec->readonly=CORBA_TRUE;
+ codec->buf_len = /* hope this is correct */
+ ((guchar *)buf->message_body) +
+ GIOP_MESSAGE_BUFFER(buf)->message_header.message_size
+ - ((guchar *)buf->cur);
+
+ codec->data_endian=GIOP_MESSAGE_BUFFER(buf)->message_header.flags & 1;
+
+ ctx.current_idx=0;
+ ctx.prior_tcs=NULL;
+ tc_dec(t, codec, &ctx);
+ for(l=ctx.prior_tcs;l;l=l->next)
+ g_free(l->data);
+ g_slist_free(ctx.prior_tcs);
+ buf->cur = ((guchar *)buf->cur) + codec->rptr;
+}
+
+
+/* Encode a typecode to a codec, possibly recursively */
+
+static void tc_enc(CORBA_TypeCode tc,
+ CDR_Codec* codec,
+ TCEncodeContext* ctx)
+{
+ TCRecursionNode* node;
+ const TkInfo* info;
+ GSList* l;
+ CORBA_octet codecbuf[2048];
+ CDR_Codec encaps_d;
+ CDR_Codec* encaps = &encaps_d;
+
+ g_assert(CLAMP(0, tc->kind, CORBA_tk_last) == tc->kind);
+
+ for(l=ctx->prior_tcs;l;l=l->next){
+ TCRecursionNode* node=l->data;
+ /* CORBA_CORBA_TypeCode_equal might save space, but is slow.. */
+ if(node->tc==tc){
+ CDR_put_ulong(codec, CORBA_tk_recursive);
+ CDR_put_long(codec,
+ node->index
+ -ctx->current_idx
+ -codec->wptr);
+ return;
+ }
+ }
+
+ /* All right, this isn't a previously met type. So record it. */
+ /* NOTE: put kind before recording index so alignment is dealt with! */
+ CDR_put_ulong(codec, tc->kind);
+
+ node=g_new(TCRecursionNode, 1);
+ node->tc=tc;
+ node->index=ctx->current_idx+codec->wptr - 4; /* -4 for kind */
+ ctx->prior_tcs=g_slist_prepend(ctx->prior_tcs, node);
+
+ info=&tk_info[tc->kind];
+ switch(info->type){
+ guint tmp_index;
+ case TK_EMPTY:
+ break;
+ case TK_COMPLEX:
+ tmp_index=ctx->current_idx;
+ ctx->current_idx+=codec->wptr+4; /* +4 for the length */
+ CDR_codec_init_static(encaps);
+ encaps->wptr = 0;
+ encaps->buffer = codecbuf;
+ encaps->release_buffer = FALSE;
+ encaps->buf_len = 2048;
+ encaps->data_endian=FLAG_ENDIANNESS;
+ CDR_put_octet(encaps, FLAG_ENDIANNESS);
+ (info->encoder)(tc, encaps, ctx);
+ CDR_put_ulong(codec, encaps->wptr);
+ /* Now this is a time hog */
+ CDR_put_octets(codec, encaps->buffer, encaps->wptr);
+ ctx->current_idx=tmp_index;
+ break;
+ case TK_SIMPLE:
+ (info->encoder)(tc, codec, ctx);
+ }
+}
+
+static void
+ORBit_TypeCode_release(gpointer obj, CORBA_Environment *ev)
+{
+ /* we will initialize the TC_ constants with a negative refcount */
+ if(ORBIT_ROOT_OBJECT(obj)->refs >= 0) {
+ ORBIT_ROOT_OBJECT_UNREF(obj);
+
+ if(ORBIT_ROOT_OBJECT(obj)->refs <= 0) {
+ CORBA_TypeCode tc = obj;
+ int i;
+
+ g_free(tc->name);
+ g_free(tc->repo_id);
+
+ for(i = 0; i < tc->sub_parts; i++) {
+ if(tc->subnames)
+ g_free(tc->subnames[i]);
+
+ if(tc->subtypes)
+ CORBA_Object_release((CORBA_Object)tc->subtypes[i], ev);
+
+ if(tc->sublabels)
+ CORBA_any__free(&tc->sublabels[i], NULL, TRUE);
+ }
+
+ g_free(tc->subnames);
+ g_free(tc->subtypes);
+ g_free(tc->sublabels);
+
+ if(tc->discriminator)
+ CORBA_Object_release((CORBA_Object)tc->discriminator, ev);
+
+ g_free(obj);
+ }
+
+ }
+}
+
+const ORBit_RootObject_Interface ORBit_TypeCode_epv = {
+ &ORBit_TypeCode_release
+};
+
+static void tc_dec(CORBA_TypeCode* t, CDR_Codec* c, TCDecodeContext* ctx)
+{
+ CORBA_TCKind kind;
+ CORBA_TypeCode tc;
+ const TkInfo* info;
+ TCRecursionNode* node;
+ CDR_Codec encaps_d;
+ CDR_Codec* encaps = &encaps_d;
+
+ CDR_get_ulong(c, &kind);
+
+ g_assert(CLAMP(0, kind, CORBA_tk_last) == kind);
+
+ if(kind==CORBA_tk_recursive){
+ CORBA_long offset;
+ GSList* l;
+ CDR_get_ulong(c, &offset);
+ for(l=ctx->prior_tcs;l;l=l->next){
+ node=l->data;
+ /* NOTE: below, -4 is b/c we already read offset */
+ if(node->index==ctx->current_idx+c->rptr+offset-4){
+ *t=node->tc;
+ return;
+ }
+ }
+ ORBit_Trace(TraceMod_ORB, TraceLevel_Error,
+ "tc_dec: Invalid CORBA_TypeCode recursion offset "
+ "in input buffer\n");
+ g_assert_not_reached();
+ }
+
+ ORBit_Trace(TraceMod_TC, TraceLevel_Debug, "codec->host_endian: %d, codec->data_endian: %d\n", c->host_endian, c->data_endian);
+ ORBit_Trace(TraceMod_TC, TraceLevel_Debug, "kind: %d, CORBA_tk_last: %d\n", kind, CORBA_tk_last);
+ g_assert(kind<CORBA_tk_last);
+
+ node=g_new(TCRecursionNode, 1);
+ node->index=ctx->current_idx+c->rptr-4; /* -4 for the TCKind */
+ info=&tk_info[kind];
+
+ tc=g_new0(struct CORBA_TypeCode_struct, 1);
+
+ /* Passing in NULL for CORBA_Environment is patently dangerous. */
+ ORBit_pseudo_object_init((ORBit_PseudoObject)tc,
+ ORBIT_PSEUDO_TYPECODE, NULL);
+ ORBit_RootObject_set_interface((ORBit_RootObject)tc,
+ (ORBit_RootObject_Interface *)&ORBit_TypeCode_epv,
+ NULL);
+
+ tc->kind=kind;
+ switch(info->type){
+ guint tmp_index;
+ CORBA_octet o;
+
+ case TK_EMPTY:
+ break;
+
+ case TK_COMPLEX:
+ tmp_index=ctx->current_idx;
+ CDR_codec_init_static(encaps);
+ CDR_get_ulong(c, &encaps->buf_len);
+ ctx->current_idx+=c->rptr;
+ encaps->buffer=&c->buffer[c->rptr];
+ encaps->release_buffer=CORBA_FALSE;
+ CDR_get_octet(encaps, &o);
+ encaps->data_endian=o;
+ (info->decoder)(tc, encaps, ctx);
+ c->rptr += encaps->buf_len;
+ ctx->current_idx=tmp_index;
+ break;
+ case TK_SIMPLE:
+ (info->decoder)(tc, c, ctx);
+ break;
+ }
+ node->tc=tc;
+ ctx->prior_tcs=g_slist_prepend(ctx->prior_tcs, node);
+ *t=tc;
+}
+
+
+
+static void tc_enc_tk_objref(CORBA_TypeCode t, CDR_Codec* c, TCEncodeContext* ctx)
+{
+ CDR_put_string(c, t->repo_id);
+ CDR_put_string(c, t->name);
+}
+
+static void tc_dec_tk_objref(CORBA_TypeCode t, CDR_Codec* c, TCDecodeContext* ctx)
+{
+ CDR_get_string(c, &t->repo_id);
+ CDR_get_string(c, &t->name);
+}
+
+static void tc_enc_tk_sequence(CORBA_TypeCode t, CDR_Codec* c, TCEncodeContext* ctx)
+{
+ tc_enc(*t->subtypes, c, ctx);
+ CDR_put_ulong(c, t->length);
+}
+
+static void tc_dec_tk_sequence(CORBA_TypeCode t, CDR_Codec* c, TCDecodeContext* ctx)
+{
+ t->subtypes=g_new(CORBA_TypeCode, 1);
+ tc_dec(&t->subtypes[0], c, ctx);
+ CORBA_Object_duplicate((CORBA_Object)t->subtypes[0], NULL);
+ CDR_get_ulong(c, &t->length);
+}
+
+static void tc_enc_tk_string(CORBA_TypeCode t, CDR_Codec* c, TCEncodeContext* ctx)
+{
+ CDR_put_ulong(c, t->length);
+}
+
+static void tc_dec_tk_string(CORBA_TypeCode t, CDR_Codec* c, TCDecodeContext* ctx)
+{
+ CDR_get_ulong(c, &t->length);
+}
+
+static void tc_enc_tk_struct(CORBA_TypeCode t, CDR_Codec* c, TCEncodeContext* ctx)
+{
+ CORBA_unsigned_long i;
+ CDR_put_string(c, t->repo_id);
+ CDR_put_string(c, t->name);
+ CDR_put_ulong(c, t->sub_parts);
+ for(i=0;i<t->sub_parts;i++){
+ CDR_put_string(c, t->subnames[i]);
+ tc_enc(t->subtypes[i], c, ctx);
+ }
+}
+
+static void tc_dec_tk_struct(CORBA_TypeCode t, CDR_Codec* c, TCDecodeContext* ctx)
+{
+ CORBA_unsigned_long i;
+ CDR_get_string(c, &t->repo_id);
+ CDR_get_string(c, &t->name);
+ CDR_get_ulong(c, &t->sub_parts);
+ t->subnames=g_new(gchar*, t->sub_parts);
+ t->subtypes=g_new(CORBA_TypeCode, t->sub_parts);
+ for(i=0;i<t->sub_parts;i++){
+ CDR_get_string(c, &t->subnames[i]);
+ tc_dec(&t->subtypes[i], c, ctx);
+ CORBA_Object_duplicate((CORBA_Object)t->subtypes[i], NULL);
+ }
+}
+
+#define UNION_MEMBERS(dir) \
+ MEMBER_LOOPER_##dir(ulong, long, long); \
+ case CORBA_tk_enum: /* fall through */ \
+ MEMBER_LOOPER_##dir(ulong, unsigned_long, ulong); \
+ MEMBER_LOOPER_##dir(octet, boolean, boolean); \
+ MEMBER_LOOPER_##dir(octet, char, char); \
+ MEMBER_LOOPER_##dir(ushort, short, short); \
+ MEMBER_LOOPER_##dir(ushort, unsigned_short, ushort); \
+ MEMBER_LOOPER_##dir(ulong_long, long_long, longlong); \
+ MEMBER_LOOPER_##dir(ulong_long, unsigned_long_long, ulonglong); \
+ /* MEMBER_LOOPER_##dir(wchar, wchar, wchar); */
+
+
+static void tc_enc_tk_union(CORBA_TypeCode t, CDR_Codec* c, TCEncodeContext* ctx)
+{
+ CORBA_unsigned_long i;
+ CDR_put_string(c, t->repo_id);
+ CDR_put_string(c, t->name);
+ tc_enc(t->discriminator, c, ctx);
+ CDR_put_long(c, t->default_index);
+ CDR_put_ulong(c, t->sub_parts);
+ i=t->sub_parts;
+ /* Thank goodness the discriminator types are rather limited,
+ we can do the marshalling inline.. */
+#define MEMBER_LOOPER_ENC(putname, typename, tkname) \
+ case CORBA_tk_##tkname: \
+ for(i=0;i<t->sub_parts;i++){ \
+ CDR_put_##putname(c, *(CORBA_##typename*) \
+ (t->sublabels[i]._value)); \
+ CDR_put_string(c, t->subnames[i]); \
+ tc_enc(t->subtypes[i], c, ctx); \
+ } \
+ break
+
+ switch(t->discriminator->kind){
+ UNION_MEMBERS(ENC);
+ default:
+ ORBit_Trace(TraceMod_ORB, TraceLevel_Error,
+ "tc_enc_tk_union: Illegal union discriminator "
+ "type %s\n", t->discriminator->name);
+ }
+}
+
+static void tc_dec_tk_union(CORBA_TypeCode t, CDR_Codec* c, TCDecodeContext* ctx)
+{
+ CORBA_unsigned_long i;
+ CDR_get_string(c, &t->repo_id);
+ CDR_get_string(c, &t->name);
+ tc_dec(&t->discriminator, c, ctx);
+ CORBA_Object_duplicate((CORBA_Object)t->discriminator, NULL);
+ CDR_get_ulong(c, &t->default_index);
+ CDR_get_ulong(c, &t->sub_parts);
+
+ t->sublabels=g_new(CORBA_any, t->sub_parts);
+ t->subnames=g_new(gchar*, t->sub_parts);
+ t->subtypes=g_new(CORBA_TypeCode, t->sub_parts);
+
+#define MEMBER_LOOPER_DEC(getname, typename, tkname) \
+ case CORBA_tk_##tkname: \
+ for(i=0;i<t->sub_parts;i++){ \
+ t->sublabels[i]._type = \
+ CORBA_Object_duplicate((CORBA_Object)t->discriminator, NULL); \
+ t->sublabels[i]._value = g_new(CORBA_##typename,1); \
+ t->sublabels[i]._release = CORBA_TRUE; \
+ CDR_get_##getname(c, t->sublabels[i]._value); \
+ CDR_get_string(c, &t->subnames[i]); \
+ tc_dec(&t->subtypes[i], c, ctx); \
+ CORBA_Object_duplicate((CORBA_Object)t->subtypes[i], NULL); \
+ } \
+ break
+
+ switch(t->discriminator->kind){
+ UNION_MEMBERS(DEC);
+ default:
+ /* XXX: what is correct error handling */
+ g_assert(!"Not yet implemented.");
+ }
+}
+
+static void tc_enc_tk_enum(CORBA_TypeCode t, CDR_Codec* c, TCEncodeContext* ctx)
+{
+ CORBA_unsigned_long i;
+ CDR_put_string(c, t->repo_id);
+ CDR_put_string(c, t->name);
+ CDR_put_ulong(c, t->sub_parts);
+ for(i=0;i<t->sub_parts;i++)
+ CDR_put_string(c, t->subnames[i]);
+}
+
+static void tc_dec_tk_enum(CORBA_TypeCode t, CDR_Codec* c, TCDecodeContext* ctx)
+{
+ CORBA_unsigned_long i;
+ CDR_get_string(c, &t->repo_id);
+ CDR_get_string(c, &t->name);
+ CDR_get_ulong(c, &t->sub_parts);
+ t->subnames=g_new(gchar*, t->sub_parts);
+ for(i=0;i<t->sub_parts;i++)
+ CDR_get_string(c, &t->subnames[i]);
+}
+
+static void tc_enc_tk_alias(CORBA_TypeCode t, CDR_Codec* c, TCEncodeContext* ctx)
+{
+ CDR_put_string(c, t->repo_id);
+ CDR_put_string(c, t->name);
+ tc_enc(*t->subtypes, c, ctx);
+}
+
+static void tc_dec_tk_alias(CORBA_TypeCode t, CDR_Codec* c, TCDecodeContext* ctx)
+{
+ CDR_get_string(c, &t->repo_id);
+ CDR_get_string(c, &t->name);
+ t->subtypes=g_new(CORBA_TypeCode, 1);
+ tc_dec(t->subtypes, c, ctx);
+ CORBA_Object_duplicate((CORBA_Object)t->subtypes[0], NULL);
+}
+
+
+static void tc_enc_tk_except(CORBA_TypeCode t, CDR_Codec* c, TCEncodeContext* ctx)
+{
+ gulong i;
+ CDR_put_string(c, t->repo_id);
+ CDR_put_string(c, t->name);
+ CDR_put_ulong(c, t->sub_parts);
+ for(i=0;i<t->length;i++){
+ CDR_put_string(c, t->subnames[i]);
+ tc_enc(t->subtypes[i], c, ctx);
+ }
+}
+
+static void tc_dec_tk_except(CORBA_TypeCode t, CDR_Codec* c, TCDecodeContext* ctx)
+{
+ gulong i;
+ CDR_get_string(c, &t->repo_id);
+ CDR_get_string(c, &t->name);
+ CDR_get_ulong(c, &t->sub_parts);
+ t->subtypes=g_new(CORBA_TypeCode, t->sub_parts);
+ t->subnames=g_new(gchar*, t->sub_parts);
+ for(i=0;i<t->length;i++){
+ CDR_get_string(c, &t->subnames[i]);
+ tc_dec(&t->subtypes[i], c, ctx);
+ CORBA_Object_duplicate((CORBA_Object)t->subtypes[i], NULL);
+ }
+}
+
+static void tc_enc_tk_array(CORBA_TypeCode t, CDR_Codec* c, TCEncodeContext* ctx)
+{
+ tc_enc(*t->subtypes, c, ctx);
+ CDR_put_ulong(c, t->length);
+}
+
+static void tc_dec_tk_array(CORBA_TypeCode t, CDR_Codec* c, TCDecodeContext* ctx)
+{
+ t->subtypes=g_new(CORBA_TypeCode, 1);
+ tc_dec(t->subtypes, c, ctx);
+ CORBA_Object_duplicate((CORBA_Object)t->subtypes[0], NULL);
+ CDR_get_ulong(c, &t->length);
+}
+
+static void tc_enc_tk_wstring(CORBA_TypeCode t, CDR_Codec* c, TCEncodeContext* ctx)
+{
+ g_assert(!"Not yet implemented.");
+}
+
+static void tc_dec_tk_wstring(CORBA_TypeCode t, CDR_Codec* c, TCDecodeContext* ctx)
+{
+ g_assert(!"Not yet implemented.");
+}
+
+static void tc_enc_tk_fixed(CORBA_TypeCode t, CDR_Codec* c, TCEncodeContext* ctx)
+{
+ g_assert(!"Not yet implemented.");
+}
+
+static void tc_dec_tk_fixed(CORBA_TypeCode t, CDR_Codec* c, TCDecodeContext* ctx)
+{
+ g_assert(!"Not yet implemented.");
+}
diff -urN linux-2.4.1/net/korbit/orb/orbit_typecode.h linux-2.4.1-korbit/net/korbit/orb/orbit_typecode.h
--- linux-2.4.1/net/korbit/orb/orbit_typecode.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/orbit_typecode.h Thu Feb 1 16:21:53 2001
@@ -0,0 +1,10 @@
+#ifndef _ORBIT_ORBIT_TYPECODE_H_
+#define _ORBIT_ORBIT_TYPECODE_H_
+
+#include "orbit_types.h"
+
+extern const ORBit_RootObject_Interface ORBit_TypeCode_epv;
+void ORBit_encode_CORBA_TypeCode(CORBA_TypeCode tc, GIOPSendBuffer* buf);
+void ORBit_decode_CORBA_TypeCode(CORBA_TypeCode* tc, GIOPRecvBuffer* buf);
+
+#endif
diff -urN linux-2.4.1/net/korbit/orb/orbit_types.h linux-2.4.1-korbit/net/korbit/orb/orbit_types.h
--- linux-2.4.1/net/korbit/orb/orbit_types.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/orbit_types.h Thu Feb 1 16:20:50 2001
@@ -0,0 +1,176 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter and Red Hat Software
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#ifndef _ORBIT_TYPES_H_
+#define _ORBIT_TYPES_H_
+
+#include <stddef.h> /* for wchar_t */
+#include <sys/types.h> /* for sysdep types */
+#include <netinet/in.h> /* for sockaddr_in */
+#include <sys/uio.h> /* for struct iovec */
+
+#include <ORBitutil/basic_types.h>
+
+#define CORBA_TRUE 1
+#define CORBA_FALSE 0
+
+typedef CORBA_char *CORBA_ORBid;
+
+typedef CORBA_unsigned_long CORBA_ServiceOption;
+typedef CORBA_unsigned_long CORBA_ServiceDetailType;
+
+#include "corba_orb.h"
+
+/*
+ * CORBA_RepositoryId and CORBA_Identifier are defined in the Interface
+ * Repository, but are needed in other interfaces in the ORB itself.
+ */
+#if !defined(_CORBA_Identifier_defined)
+#define _CORBA_Identifier_defined 1
+typedef CORBA_char *CORBA_Identifier;
+#define CORBA_Identifier__free CORBA_string__free
+#endif
+
+#if !defined(_CORBA_RepositoryId_defined)
+#define _CORBA_RepositoryId_defined 1
+typedef CORBA_char *CORBA_RepositoryId;
+#define CORBA_RepositoryId__free CORBA_string__free
+#endif
+
+#include "corba_any.h"
+
+typedef struct CORBA_ServiceDetail_type CORBA_ServiceDetail;
+typedef struct CORBA_Request_type *CORBA_Request;
+typedef struct CORBA_ServerRequest_type *CORBA_ServerRequest;
+typedef struct CORBA_DynFixed_type *CORBA_DynFixed;
+typedef struct CORBA_Current_type *CORBA_Current;
+typedef void CORBA_Status;
+typedef CORBA_unsigned_long CORBA_enum;
+typedef CORBA_unsigned_long CORBA_Flags;
+
+typedef struct CORBA_NVList_type {
+ CORBA_Flags flags;
+ GArray *list;
+} CORBA_NVList;
+
+#include "corba_context.h"
+
+#include "corba_portableserver.h"
+
+#include "corba_env.h"
+
+#include "corba_sequences_type.h"
+
+#include "corba_basic_sequences_type.h"
+
+#include "corba_object.h"
+
+#include "orbit_object_type.h"
+
+#include "corba_object_type.h"
+
+#include "corba_orb_type.h"
+
+#include "corba_typecode.h"
+#include "corba_typecode_type.h"
+#include "corba_any_type.h"
+#include "corba_any_proto.h"
+
+#if !defined(TC_IMPL_TC_CORBA_Identifier_0)
+#define TC_IMPL_TC_CORBA_Identifier_0 '/'
+#define TC_CORBA_Identifier ((CORBA_TypeCode)&TC_CORBA_Identifier_struct)
+extern const struct CORBA_TypeCode_struct TC_CORBA_Identifier_struct;
+#endif
+
+#if !defined(TC_IMPL_TC_CORBA_RepositoryId_0)
+#define TC_IMPL_TC_CORBA_RepositoryId_0 '/'
+extern const struct CORBA_TypeCode_struct TC_CORBA_RepositoryId_struct;
+#define TC_CORBA_RepositoryId ((CORBA_TypeCode)&TC_CORBA_RepositoryId_struct)
+#endif
+
+/* 19.14 */
+
+/* XXX */
+typedef struct CORBA_fixed_d_s {
+ CORBA_unsigned_short _digits;
+ CORBA_short _scale;
+ signed char _sign;
+ signed char _value[1];
+} CORBA_fixed_d_s;
+
+#include "corba_env_type.h"
+
+
+typedef struct CORBA_WrongTransaction {
+ int dummy;
+} CORBA_WrongTransaction;
+
+#define CORBA_ARG_IN (1<<0)
+#define CORBA_ARG_OUT (1<<1)
+#define CORBA_ARG_INOUT (1<<2)
+#define CORBA_CTX_RESTRICT_SCOPE (1<<3)
+#define CORBA_CTX_DELETE_DESCENDENTS (1<<4)
+#define CORBA_OUT_LIST_MEMORY (1<<5)
+#define CORBA_IN_COPY_VALUE (1<<6)
+#define CORBA_DEPENDENT_LIST (1<<7)
+#define CORBA_INV_NO_RESPONSE (1<<8)
+#define CORBA_INV_TERM_ON_ERROR (1<<9)
+#define CORBA_RESP_NO_WAIT (1<<10)
+
+typedef struct CORBA_NamedValue {
+ CORBA_Identifier name; /* argument name */
+ CORBA_any argument; /* argument */
+ CORBA_long len; /* length/count of argument value */
+ CORBA_Flags arg_modes; /* argument mode flags */
+} CORBA_NamedValue;
+
+typedef CORBA_char *CORBA_FieldName;
+
+typedef struct CORBA_NameValuePair {
+ CORBA_FieldName id;
+ CORBA_any value;
+} CORBA_NameValuePair;
+
+struct CORBA_Current_type {
+ int fill_me_in;
+};
+
+#include "corba_portableserver_type.h"
+
+typedef CORBA_unsigned_short CORBA_ServiceType;
+
+#define CORBA_Security (1)
+
+struct CORBA_ServiceDetail_type {
+ CORBA_ServiceDetailType service_detail_type;
+ CORBA_sequence_octet service_detail;
+};
+
+typedef struct CORBA_ServiceInformation_struct {
+ CORBA_sequence_ServiceOption service_options;
+ CORBA_sequence_ServiceDetail service_details;
+} CORBA_ServiceInformation;
+
+#endif /* !_ORBIT_TYPES_H_ */
diff -urN linux-2.4.1/net/korbit/orb/poa.c linux-2.4.1-korbit/net/korbit/orb/poa.c
--- linux-2.4.1/net/korbit/orb/poa.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/poa.c Thu Feb 1 11:47:14 2001
@@ -0,0 +1,1387 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter, and Red Hat Software
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ * Elliot Lee <sopwith@redhat.com>
+ *
+ */
+
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+
+#include "orbit.h"
+#include "orbit_poa.h"
+#include "genrand.h"
+
+PortableServer_ThreadPolicyValue
+PortableServer_ThreadPolicy__get_value(PortableServer_ThreadPolicy obj, CORBA_Environment *ev)
+{
+ if(!obj) {
+ ev->_major = 2 ;
+ goto error_exit;
+ }
+ ev->_major = CORBA_NO_EXCEPTION;
+
+ return obj->value;
+
+error_exit:
+ CORBA_exception_set_system(ev, 0, CORBA_COMPLETED_NO);
+ return 0;
+}
+
+PortableServer_LifespanPolicyValue
+PortableServer_LifespanPolicy__get_value(PortableServer_LifespanPolicy obj, CORBA_Environment *ev)
+{
+ if(!obj) {
+ ev->_major = 2 ;
+ goto error_exit;
+ }
+
+ ev->_major = CORBA_NO_EXCEPTION;
+ return obj->value;
+
+error_exit:
+ CORBA_exception_set_system(ev, 0, CORBA_COMPLETED_NO);
+ return 0;
+}
+
+PortableServer_IdUniquenessPolicyValue
+PortableServer_IdUniquenessPolicy__get_value(PortableServer_IdUniquenessPolicy obj, CORBA_Environment *ev)
+{
+ if(!obj) {
+ ev->_major = 2 ;
+ goto error_exit;
+ }
+
+ ev->_major = CORBA_NO_EXCEPTION;
+ return obj->value;
+
+error_exit:
+ CORBA_exception_set_system(ev, 0, CORBA_COMPLETED_NO);
+ return 0;
+}
+
+PortableServer_IdAssignmentPolicyValue
+PortableServer_IdAssignmentPolicy__get_value(PortableServer_IdAssignmentPolicy obj, CORBA_Environment *ev)
+{
+ if(!obj) {
+ ev->_major = 2 ;
+ goto error_exit;
+ }
+
+ ev->_major = CORBA_NO_EXCEPTION;
+ return obj->value;
+
+error_exit:
+ CORBA_exception_set_system(ev, 0, CORBA_COMPLETED_NO);
+ return 0;
+}
+
+PortableServer_ImplicitActivationPolicyValue
+PortableServer_ImplicitActivationPolicy__get_value(PortableServer_ImplicitActivationPolicy obj, CORBA_Environment *ev)
+{
+ if(!obj) {
+ ev->_major = 2 ;
+ goto error_exit;
+ }
+
+ ev->_major = CORBA_NO_EXCEPTION;
+ return obj->value;
+
+error_exit:
+ CORBA_exception_set_system(ev, 0, CORBA_COMPLETED_NO);
+ return 0;
+}
+
+PortableServer_ServantRetentionPolicyValue
+PortableServer_ServantRetentionPolicy__get_value(PortableServer_ServantRetentionPolicy obj, CORBA_Environment *ev)
+{
+ if(!obj) {
+ ev->_major = 2 ;
+ goto error_exit;
+ }
+
+ ev->_major = CORBA_NO_EXCEPTION;
+ return obj->value;
+
+error_exit:
+ CORBA_exception_set_system(ev, 0, CORBA_COMPLETED_NO);
+ return 0;
+}
+
+PortableServer_RequestProcessingPolicyValue
+PortableServer_RequestProcessingPolicy__get_value(PortableServer_RequestProcessingPolicy obj, CORBA_Environment *ev)
+{
+ if(!obj) {
+ ev->_major = 2 ;
+ goto error_exit;
+ }
+
+ ev->_major = CORBA_NO_EXCEPTION;
+ return obj->value;
+
+error_exit:
+ CORBA_exception_set_system(ev, 0, CORBA_COMPLETED_NO);
+ return 0;
+}
+
+/* make emacs happy; */
+
+PortableServer_POAManager_State
+PortableServer_POAManager_get_state(PortableServer_POAManager obj,
+ CORBA_Environment *ev)
+{
+ if(!obj) {
+ CORBA_exception_set_system(ev,
+ ex_CORBA_BAD_PARAM,
+ CORBA_COMPLETED_NO);
+ return -1;
+ }
+
+ ev->_major = CORBA_NO_EXCEPTION;
+ return obj->state;
+}
+
+/**** PortableServer_POAManager_activate
+ Inputs: 'obj' - a POAManager to activate
+ Outputs: '*ev' - result of the activate operation
+
+ Side effect: Clears the 'held_requests' lists for all POA's
+ associated with the 'obj' POAManager.
+
+ Description: Sets the POAManager state to 'ACTIVE', then
+ goes through all the POA's associated with this
+ POAManager, and makes them re-process their
+ 'held_requests'
+ */
+void
+PortableServer_POAManager_activate(PortableServer_POAManager obj,
+ CORBA_Environment *ev)
+{
+ GSList *todo;
+ GSList *curitem;
+ PortableServer_POA curpoa;
+
+ if(!obj) {
+ CORBA_exception_set_system(ev,
+ ex_CORBA_BAD_PARAM,
+ CORBA_COMPLETED_NO);
+ return;
+ }
+
+ if(obj->state == PortableServer_POAManager_INACTIVE) {
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_PortableServer_POAManager_AdapterInactive,
+ NULL);
+ return;
+ }
+
+ obj->state = PortableServer_POAManager_ACTIVE;
+
+ for(curitem = obj->poa_collection; curitem;
+ curitem = g_slist_next(curitem)) {
+ curpoa = (PortableServer_POA)curitem->data;
+
+ todo = curpoa->held_requests;
+ curpoa->held_requests = NULL;
+
+ g_slist_foreach(todo, (GFunc)ORBit_POA_handle_request,
+ curpoa);
+ g_slist_foreach(todo, (GFunc)giop_recv_buffer_unuse,
+ NULL);
+
+ g_slist_free(todo);
+ }
+ ev->_major = CORBA_NO_EXCEPTION;
+}
+
+void
+PortableServer_POAManager_hold_requests(PortableServer_POAManager obj,
+ CORBA_boolean wait_for_completion,
+ CORBA_Environment *ev)
+{
+ if(!obj) {
+ CORBA_exception_set_system(ev,
+ ex_CORBA_BAD_PARAM,
+ CORBA_COMPLETED_NO);
+ return;
+ }
+
+ if(obj->state == PortableServer_POAManager_INACTIVE) {
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_PortableServer_POAManager_AdapterInactive,
+ NULL);
+ return;
+ }
+
+ obj->state = PortableServer_POAManager_HOLDING;
+ if(!wait_for_completion)
+ g_warning("hold_requests not finished - don't know how to kill outstanding request fulfillments");
+
+ ev->_major = CORBA_NO_EXCEPTION;
+}
+
+void
+PortableServer_POAManager_discard_requests(PortableServer_POAManager obj,
+ CORBA_boolean wait_for_completion,
+ CORBA_Environment *ev)
+{
+ if(!obj) {
+ CORBA_exception_set_system(ev,
+ ex_CORBA_BAD_PARAM,
+ CORBA_COMPLETED_NO);
+ return;
+ }
+
+ if(obj->state == PortableServer_POAManager_INACTIVE) {
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_PortableServer_POAManager_AdapterInactive,
+ NULL);
+ return;
+ }
+
+ obj->state = PortableServer_POAManager_DISCARDING;
+ if(!wait_for_completion)
+ g_warning("discard_requests not finished - don't know how to kill outstanding request fulfillments");
+ ev->_major = CORBA_NO_EXCEPTION;
+}
+
+void
+PortableServer_POAManager_deactivate(PortableServer_POAManager obj,
+ CORBA_boolean etherealize_objects,
+ CORBA_boolean wait_for_completion,
+ CORBA_Environment *ev)
+{
+ if(!obj) {
+ CORBA_exception_set_system(ev,
+ ex_CORBA_BAD_PARAM,
+ CORBA_COMPLETED_NO);
+ return;
+ }
+
+ if(obj->state == PortableServer_POAManager_INACTIVE) {
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_PortableServer_POAManager_AdapterInactive,
+ NULL);
+ return;
+ }
+
+ obj->state = PortableServer_POAManager_INACTIVE;
+
+ if(etherealize_objects)
+ g_slist_foreach(obj->poa_collection, (GFunc)ORBit_POA_etherealize_objects, ev);
+ ev->_major = CORBA_NO_EXCEPTION;
+}
+
+
+CORBA_boolean
+PortableServer_AdapterActivator_unknown_adapter(PortableServer_AdapterActivator obj,
+ PortableServer_POA parent,
+ CORBA_char *name,
+ CORBA_Environment *ev)
+{
+ g_assert(!"Not yet implemented");
+ return(CORBA_FALSE);
+}
+
+
+/**** PortableServer_ServantActivator_incarnate
+ */
+PortableServer_Servant
+
+PortableServer_ServantActivator_incarnate
+(PortableServer_ServantActivator obj,
+ PortableServer_ObjectId *oid,
+ PortableServer_POA adapter,
+ CORBA_Environment *ev)
+{
+ g_assert(!"Not yet implemented");
+ return(NULL);
+}
+
+void
+PortableServer_ServantActivator_etherealize
+(PortableServer_ServantActivator obj,
+ PortableServer_ObjectId *oid, PortableServer_POA adapter,
+ PortableServer_Servant serv,
+ CORBA_boolean cleanup_in_progress,
+ CORBA_boolean remaining_activations,
+ CORBA_Environment *ev)
+{
+ g_assert(!"Not yet implemented");
+ return;
+}
+
+PortableServer_POA
+PortableServer_POA_create_POA
+ (PortableServer_POA poa,
+ CORBA_char *adapter_name,
+ PortableServer_POAManager a_POAManager,
+ CORBA_PolicyList* policies,
+ CORBA_Environment *ev)
+{
+ PortableServer_POA new_poa = NULL;
+ PortableServer_POA check_poa = NULL;
+
+ /* Check for a child POA by the same name in parent */
+ check_poa = PortableServer_POA_find_POA(poa,adapter_name,
+ FALSE, ev);
+ CORBA_exception_free (ev);
+
+ if (!check_poa) {
+ new_poa = ORBit_POA_new(poa->orb,
+ adapter_name, a_POAManager, policies, ev);
+ } else {
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_PortableServer_POA_AdapterAlreadyExists,
+ NULL);
+ new_poa = NULL;
+ }
+
+ if(ev->_major == CORBA_NO_EXCEPTION) {
+ new_poa->parent_poa = poa;
+ ORBit_POA_add_child(poa, new_poa, ev);
+ }
+
+ return new_poa;
+}
+
+/**** PortableServer_POA_find_POA
+ Inputs: 'obj' - a POA
+ 'activate_it' - whether to activate unknown POA's
+
+ Outputs: 'child_poa'
+
+ Description: Finds (and optionally activates) a child POA of 'obj'
+ with the specified names.
+
+ TODO: Activate non-existent adapters if asked.
+
+ */
+PortableServer_POA
+PortableServer_POA_find_POA(PortableServer_POA obj,
+ CORBA_char *adapter_name,
+ CORBA_boolean activate_it,
+ CORBA_Environment *ev)
+{
+ GSList *curitem;
+ PortableServer_POA child_poa;
+
+ for(curitem = obj->child_POAs; curitem;
+ curitem = g_slist_next(curitem)) {
+ child_poa = (PortableServer_POA)curitem->data;
+ if(!strcmp(child_poa->the_name, adapter_name)) {
+ ev->_major = CORBA_NO_EXCEPTION;
+ return child_poa;
+ }
+ }
+
+ if(activate_it)
+ g_warning("Don't yet know how to activate POA named \"%s\"",
+ adapter_name);
+
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_PortableServer_POA_AdapterNonExistent,
+ NULL);
+
+ return NULL;
+}
+
+/**** PortableServer_POA_destroy
+ Inputs: 'obj' - the POA to be destroyed
+ 'etherealize_objects' - flag indicating whether any servant
+ manager should be asked to etherealize
+ objects in the active object map
+ 'wait_for_completion' - flag indicating whether to wait for
+ requests currently being handled
+ */
+void
+PortableServer_POA_destroy(PortableServer_POA obj,
+ CORBA_boolean etherealize_objects,
+ CORBA_boolean wait_for_completion,
+ CORBA_Environment *ev)
+{
+ if(etherealize_objects || !wait_for_completion)
+ g_warning("PortableServer_POA_destroy not yet fully implemented; ignoring flags");
+
+ if(ORBIT_ROOT_OBJECT(obj)->refs > 1)
+ g_warning("POA has multiple refs [%d]",
+ ORBIT_ROOT_OBJECT(obj)->refs);
+
+ CORBA_Object_release((CORBA_Object)obj, ev);
+ ev->_major = CORBA_NO_EXCEPTION;
+}
+
+PortableServer_ThreadPolicy PortableServer_POA_create_thread_policy(PortableServer_POA obj, PortableServer_ThreadPolicyValue value, CORBA_Environment *ev)
+{
+ PortableServer_ThreadPolicy retval;
+
+ retval = g_new(struct PortableServer_ThreadPolicy_type, 1);
+ ORBit_policy_object_init((CORBA_Policy)retval,
+ PortableServer_THREAD_POLICY_ID, ev);
+
+ retval->value = value;
+
+ return (PortableServer_ThreadPolicy)CORBA_Object_duplicate((CORBA_Object)retval, ev);
+}
+
+PortableServer_LifespanPolicy PortableServer_POA_create_lifespan_policy(PortableServer_POA obj, PortableServer_LifespanPolicyValue value, CORBA_Environment *ev)
+{
+ PortableServer_LifespanPolicy retval;
+
+ retval = g_new(struct PortableServer_LifespanPolicy_type, 1);
+ ORBit_policy_object_init((CORBA_Policy)retval,
+ PortableServer_LIFESPAN_POLICY_ID, ev);
+
+ retval->value = value;
+
+ return (PortableServer_LifespanPolicy)CORBA_Object_duplicate((CORBA_Object)retval, ev);
+}
+
+PortableServer_IdUniquenessPolicy PortableServer_POA_create_id_uniqueness_policy(PortableServer_POA obj, PortableServer_IdUniquenessPolicyValue value, CORBA_Environment *ev)
+{
+ PortableServer_IdUniquenessPolicy retval;
+
+ retval = g_new(struct PortableServer_IdUniquenessPolicy_type, 1);
+ ORBit_policy_object_init((CORBA_Policy)retval,
+ PortableServer_ID_UNIQUENESS_POLICY_ID,
+ ev);
+
+ retval->value = value;
+
+ return (PortableServer_IdUniquenessPolicy)CORBA_Object_duplicate((CORBA_Object)retval, ev);
+}
+
+PortableServer_IdAssignmentPolicy PortableServer_POA_create_id_assignment_policy(PortableServer_POA obj, PortableServer_IdAssignmentPolicyValue value, CORBA_Environment *ev)
+{
+ PortableServer_IdAssignmentPolicy retval;
+
+ retval = g_new(struct PortableServer_IdAssignmentPolicy_type, 1);
+ ORBit_policy_object_init((CORBA_Policy)retval,
+ PortableServer_ID_ASSIGNMENT_POLICY_ID, ev);
+
+ retval->value = value;
+
+ return (PortableServer_IdAssignmentPolicy)CORBA_Object_duplicate((CORBA_Object)retval, ev);
+}
+
+PortableServer_ImplicitActivationPolicy PortableServer_POA_create_implicit_activation_policy(PortableServer_POA obj, PortableServer_ImplicitActivationPolicyValue value, CORBA_Environment *ev)
+{
+ PortableServer_ImplicitActivationPolicy retval;
+
+ retval = g_new(struct PortableServer_ImplicitActivationPolicy_type, 1);
+ ORBit_policy_object_init((CORBA_Policy)retval,
+ PortableServer_IMPLICIT_ACTIVATION_POLICY_ID, ev);
+
+ retval->value = value;
+
+ return (PortableServer_ImplicitActivationPolicy)CORBA_Object_duplicate((CORBA_Object)retval, ev);
+}
+
+PortableServer_ServantRetentionPolicy PortableServer_POA_create_servant_retention_policy(PortableServer_POA obj, PortableServer_ServantRetentionPolicyValue value, CORBA_Environment *ev)
+{
+ PortableServer_ServantRetentionPolicy retval;
+
+ retval = g_new(struct PortableServer_ServantRetentionPolicy_type, 1);
+ ORBit_policy_object_init((CORBA_Policy)retval,
+ PortableServer_SERVANT_RETENTION_POLICY_ID, ev);
+
+ retval->value = value;
+
+ return (PortableServer_ServantRetentionPolicy)CORBA_Object_duplicate((CORBA_Object)retval, ev);
+}
+
+PortableServer_RequestProcessingPolicy PortableServer_POA_create_request_processing_policy(PortableServer_POA obj, PortableServer_RequestProcessingPolicyValue value, CORBA_Environment *ev)
+{
+ PortableServer_RequestProcessingPolicy retval;
+
+ retval = g_new(struct PortableServer_RequestProcessingPolicy_type, 1);
+ ORBit_policy_object_init((CORBA_Policy)retval,
+ PortableServer_REQUEST_PROCESSING_POLICY_ID, ev);
+
+ retval->value = value;
+
+ return (PortableServer_RequestProcessingPolicy)CORBA_Object_duplicate((CORBA_Object)retval, ev);
+}
+
+CORBA_char *PortableServer_POA__get_the_name(PortableServer_POA obj, CORBA_Environment *ev)
+{
+ g_assert(obj);
+ g_assert(obj->the_name);
+ return obj->the_name;
+}
+
+PortableServer_POA
+PortableServer_POA__get_the_parent(PortableServer_POA obj,
+ CORBA_Environment *ev)
+{
+ if(!obj) {
+ CORBA_exception_set_system(ev,
+ ex_CORBA_BAD_PARAM,
+ CORBA_COMPLETED_NO);
+ return NULL;
+ }
+
+ return obj->parent_poa;
+}
+
+PortableServer_POAManager
+PortableServer_POA__get_the_POAManager(PortableServer_POA obj,
+ CORBA_Environment *ev)
+{
+ if(!obj) {
+ CORBA_exception_set_system(ev,
+ ex_CORBA_BAD_PARAM,
+ CORBA_COMPLETED_NO);
+ return NULL;
+ }
+
+ return obj->the_POAManager;
+}
+
+PortableServer_AdapterActivator PortableServer_POA__get_the_activator(PortableServer_POA obj, CORBA_Environment *ev)
+{
+ if(!obj) {
+ CORBA_exception_set_system(ev,
+ ex_CORBA_BAD_PARAM,
+ CORBA_COMPLETED_NO);
+ return NULL;
+ }
+
+ return obj->the_activator;
+}
+
+void PortableServer_POA__set_the_activator(PortableServer_POA obj, PortableServer_AdapterActivator the_activator, CORBA_Environment *ev)
+{
+ if(!obj) {
+ CORBA_exception_set_system(ev,
+ ex_CORBA_BAD_PARAM,
+ CORBA_COMPLETED_NO);
+ return;
+ }
+
+ obj->the_activator = the_activator;
+}
+
+PortableServer_ServantManager PortableServer_POA_get_servant_manager(PortableServer_POA obj, CORBA_Environment *ev)
+{
+ if(!obj) {
+ CORBA_exception_set_system(ev, ex_CORBA_BAD_PARAM,
+ CORBA_COMPLETED_NO);
+ return NULL;
+ }
+
+ if(obj->request_processing != PortableServer_USE_SERVANT_MANAGER) {
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_PortableServer_POA_WrongPolicy,
+ NULL);
+ return NULL;
+ }
+
+ return obj->servant_manager;
+}
+
+void PortableServer_POA_set_servant_manager(PortableServer_POA obj, PortableServer_ServantManager imgr, CORBA_Environment *ev)
+{
+ if(!obj) {
+ CORBA_exception_set_system(ev, ex_CORBA_BAD_PARAM,
+ CORBA_COMPLETED_NO);
+ return;
+ }
+
+ if(obj->request_processing != PortableServer_USE_SERVANT_MANAGER) {
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_PortableServer_POA_WrongPolicy,
+ NULL);
+ return;
+ }
+
+ obj->servant_manager = imgr;
+}
+
+PortableServer_Servant PortableServer_POA_get_servant(PortableServer_POA obj, CORBA_Environment *ev)
+{
+ if(!obj) {
+ CORBA_exception_set_system(ev, ex_CORBA_BAD_PARAM,
+ CORBA_COMPLETED_NO);
+ return NULL;
+ }
+
+ if(obj->request_processing != PortableServer_USE_DEFAULT_SERVANT) {
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_PortableServer_POA_WrongPolicy,
+ NULL);
+ return NULL;
+ }
+
+ return obj->default_servant;
+}
+
+void PortableServer_POA_set_servant(PortableServer_POA obj, PortableServer_Servant p_servant, CORBA_Environment *ev)
+{
+ if(!obj) {
+ CORBA_exception_set_system(ev, ex_CORBA_BAD_PARAM,
+ CORBA_COMPLETED_NO);
+ return;
+ }
+
+ if(obj->request_processing != PortableServer_USE_DEFAULT_SERVANT) {
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_PortableServer_POA_WrongPolicy,
+ NULL);
+ return;
+ }
+
+ obj->default_servant = p_servant;
+}
+
+static CORBA_unsigned_long
+get_objnum_for_obj(PortableServer_POA poa, ORBit_POAObject *obj)
+{
+ CORBA_unsigned_long retval;
+
+ if(poa->first_free_id) {
+ retval = poa->first_free_id;
+ poa->first_free_id = GPOINTER_TO_UINT(g_ptr_array_index(poa->objnum_to_obj,
+ retval));
+ g_ptr_array_index(poa->objnum_to_obj, retval) = obj;
+ } else {
+ retval = poa->objnum_to_obj->len;
+ g_ptr_array_add(poa->objnum_to_obj,
+ obj);
+ }
+
+ return retval;
+}
+
+static CORBA_ORB
+get_orb_for_poa(PortableServer_POA poa)
+{
+ if(poa->orb)
+ return poa->orb;
+ if(poa->parent_poa)
+ return get_orb_for_poa(poa->parent_poa);
+
+ return CORBA_OBJECT_NIL;
+}
+
+PortableServer_ObjectId *
+PortableServer_POA_activate_object(PortableServer_POA obj,
+ PortableServer_Servant p_servant,
+ CORBA_Environment *ev)
+{
+ PortableServer_ServantBase *servant;
+ PortableServer_ObjectId *new_objid;
+ ORBit_POAObject *new_obj;
+
+ servant = p_servant;
+
+ if(obj->servant_retention != PortableServer_RETAIN
+ || obj->id_assignment != PortableServer_SYSTEM_ID) {
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_PortableServer_POA_WrongPolicy,
+ NULL);
+ return NULL;
+ }
+
+ /* Servant Already Active */
+ if((obj->id_uniqueness==PortableServer_UNIQUE_ID) &&
+ (ORBIT_OBJECT_KEY(servant->_private)->object != 0)) {
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_PortableServer_POA_ServantAlreadyActive,
+ NULL);
+ return NULL;
+ }
+
+
+ new_obj = g_new0(ORBit_POAObject, 1);
+ new_obj->object_id = (PortableServer_ObjectId*)CORBA_sequence_octet__alloc();
+
+ new_objid =
+ ORBit_POA_allocate_oid(obj,
+ ORBIT_OBJECT_KEY(servant->_private)->class_info->class_name);
+
+ new_obj->object_id->_buffer = CORBA_octet_allocbuf(new_objid->_length);
+ new_obj->object_id->_length = new_objid->_length;
+ memcpy(new_obj->object_id->_buffer, new_objid->_buffer,
+ new_objid->_length);
+ CORBA_sequence_set_release(new_obj->object_id, CORBA_TRUE);
+
+ new_obj->servant = p_servant;
+ ORBIT_OBJECT_KEY(servant->_private)->object = new_obj;
+ new_obj->orb = get_orb_for_poa(obj);
+ new_obj->poa = obj;
+ new_obj->objnum = get_objnum_for_obj(obj, new_obj);
+ orbit_genrand(new_obj->rand_data, ORBIT_RAND_KEY_LEN);
+
+ g_hash_table_insert(obj->active_object_map,
+ new_obj->object_id,
+ new_obj);
+
+ ev->_major = CORBA_NO_EXCEPTION;
+
+ return new_objid;
+}
+
+void
+PortableServer_POA_activate_object_with_id(PortableServer_POA obj,
+ PortableServer_ObjectId *id,
+ PortableServer_Servant p_servant,
+ CORBA_Environment *ev)
+{
+ PortableServer_ServantBase *servant = p_servant;
+ ORBit_POAObject *newobj;
+
+ if(!obj || !id || !p_servant) {
+ CORBA_exception_set_system(ev, ex_CORBA_BAD_PARAM,
+ CORBA_COMPLETED_NO);
+ return;
+ }
+
+ newobj = g_hash_table_lookup(obj->active_object_map,
+ id);
+
+ if(newobj) {
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_PortableServer_POA_ObjectAlreadyActive, NULL);
+ return;
+ }
+
+ newobj = g_new0(ORBit_POAObject, 1);
+ newobj->object_id = (PortableServer_ObjectId *)CORBA_sequence_octet__alloc();
+ newobj->object_id->_length = id->_length;
+ newobj->object_id->_buffer = CORBA_octet_allocbuf(id->_length);
+ newobj->object_id->_release = CORBA_TRUE;
+ memcpy(newobj->object_id->_buffer, id->_buffer, id->_length);
+ newobj->poa = obj;
+ newobj->orb = get_orb_for_poa(obj);
+ newobj->objnum = get_objnum_for_obj(obj, newobj);
+ orbit_genrand(newobj->rand_data, ORBIT_RAND_KEY_LEN);
+
+ newobj->servant = p_servant;
+
+ g_hash_table_insert(obj->active_object_map,
+ newobj->object_id,
+ newobj);
+
+ ORBIT_OBJECT_KEY(servant->_private)->object = newobj;
+
+ ev->_major = CORBA_NO_EXCEPTION;
+}
+
+void
+PortableServer_POA_deactivate_object(PortableServer_POA obj,
+ PortableServer_ObjectId *oid,
+ CORBA_Environment *ev)
+{
+ ORBit_POAObject *oldobj;
+
+ if(!obj || !oid) {
+ CORBA_exception_set_system(ev, ex_CORBA_BAD_PARAM,
+ CORBA_COMPLETED_NO);
+ return;
+ }
+
+ oldobj = g_hash_table_lookup(obj->active_object_map,
+ oid);
+
+ if(!oldobj) {
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_PortableServer_POA_ObjectNotActive,
+ NULL);
+ return;
+ }
+
+ g_ptr_array_index(obj->objnum_to_obj, oldobj->objnum) = GUINT_TO_POINTER(obj->first_free_id);
+ obj->first_free_id = oldobj->objnum;
+
+ g_hash_table_remove(obj->active_object_map, oid);
+
+ if(obj->request_processing == PortableServer_USE_SERVANT_MANAGER) {
+ POA_PortableServer_ServantActivator__epv *epv;
+ POA_PortableServer_ServantActivator *sm;
+
+ sm = (POA_PortableServer_ServantActivator *)obj->servant_manager;
+ epv = sm->vepv->PortableServer_ServantActivator_epv;
+ epv->etherealize(sm, oldobj->object_id, obj,
+ oldobj->servant,
+ CORBA_FALSE,
+ CORBA_FALSE,
+ ev);
+ }
+
+ CORBA_free(oldobj->object_id);
+
+ g_free(oldobj);
+ ev->_major = CORBA_NO_EXCEPTION;
+}
+
+CORBA_Object
+PortableServer_POA_create_reference(PortableServer_POA obj,
+ CORBA_RepositoryId intf,
+ CORBA_Environment *ev)
+{
+ g_assert(!"Not yet implemented");
+ return(NULL);
+}
+
+PortableServer_ObjectId *PortableServer_POA_servant_to_id(PortableServer_POA obj, PortableServer_Servant p_servant, CORBA_Environment *ev)
+{
+ PortableServer_ObjectId *retval, *orig;
+ PortableServer_ServantBase *serv = p_servant;
+ g_return_val_if_fail(p_servant != NULL, NULL);
+
+ orig = ORBIT_OBJECT_KEY(serv->_private)->object->object_id;
+ retval = (PortableServer_ObjectId *)CORBA_sequence_octet__alloc();
+ retval->_length = retval->_maximum = orig->_length;
+ retval->_buffer = CORBA_octet_allocbuf(retval->_length);
+ memcpy(retval->_buffer, orig->_buffer, retval->_length);
+ CORBA_sequence_set_release(retval, CORBA_TRUE);
+
+ return retval;
+}
+
+CORBA_Object
+PortableServer_POA_servant_to_reference(PortableServer_POA obj, PortableServer_Servant p_servant, CORBA_Environment *ev)
+{
+ CORBA_Object retval;
+ PortableServer_ObjectId *orig_id;
+ PortableServer_ServantBase *servant = p_servant;
+ ORBit_ObjectKey *obj_key = ORBIT_OBJECT_KEY(servant->_private);
+
+ int implicit = (obj->implicit_activation == PortableServer_IMPLICIT_ACTIVATION);
+ int activate_able = (obj_key->object == 0) ||
+ (obj->id_uniqueness==PortableServer_MULTIPLE_ID);
+ /* ImplicitActivationPolicy */
+ if( implicit && activate_able) {
+ orig_id = PortableServer_POA_activate_object(obj, p_servant, ev);
+ } else {
+ orig_id = obj_key->object->object_id;
+ }
+ retval = PortableServer_POA_id_to_reference(obj,orig_id,ev);
+
+ return retval;
+}
+
+PortableServer_Servant
+PortableServer_POA_reference_to_servant(PortableServer_POA obj, CORBA_Object reference, CORBA_Environment *ev)
+{
+ GSList *cur;
+
+ g_assert(reference);
+
+ if(obj->request_processing != PortableServer_USE_DEFAULT_SERVANT
+ && obj->servant_retention != PortableServer_RETAIN) {
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_PortableServer_POA_WrongPolicy,
+ NULL);
+ return NULL;
+ }
+
+ if(reference->servant)
+ return reference->servant;
+
+ for(cur = reference->profile_list; cur; cur = cur->next) {
+ PortableServer_ObjectId *oid;
+ ORBit_Object_info *curprof = cur->data;
+ ORBit_POAObject *objinfo;
+
+ objinfo = ORBit_POA_find_oid_for_object_key(obj, &(curprof->object_key), &oid);
+ CORBA_free(oid);
+ if(objinfo)
+ return objinfo->servant;
+ }
+
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_PortableServer_POA_ObjectNotActive,
+ NULL);
+ return NULL;
+}
+
+PortableServer_ObjectId *PortableServer_POA_reference_to_id(PortableServer_POA obj, CORBA_Object reference, CORBA_Environment *ev)
+{
+ PortableServer_ObjectId *retval;
+ ORBit_POAObject *objinfo;
+
+ g_assert(reference);
+ g_assert(reference->active_profile);
+
+ if(obj->request_processing != PortableServer_USE_DEFAULT_SERVANT
+ && obj->servant_retention != PortableServer_RETAIN) {
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_PortableServer_POA_WrongPolicy,
+ NULL);
+ return NULL;
+ }
+
+ objinfo = ORBit_POA_find_oid_for_object_key(obj, &(reference->active_profile->object_key), &retval);
+ if(objinfo) {
+ CORBA_free(retval);
+ retval = (PortableServer_ObjectId *)CORBA_sequence_octet__alloc();
+ retval->_length = retval->_maximum = objinfo->object_id->_length;
+ retval->_buffer = CORBA_octet_allocbuf(retval->_length);
+ memcpy(retval->_buffer, objinfo->object_id->_buffer, retval->_length);
+ CORBA_sequence_set_release(retval, CORBA_TRUE);
+ return retval;
+ } else if(retval)
+ return retval;
+
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_PortableServer_POA_ObjectNotActive,
+ NULL);
+ return NULL;
+}
+
+PortableServer_Servant PortableServer_POA_id_to_servant(PortableServer_POA obj, PortableServer_ObjectId *oid, CORBA_Environment *ev)
+{
+ ORBit_POAObject *objinfo;
+
+ if(obj->servant_retention != PortableServer_RETAIN) {
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_PortableServer_POA_WrongPolicy,
+ NULL);
+ return NULL;
+ }
+
+ objinfo = g_hash_table_lookup(obj->active_object_map,
+ oid);
+
+ if(!objinfo) {
+ CORBA_exception_set(ev, CORBA_USER_EXCEPTION,
+ ex_PortableServer_POA_WrongPolicy,
+ NULL);
+ return NULL;
+ }
+
+ return objinfo->servant;
+}
+
+static CORBA_Object
+my_PortableServer_POA_id_to_reference(PortableServer_POA obj,
+ PortableServer_ObjectId *oid,
+ const char *type_id,
+ CORBA_Environment *ev)
+{
+ GSList *profiles=NULL;
+ ORBit_Object_info *object_info;
+ CORBA_Object retval;
+ CORBA_ORB orb;
+ ORBit_POAObject *pobj;
+ ORBit_ObjectKey *objkey = NULL;
+
+ orb = obj->the_POAManager->orb;
+
+ g_assert(!oid->_buffer[oid->_length - 1]);
+
+ pobj = g_hash_table_lookup(obj->active_object_map, oid);
+
+ if(pobj) {
+ objkey = ORBIT_OBJECT_KEY(((PortableServer_ServantBase *)pobj->servant)->_private);
+ type_id= objkey->class_info->class_name;
+ }
+
+ /* Do the local connection first, so it will be attempted first by
+ the client parsing the IOR string
+ */
+ if(orb->cnx.ipv6 || orb->cnx.usock) {
+ object_info = g_new0(ORBit_Object_info, 1);
+
+ object_info->profile_type=IOP_TAG_ORBIT_SPECIFIC;
+ object_info->iiop_major = 1;
+ object_info->iiop_minor = 0;
+
+ ORBit_POA_find_object_key_for_oid(obj, pobj, oid, &object_info->object_key);
+
+#ifdef HAVE_IPV6
+ if(orb->cnx.ipv6) {
+ object_info->tag.orbitinfo.ipv6_port =
+ ntohs(IIOP_CONNECTION(orb->cnx.ipv6)->u.ipv6.location.sin_port);
+ }
+#endif
+ if(orb->cnx.usock) {
+ object_info->tag.orbitinfo.unix_sock_path =
+ g_strdup(IIOP_CONNECTION(orb->cnx.usock)->u.usock.sun_path);
+ }
+ ORBit_set_object_key(object_info);
+ profiles=g_slist_append(profiles, object_info);
+ }
+
+ if(orb->cnx.ipv4) {
+ object_info=g_new0(ORBit_Object_info, 1);
+
+ object_info->profile_type = IOP_TAG_INTERNET_IOP;
+ object_info->iiop_major = 1;
+ object_info->iiop_minor = 0;
+ ORBit_POA_find_object_key_for_oid(obj, pobj, oid, &object_info->object_key);
+
+ object_info->tag.iopinfo.host = g_strdup(IIOP_CONNECTION(orb->cnx.ipv4)->u.ipv4.hostname);
+ object_info->tag.iopinfo.port = ntohs(IIOP_CONNECTION(orb->cnx.ipv4)->u.ipv4.location.sin_port);
+
+ ORBit_set_object_key(object_info);
+ profiles=g_slist_append(profiles, object_info);
+ }
+
+ retval = ORBit_create_object_with_info(profiles, type_id, orb, ev);
+
+ if(retval != CORBA_OBJECT_NIL
+ && ev->_major == CORBA_NO_EXCEPTION
+ && objkey && objkey->class_info && objkey->class_info->init_local_objref) {
+ /* XXX potential memleak if we get an already-valid objref */
+ retval->vepv = g_new0(gpointer, ORBit_class_assignment_counter + 1);
+ retval->vepv_size = ORBit_class_assignment_counter + 1;
+ objkey->class_info->init_local_objref(retval, pobj->servant);
+ retval->servant = pobj->servant;
+ } else
+ retval->vepv = retval->servant = NULL;
+
+ return retval;
+}
+
+CORBA_Object PortableServer_POA_id_to_reference(PortableServer_POA obj,
+ PortableServer_ObjectId *oid,
+ CORBA_Environment *ev)
+{
+ return my_PortableServer_POA_id_to_reference(obj, oid, NULL, ev);
+}
+
+CORBA_Object
+PortableServer_POA_create_reference_with_id(PortableServer_POA obj,
+ PortableServer_ObjectId *oid,
+ CORBA_RepositoryId intf,
+ CORBA_Environment *ev)
+{
+ return my_PortableServer_POA_id_to_reference(obj, oid, intf, ev);
+}
+
+PortableServer_POA PortableServer_Current_get_POA(PortableServer_Current obj, CORBA_Environment *ev)
+{
+ g_assert(!"Not yet implemented");
+ return(NULL);
+}
+
+PortableServer_ObjectId *PortableServer_Current_get_object_id(PortableServer_Current obj, CORBA_Environment *ev)
+{
+ g_assert(!"Not yet implemented");
+ return(NULL);
+}
+
+
+CORBA_char *PortableServer_ObjectId_to_string(PortableServer_ObjectId *id, CORBA_Environment *env)
+{
+ return CORBA_string_dup((CORBA_char *)id->_buffer);
+}
+
+CORBA_wchar *PortableServer_ObjectId_to_wstring(PortableServer_ObjectId *id, CORBA_Environment *env)
+{
+ g_assert(!"Not yet implemented");
+ return(NULL);
+}
+
+PortableServer_ObjectId *PortableServer_string_to_ObjectId(CORBA_char *str, CORBA_Environment *env)
+{
+ PortableServer_ObjectId *retval;
+
+ retval = (PortableServer_ObjectId *)CORBA_sequence_octet__alloc();
+
+ retval->_length = strlen(str) + 1;
+ retval->_buffer = CORBA_octet_allocbuf(retval->_length);
+
+ memcpy(retval->_buffer, str, retval->_length);
+
+ return retval;
+}
+
+PortableServer_ObjectId *PortableServer_wstring_to_ObjectId(CORBA_wchar *str, CORBA_Environment *env)
+{
+ g_assert(!"Not yet implemented");
+ return(NULL);
+}
+
+
+PortableServer_POA PortableServer_ServantBase__default_POA(PortableServer_Servant servant, CORBA_Environment *ev)
+{
+ g_return_val_if_fail(servant, NULL);
+
+ return ORBIT_OBJECT_KEY(((PortableServer_ServantBase *)servant)->_private)->object->poa;
+}
+
+void PortableServer_ServantLocator_preinvoke(PortableServer_ObjectId *oid, PortableServer_POA adapter, CORBA_Identifier op_name, PortableServer_ServantLocator_Cookie *cookie)
+{
+ g_assert(!"Not yet implemented");
+ return;
+}
+
+void PortableServer_ServantLocator_postinvoke(PortableServer_ObjectId *oid, PortableServer_POA adapter, CORBA_Identifier op_name, PortableServer_ServantLocator_Cookie cookie, PortableServer_Servant servant)
+{
+ g_assert(!"Not yet implemented");
+ return;
+}
+
+void PortableServer_ServantBase__init(PortableServer_Servant servant,
+ CORBA_Environment *ev)
+{
+ PortableServer_ServantBase *serv = servant;
+
+ if(!serv->_private) /* If not already initialized, create the place to
+ stick our info */
+ serv->_private = g_new0(ORBit_ObjectKey, 1);
+}
+
+void PortableServer_ServantBase__fini(PortableServer_Servant servant,
+ CORBA_Environment *ev)
+{
+ PortableServer_ServantBase *serv = servant;
+
+ g_free(serv->_private);
+ serv->_private = NULL;
+}
+
+
+/************************ ServerRequest stuff ********************/
+
+CORBA_Identifier CORBA_ServerRequest_operation(CORBA_ServerRequest req, CORBA_Environment *env)
+{
+ return CORBA_string_dup(req->rbuf->message.u.request.operation);
+}
+
+CORBA_Context
+CORBA_ServerRequest_ctx(CORBA_ServerRequest req, CORBA_Environment *env)
+{
+ if(!req->params || req->did_ctx) {
+ CORBA_exception_set_system(env, ex_CORBA_BAD_INV_ORDER,
+ CORBA_COMPLETED_NO);
+ return NULL;
+ }
+
+ return NULL;
+}
+
+void
+CORBA_ServerRequest_arguments(CORBA_ServerRequest req,
+ CORBA_NVList *parameters,
+ CORBA_Environment *env)
+{
+ int i;
+
+ if(req->params) {
+ CORBA_exception_set_system(env, ex_CORBA_BAD_INV_ORDER,
+ CORBA_COMPLETED_NO);
+ return;
+ }
+
+ req->params = parameters;
+
+ for(i = 0; i < parameters->list->len; i++) {
+ CORBA_NamedValue *cur;
+
+ cur = &g_array_index(parameters->list, CORBA_NamedValue, i);
+
+ if(cur->arg_modes & CORBA_ARG_OUT) continue;
+ cur->argument._value = ORBit_demarshal_arg(req->rbuf,
+ cur->argument._type,
+ TRUE,
+ (CORBA_ORB)req->orb);
+ CORBA_any_set_release(&cur->argument, TRUE);
+ }
+}
+
+void
+CORBA_ServerRequest_set_result(CORBA_ServerRequest req,
+ CORBA_any *value,
+ CORBA_Environment *env)
+{
+ if(req->sbuf) {
+ CORBA_exception_set_system(env, ex_CORBA_BAD_INV_ORDER,
+ CORBA_COMPLETED_NO);
+ return;
+ }
+
+ req->sbuf = giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(req->rbuf)->connection,
+ NULL,
+ req->rbuf->message.u.request.request_id,
+ CORBA_NO_EXCEPTION);
+ if(!req->sbuf) {
+ CORBA_exception_set_system(env, ex_CORBA_COMM_FAILURE,
+ CORBA_COMPLETED_NO);
+ return;
+ }
+
+ ORBit_marshal_arg(req->sbuf, value->_value, value->_type);
+}
+
+void
+CORBA_ServerRequest_set_exception(CORBA_ServerRequest req,
+ CORBA_exception_type major,
+ CORBA_any *value,
+ CORBA_Environment *env)
+{
+ if(req->sbuf) {
+ CORBA_exception_set_system(env, ex_CORBA_BAD_INV_ORDER,
+ CORBA_COMPLETED_NO);
+ return;
+ }
+
+ req->sbuf = giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(req->rbuf)->connection,
+ NULL,
+ req->rbuf->message.u.request.request_id,
+ major);
+ if(!req->sbuf) {
+ CORBA_exception_set_system(env, ex_CORBA_COMM_FAILURE,
+ CORBA_COMPLETED_NO);
+ return;
+ }
+
+ req->did_exc = TRUE;
+
+ /* XXX do we really need to copy the repo_id into the
+ send buffer? Or is there a way to assume that the CORBA_TypeCode
+ value->_type will be around until after we send the message? */
+ {
+ CORBA_unsigned_long slen;
+ slen = strlen(value->_type->repo_id) + 1;
+ giop_send_buffer_append_mem_indirect_a(req->sbuf, &slen,
+ sizeof(slen));
+ giop_send_buffer_append_mem_indirect(req->sbuf,
+ value->_type->repo_id,
+ slen);
+ }
+
+ ORBit_marshal_arg(req->sbuf, value->_value, value->_type);
+}
+
+void
+POA_PortableServer_ServantActivator__init(PortableServer_Servant servant,
+ CORBA_Environment * ev)
+{
+ static const PortableServer_ClassInfo class_info =
+ {NULL,
+ "IDL:omg.org/PortableServer/ServantActivator:1.0",
+ NULL};
+
+ PortableServer_ServantBase__init(((PortableServer_ServantBase *) servant), ev);
+
+ ORBIT_OBJECT_KEY(((PortableServer_ServantBase *)servant)->_private)->class_info = (gpointer)&class_info;
+}
+
+void
+POA_PortableServer_ServantActivator__fini(PortableServer_Servant servant,
+ CORBA_Environment * ev)
+{
+ PortableServer_ServantBase__fini(servant, ev);
+}
+
+void
+POA_PortableServer_ServantLocator__init(PortableServer_Servant servant,
+ CORBA_Environment * ev)
+{
+ static const PortableServer_ClassInfo class_info =
+ {NULL,
+ "IDL:omg.org/PortableServer/ServantLocator:1.0",
+ NULL};
+
+ PortableServer_ServantBase__init(((PortableServer_ServantBase *)servant), ev);
+
+ ORBIT_OBJECT_KEY(((PortableServer_ServantBase *)servant)->_private)->class_info = (gpointer)&class_info;
+}
+
+void
+POA_PortableServer_ServantLocator__fini(PortableServer_Servant servant,
+ CORBA_Environment * ev)
+{
+ PortableServer_ServantBase__fini(servant, ev);
+}
+
+/* POA-related DSI stuff */
+static void
+dynamic_impl_skel(PortableServer_DynamicImpl *_ORBIT_servant,
+ GIOPRecvBuffer *_ORBIT_recv_buffer,
+ CORBA_Environment *ev,
+ PortableServer_DynamicImplRoutine invoke)
+{
+ /* here the magic occurs... */
+ struct CORBA_ServerRequest_type sr;
+
+ ORBit_pseudo_object_init(ORBIT_PSEUDO_OBJECT(&sr),
+ ORBIT_PSEUDO_SERVERREQUEST, ev);
+
+ CORBA_Object_duplicate((CORBA_Object)&sr, ev); /* just to make
+ sure it doesn't die
+ elsewhere */
+
+ sr.rbuf = _ORBIT_recv_buffer;
+ sr.orb = GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)->connection->orb_data;
+
+ _ORBIT_servant->vepv->PortableServer_DynamicImpl_epv->invoke(_ORBIT_servant,
+ &sr);
+
+ if(sr.sbuf) {
+ int i;
+ for(i = 0; i < sr.params->list->len; i++) {
+ CORBA_NamedValue *cur;
+
+ cur = &g_array_index(sr.params->list, CORBA_NamedValue, i);
+
+ if(cur->arg_modes & CORBA_ARG_IN) continue;
+
+ ORBit_marshal_arg(sr.sbuf, cur->argument._value,
+ cur->argument._type);
+ }
+
+ giop_send_buffer_write(sr.sbuf);
+ giop_send_buffer_unuse(sr.sbuf);
+ } else
+ g_warning("Yo, your DSI code is messed up! You forgot to set_result|set_exception");
+
+ CORBA_NVList_free(sr.params, ev);
+}
+
+static ORBitSkeleton
+dynamic_impl_get_skel(PortableServer_DynamicImpl * servant,
+ GIOPRecvBuffer * _ORBIT_recv_buffer,
+ gpointer * impl)
+{
+ *impl = (gpointer)servant->vepv->PortableServer_DynamicImpl_epv->invoke;
+
+ return (ORBitSkeleton)dynamic_impl_skel;
+}
+
+void
+PortableServer_DynamicImpl__init(PortableServer_Servant servant,
+ CORBA_Environment *ev)
+{
+ static const PortableServer_ClassInfo class_info =
+ {(ORBitSkeleton (*)(PortableServer_ServantBase *, gpointer, gpointer *))
+ &dynamic_impl_get_skel, "IDL:CORBA/Object:1.0", NULL};
+
+ PortableServer_ServantBase__init(servant, ev);
+
+ ORBIT_OBJECT_KEY(((PortableServer_ServantBase *)servant)->_private)->class_info =
+ (PortableServer_ClassInfo *) & class_info;
+
+}
+
+void PortableServer_DynamicImpl__fini(PortableServer_Servant servant,
+ CORBA_Environment *ev)
+{
+ PortableServer_ServantBase__fini(servant, ev);
+}
+
diff -urN linux-2.4.1/net/korbit/orb/poa.h linux-2.4.1-korbit/net/korbit/orb/poa.h
--- linux-2.4.1/net/korbit/orb/poa.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/poa.h Thu Feb 1 11:47:14 2001
@@ -0,0 +1,337 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#ifndef _ORBIT_POA_H_
+#define _ORBIT_POA_H_
+
+#include "orbit_types.h"
+
+extern PortableServer_ThreadPolicyValue PortableServer_ThreadPolicy__get_value(
+ PortableServer_ThreadPolicy obj,
+ CORBA_Environment *ev);
+
+extern PortableServer_LifespanPolicyValue PortableServer_LifespanPolicy__get_value(
+ PortableServer_LifespanPolicy obj,
+ CORBA_Environment *ev);
+
+extern PortableServer_IdUniquenessPolicyValue PortableServer_IdUniquenessPolicy__get_value(
+ PortableServer_IdUniquenessPolicy obj,
+ CORBA_Environment *ev);
+
+extern PortableServer_IdAssignmentPolicyValue PortableServer_IdAssignmentPolicy__get_value(
+ PortableServer_IdAssignmentPolicy obj,
+ CORBA_Environment *ev);
+
+extern PortableServer_ImplicitActivationPolicyValue PortableServer_ImplicitActivationPolicy__get_value(
+ PortableServer_ImplicitActivationPolicy obj,
+ CORBA_Environment *ev);
+
+extern PortableServer_ServantRetentionPolicyValue PortableServer_ServantRetentionPolicy__get_value(
+ PortableServer_ServantRetentionPolicy obj,
+ CORBA_Environment *ev);
+
+extern PortableServer_RequestProcessingPolicyValue PortableServer_RequestProcessingPolicy__get_value(
+ PortableServer_RequestProcessingPolicy obj,
+ CORBA_Environment *ev);
+
+PortableServer_POAManager_State
+PortableServer_POAManager_get_state(PortableServer_POAManager obj,
+ CORBA_Environment *ev);
+
+extern void PortableServer_POAManager_activate(
+ PortableServer_POAManager obj,
+ CORBA_Environment *ev);
+
+extern void PortableServer_POAManager_hold_requests(
+ PortableServer_POAManager obj,
+ CORBA_boolean wait_for_completion,
+ CORBA_Environment *ev);
+
+extern void PortableServer_POAManager_discard_requests(
+ PortableServer_POAManager obj,
+ CORBA_boolean wait_for_completion,
+ CORBA_Environment *ev);
+
+extern void PortableServer_POAManager_deactivate(
+ PortableServer_POAManager obj,
+ CORBA_boolean etherealize_objects,
+ CORBA_boolean wait_for_completion,
+ CORBA_Environment *ev);
+
+extern CORBA_boolean PortableServer_AdapterActivator_unknown_adapter(
+ PortableServer_AdapterActivator obj,
+ PortableServer_POA parent,
+ CORBA_char *name,
+ CORBA_Environment *ev);
+
+extern PortableServer_Servant PortableServer_ServantActivator_incarnate(
+ PortableServer_ServantActivator obj,
+ PortableServer_ObjectId *oid,
+ PortableServer_POA adapter,
+ CORBA_Environment *ev);
+
+extern void PortableServer_ServantActivator_etherealize(
+ PortableServer_ServantActivator obj,
+ PortableServer_ObjectId *oid,
+ PortableServer_POA adapter,
+ PortableServer_Servant serv,
+ CORBA_boolean cleanup_in_progress,
+ CORBA_boolean remaining_activations,
+ CORBA_Environment *ev);
+
+extern PortableServer_POA PortableServer_POA_create_POA(
+ PortableServer_POA obj,
+ CORBA_char *adapter_name,
+ PortableServer_POAManager a_POAManager,
+ CORBA_PolicyList *policies,
+ CORBA_Environment *ev);
+
+extern PortableServer_POA PortableServer_POA_find_POA(
+ PortableServer_POA obj,
+ CORBA_char *adapter_name,
+ CORBA_boolean activate_it,
+ CORBA_Environment *ev);
+
+extern void PortableServer_POA_destroy(
+ PortableServer_POA obj,
+ CORBA_boolean etherealize_objects,
+ CORBA_boolean wait_for_completion,
+ CORBA_Environment *ev);
+
+extern PortableServer_ThreadPolicy PortableServer_POA_create_thread_policy(
+ PortableServer_POA obj,
+ PortableServer_ThreadPolicyValue value,
+ CORBA_Environment *ev);
+
+extern PortableServer_LifespanPolicy PortableServer_POA_create_lifespan_policy(
+ PortableServer_POA obj,
+ PortableServer_LifespanPolicyValue value,
+ CORBA_Environment *ev);
+
+extern PortableServer_IdUniquenessPolicy PortableServer_POA_create_id_uniqueness_policy(
+ PortableServer_POA obj,
+ PortableServer_IdUniquenessPolicyValue value,
+ CORBA_Environment *ev);
+
+extern PortableServer_IdAssignmentPolicy PortableServer_POA_create_id_assignment_policy(
+ PortableServer_POA obj,
+ PortableServer_IdAssignmentPolicyValue value,
+ CORBA_Environment *ev);
+
+extern PortableServer_ImplicitActivationPolicy PortableServer_POA_create_implicit_activation_policy(
+ PortableServer_POA obj,
+ PortableServer_ImplicitActivationPolicyValue value,
+ CORBA_Environment *ev);
+
+extern PortableServer_ServantRetentionPolicy PortableServer_POA_create_servant_retention_policy(
+ PortableServer_POA obj,
+ PortableServer_ServantRetentionPolicyValue value,
+ CORBA_Environment *ev);
+
+extern PortableServer_RequestProcessingPolicy PortableServer_POA_create_request_processing_policy(
+ PortableServer_POA obj,
+ PortableServer_RequestProcessingPolicyValue value,
+ CORBA_Environment *ev);
+
+extern CORBA_char *PortableServer_POA__get_the_name(
+ PortableServer_POA obj,
+ CORBA_Environment *ev);
+
+extern PortableServer_POA PortableServer_POA__get_the_parent(
+ PortableServer_POA obj,
+ CORBA_Environment *ev);
+
+extern PortableServer_POAManager PortableServer_POA__get_the_POAManager(
+ PortableServer_POA obj,
+ CORBA_Environment *ev);
+
+extern PortableServer_AdapterActivator PortableServer_POA__get_the_activator(
+ PortableServer_POA obj,
+ CORBA_Environment *ev);
+
+extern void PortableServer_POA__set_the_activator(
+ PortableServer_POA obj,
+ PortableServer_AdapterActivator the_activator,
+ CORBA_Environment *ev);
+
+extern PortableServer_ServantManager PortableServer_POA_get_servant_manager(
+ PortableServer_POA obj,
+ CORBA_Environment *ev);
+
+extern void PortableServer_POA_set_servant_manager(
+ PortableServer_POA obj,
+ PortableServer_ServantManager imgr,
+ CORBA_Environment *ev);
+
+extern PortableServer_Servant PortableServer_POA_get_servant(
+ PortableServer_POA obj,
+ CORBA_Environment *ev);
+
+extern void PortableServer_POA_set_servant(
+ PortableServer_POA obj,
+ PortableServer_Servant p_servant,
+ CORBA_Environment *ev);
+
+extern PortableServer_ObjectId *PortableServer_POA_activate_object(
+ PortableServer_POA obj,
+ PortableServer_Servant p_servant,
+ CORBA_Environment *ev);
+
+extern void PortableServer_POA_activate_object_with_id(
+ PortableServer_POA obj,
+ PortableServer_ObjectId *id,
+ PortableServer_Servant p_servant,
+ CORBA_Environment *ev);
+
+extern void PortableServer_POA_deactivate_object(
+ PortableServer_POA obj,
+ PortableServer_ObjectId *oid,
+ CORBA_Environment *ev);
+
+extern CORBA_Object PortableServer_POA_create_reference(
+ PortableServer_POA obj,
+ CORBA_RepositoryId intf,
+ CORBA_Environment *ev);
+
+extern CORBA_Object PortableServer_POA_create_reference_with_id(
+ PortableServer_POA obj,
+ PortableServer_ObjectId *oid,
+ CORBA_RepositoryId intf,
+ CORBA_Environment *ev);
+
+extern PortableServer_ObjectId *PortableServer_POA_servant_to_id(
+ PortableServer_POA obj,
+ PortableServer_Servant p_servant,
+ CORBA_Environment *ev);
+
+extern CORBA_Object PortableServer_POA_servant_to_reference(
+ PortableServer_POA obj,
+ PortableServer_Servant p_servant,
+ CORBA_Environment *ev);
+
+extern PortableServer_Servant PortableServer_POA_reference_to_servant(
+ PortableServer_POA obj,
+ CORBA_Object reference,
+ CORBA_Environment *ev);
+
+extern PortableServer_ObjectId *PortableServer_POA_reference_to_id(
+ PortableServer_POA obj,
+ CORBA_Object reference,
+ CORBA_Environment *ev);
+
+extern PortableServer_Servant PortableServer_POA_id_to_servant(
+ PortableServer_POA obj,
+ PortableServer_ObjectId *oid,
+ CORBA_Environment *ev);
+
+extern CORBA_Object PortableServer_POA_id_to_reference(
+ PortableServer_POA obj,
+ PortableServer_ObjectId *oid,
+ CORBA_Environment *ev);
+
+extern PortableServer_POA PortableServer_Current_get_POA(
+ PortableServer_Current obj,
+ CORBA_Environment *ev);
+
+extern PortableServer_ObjectId *PortableServer_Current_get_object_id(
+ PortableServer_Current obj,
+ CORBA_Environment *ev);
+
+extern CORBA_char *PortableServer_ObjectId_to_string(
+ PortableServer_ObjectId *id,
+ CORBA_Environment *env);
+
+extern CORBA_wchar *PortableServer_ObjectId_to_wstring(
+ PortableServer_ObjectId *id,
+ CORBA_Environment *env);
+
+extern PortableServer_ObjectId *PortableServer_string_to_ObjectId(
+ CORBA_char *str,
+ CORBA_Environment *env);
+
+extern PortableServer_ObjectId *PortableServer_wstring_to_ObjectId(
+ CORBA_wchar *str,
+ CORBA_Environment *env);
+
+extern PortableServer_POA PortableServer_ServantBase__default_POA(
+ PortableServer_Servant,
+ CORBA_Environment *);
+
+extern void PortableServer_ServantLocator_preinvoke(
+ PortableServer_ObjectId *oid,
+ PortableServer_POA adapter,
+ CORBA_Identifier op_name,
+ PortableServer_ServantLocator_Cookie *cookie);
+
+extern void PortableServer_ServantLocator_postinvoke(
+ PortableServer_ObjectId *oid,
+ PortableServer_POA adapter,
+ CORBA_Identifier op_name,
+ PortableServer_ServantLocator_Cookie cookie,
+ PortableServer_Servant servant);
+
+extern void PortableServer_ServantBase__init(
+ PortableServer_Servant,
+ CORBA_Environment *);
+
+extern void PortableServer_ServantBase__fini(
+ PortableServer_Servant,
+ CORBA_Environment *);
+
+/* 19.27 */
+extern CORBA_Identifier CORBA_ServerRequest_operation(
+ CORBA_ServerRequest req,
+ CORBA_Environment *env);
+
+extern CORBA_Context CORBA_ServerRequest_ctx(
+ CORBA_ServerRequest req,
+ CORBA_Environment *env);
+
+extern void CORBA_ServerRequest_arguments(
+ CORBA_ServerRequest req,
+ CORBA_NVList *parameters,
+ CORBA_Environment *env);
+
+extern void CORBA_ServerRequest_set_result(
+ CORBA_ServerRequest req,
+ CORBA_any *value,
+ CORBA_Environment *env);
+
+extern void CORBA_ServerRequest_set_exception(
+ CORBA_ServerRequest req,
+ CORBA_exception_type major,
+ CORBA_any *value,
+ CORBA_Environment *env);
+
+extern void PortableServer_DynamicImpl__init(PortableServer_Servant,
+ CORBA_Environment *ev);
+
+extern void PortableServer_DynamicImpl__fini(PortableServer_Servant,
+ CORBA_Environment *ev);
+
+
+#include "orbit_poa_type.h"
+
+#endif /* !_ORBIT_POA_H_ */
diff -urN linux-2.4.1/net/korbit/orb/sequences.c linux-2.4.1-korbit/net/korbit/orb/sequences.c
--- linux-2.4.1/net/korbit/orb/sequences.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/sequences.c Thu Feb 1 11:47:14 2001
@@ -0,0 +1,35 @@
+#include "orbit.h"
+#include "sequences.h"
+
+gpointer CORBA_sequence_octet_free(gpointer mem,
+ gpointer func_data)
+{
+ CORBA_sequence_octet *seqo = mem;
+
+ if(seqo->_release)
+ CORBA_free(seqo->_buffer);
+
+ return (gpointer)((guchar *)mem + sizeof(CORBA_sequence_octet));
+}
+
+CORBA_octet *
+CORBA_octet_allocbuf(CORBA_unsigned_long len)
+{
+ return (CORBA_octet *)ORBit_alloc(len, NULL, NULL);
+}
+
+CORBA_sequence_octet *CORBA_sequence_octet__alloc(void)
+{
+ CORBA_sequence_octet *seqo;
+
+ seqo = ORBit_alloc(sizeof(CORBA_sequence_octet),
+ (ORBit_free_childvals)CORBA_sequence_octet_free,
+ GUINT_TO_POINTER(1));
+
+ seqo->_length = seqo->_maximum = 0;
+ seqo->_buffer = NULL;
+ seqo->_release = CORBA_TRUE;
+
+ return seqo;
+}
+
diff -urN linux-2.4.1/net/korbit/orb/sequences.h linux-2.4.1-korbit/net/korbit/orb/sequences.h
--- linux-2.4.1/net/korbit/orb/sequences.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/sequences.h Thu Feb 1 16:21:19 2001
@@ -0,0 +1,35 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#ifndef _ORBIT_SEQUENCES_H_
+#define _ORBIT_SEQUENCES_H_
+
+/* #include "corba_sequences_type.h" */
+#include "orbit_types.h"
+
+CORBA_octet *CORBA_octet_allocbuf(CORBA_unsigned_long len);
+CORBA_sequence_octet *CORBA_sequence_octet__alloc(void);
+
+#endif /* !_ORBIT_SEQUENCES_H_ */
diff -urN linux-2.4.1/net/korbit/orb/server.c linux-2.4.1-korbit/net/korbit/orb/server.c
--- linux-2.4.1/net/korbit/orb/server.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/server.c Thu Feb 1 11:47:14 2001
@@ -0,0 +1,217 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/* Elliot's stuff */
+/* This is somewhat a mess, because I tried to make it easy to add
+ select() support, and as a result #ifdef's litter the land. */
+
+#include "orbit.h"
+#include "orbit_poa.h"
+#include "orbit_poa_type.h"
+#include <IIOP/IIOP-private.h>
+#ifdef HAVE_SYS_POLL_H
+#include <sys/poll.h>
+#endif
+#include <sys/types.h>
+#include <sys/socket.h>
+
+/* We need:
+ a way to find out what FD's need to be selected on
+ a dummy main loop to implement the CORBA_ORB_run() routine;
+*/
+
+gboolean orb_server_keep_running = FALSE;
+
+ORBit_request_validate ORBIT_request_validator = NULL;
+
+/* function protos */
+static PortableServer_POA ORBit_find_POA_for_request(PortableServer_POA poa,
+ GIOPRecvBuffer *recv_buffer);
+static PortableServer_POA ORBit_find_POA_for_locate_request(PortableServer_POA poa,
+ GIOPRecvBuffer *recv_buffer);
+
+static void ORBit_handle_incoming_message(GIOPRecvBuffer *recv_buffer);
+
+void
+ORBit_custom_run_setup(CORBA_ORB orb, CORBA_Environment *ev)
+{
+ IIOPIncomingMessageHandler = ORBit_handle_incoming_message;
+}
+
+
+#if __KERNEL__
+// Modules don't do anything when they call this...
+void CORBA_ORB_run(CORBA_ORB orb, CORBA_Environment *ev) {
+ // This should probably free the ORB pointer, because it is a
+ // duplicated pointer from the one true orb.
+
+}
+
+// The ORB thread calls __CORBA_ORB_run by itself.
+#define CORBA_ORB_run __CORBA_ORB_run
+
+#endif
+
+void
+CORBA_ORB_run(CORBA_ORB orb, CORBA_Environment *ev)
+{
+ ORBit_custom_run_setup(orb, ev);
+
+ orb_server_keep_running = TRUE;
+
+ giop_main();
+}
+
+static void
+ORBit_handle_incoming_request(GIOPRecvBuffer *recv_buffer)
+{
+ CORBA_ORB orb;
+ PortableServer_POA poa;
+ GIOPConnection *connection;
+ ORBit_MessageValidationResult mvr;
+ gboolean do_unuse = TRUE;
+
+ g_assert(recv_buffer);
+
+ connection = GIOP_MESSAGE_BUFFER(recv_buffer)->connection;
+ g_return_if_fail(connection != NULL);
+
+ orb = connection->orb_data;
+
+ g_return_if_fail(orb != NULL);
+
+ ORBit_Trace(TraceMod_ORB, TraceLevel_Debug,
+ "Received request %s, id %d, on %s",
+ recv_buffer->message.u.request.operation,
+ recv_buffer->message.u.request.request_id,
+ recv_buffer->message.u.request.object_key._buffer);
+
+ if(ORBIT_request_validator)
+ mvr = ORBIT_request_validator(recv_buffer->message.u.request.request_id,
+ &recv_buffer->message.u.request.requesting_principal,
+ recv_buffer->message.u.request.operation);
+ else
+ mvr = ORBIT_MESSAGE_ALLOW;
+
+ if(mvr == ORBIT_MESSAGE_ALLOW_ALL)
+ connection->is_auth = TRUE;
+
+ if(mvr != ORBIT_MESSAGE_BAD) {
+ /* Find the POA for this incoming request */
+ poa = ORBit_find_POA_for_request((PortableServer_POA)orb->root_poa,
+ recv_buffer);
+
+ if(poa)
+ do_unuse = ORBit_POA_handle_request(recv_buffer, poa);
+ else
+ g_warning("No POA found for operation %s [%d]",
+ recv_buffer->message.u.request.operation,
+ recv_buffer->message.u.request.request_id);
+ } else {
+ g_warning("Request %s, ID %d was rejected by the authentication mechanism!",
+ recv_buffer->message.u.request.operation,
+ recv_buffer->message.u.request.request_id);
+ }
+
+ if(do_unuse)
+ giop_recv_buffer_unuse(recv_buffer);
+}
+
+static void
+ORBit_handle_incoming_locate_request(GIOPRecvBuffer *recv_buffer)
+{
+ CORBA_ORB orb;
+ PortableServer_POA poa;
+ GIOPConnection *connection;
+ GIOPSendBuffer *send_buffer;
+
+ g_assert(recv_buffer!=NULL);
+
+ connection = GIOP_MESSAGE_BUFFER(recv_buffer)->connection;
+ g_return_if_fail(connection != NULL);
+
+ orb = connection->orb_data;
+
+ g_return_if_fail(orb != NULL);
+
+ ORBit_Trace(TraceMod_ORB, TraceLevel_Debug,
+ "Received locate request id %d, on %s",
+ recv_buffer->message.u.locate_request.request_id,
+ recv_buffer->message.u.locate_request.object_key._buffer);
+ /* Find the POA for this incoming request */
+ poa = ORBit_find_POA_for_locate_request((PortableServer_POA)orb->root_poa, recv_buffer);
+
+ if(poa) {
+ /* Object found, reply with "Object Here" */
+ send_buffer = giop_send_locate_reply_buffer_use(connection,
+ recv_buffer->message.u.locate_request.request_id,
+ GIOP_OBJECT_HERE);
+ giop_send_buffer_write(send_buffer);
+ giop_send_buffer_unuse(send_buffer);
+ } else {
+ /* Object not found, reply with "Unknown Object" */
+ send_buffer = giop_send_locate_reply_buffer_use(connection,
+ recv_buffer->message.u.locate_request.request_id,
+ GIOP_UNKNOWN_OBJECT);
+ giop_send_buffer_write(send_buffer);
+ giop_send_buffer_unuse(send_buffer);
+ }
+
+ giop_recv_buffer_unuse(recv_buffer);
+}
+
+static void
+ORBit_handle_incoming_message(GIOPRecvBuffer *recv_buffer)
+{
+ GIOPConnection *connection;
+
+ g_assert(recv_buffer);
+
+ connection = GIOP_MESSAGE_BUFFER(recv_buffer)->connection;
+ g_return_if_fail(connection != NULL);
+
+ switch(GIOP_MESSAGE_BUFFER(recv_buffer)->message_header.message_type) {
+ case GIOP_REQUEST:
+ ORBit_handle_incoming_request(recv_buffer);
+ break;
+ case GIOP_LOCATEREQUEST:
+ ORBit_handle_incoming_locate_request(recv_buffer);
+ break;
+ case GIOP_CLOSECONNECTION:
+ /* Lame hack - need to do this in a manner that isn't
+ IIOP-specific */
+ giop_recv_buffer_unuse(recv_buffer);
+ giop_main_handle_connection_exception(connection);
+ break;
+ case GIOP_REPLY:
+ /* the above comment probably applies here also... */
+ giop_received_list_push(recv_buffer);
+ break;
+ default:
+ g_warning("discarding message type %d (id possibly %d)",
+ GIOP_MESSAGE_BUFFER(recv_buffer)->message_header.message_type,
+ GIOP_MESSAGE_BUFFER(recv_buffer)->message_header.message_type?recv_buffer->message.u.reply.request_id:recv_buffer->message.u.request.request_id);
+ break;
+ }
+}
+
+static PortableServer_POA
+ORBit_find_POA_for_request(PortableServer_POA poa,
+ GIOPRecvBuffer *recv_buffer)
+{
+ return ORBit_POA_find_POA_for_object_key(poa,
+ &recv_buffer->message.u.request.object_key);
+}
+
+static PortableServer_POA
+ORBit_find_POA_for_locate_request(PortableServer_POA poa,
+ GIOPRecvBuffer *recv_buffer)
+{
+ return ORBit_POA_find_POA_for_object_key(poa,
+ &recv_buffer->message.u.locate_request.object_key);
+}
+
+void
+ORBit_set_request_validation_handler(ORBit_request_validate validator)
+{
+ ORBIT_request_validator = validator;
+}
diff -urN linux-2.4.1/net/korbit/orb/typecode.c linux-2.4.1-korbit/net/korbit/orb/typecode.c
--- linux-2.4.1/net/korbit/orb/typecode.c Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/typecode.c Thu Feb 1 11:47:14 2001
@@ -0,0 +1,104 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter, Red Hat Software
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ * Elliot Lee <sopwith@cuc.edu>
+ *
+ */
+
+#include "orbit.h"
+#include "orbit_typecode.h"
+
+const struct CORBA_TypeCode_struct TC_null_struct=
+ {{{(ORBit_RootObject_Interface *)&ORBit_TypeCode_epv, CORBA_FALSE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_null, "null", "", 0, 0, NULL, NULL, NULL, NULL, -1, 0, 0, 0};
+const struct CORBA_TypeCode_struct TC_void_struct=
+ {{{(ORBit_RootObject_Interface *)&ORBit_TypeCode_epv, CORBA_FALSE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_void, "void", "", 0, 0, NULL, NULL, NULL, NULL, -1, 0, 0, 0};
+const struct CORBA_TypeCode_struct TC_short_struct=
+ {{{(ORBit_RootObject_Interface *)&ORBit_TypeCode_epv, CORBA_FALSE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_short, "short", "", 0, 0, NULL, NULL, NULL, NULL, -1, 0, 0, 0};
+const struct CORBA_TypeCode_struct TC_long_struct=
+ {{{(ORBit_RootObject_Interface *)&ORBit_TypeCode_epv, CORBA_FALSE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_long, "long", "", 0, 0, NULL, NULL, NULL, NULL, -1, 0, 0, 0};
+const struct CORBA_TypeCode_struct TC_longlong_struct=
+ {{{(ORBit_RootObject_Interface *)&ORBit_TypeCode_epv, CORBA_FALSE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_longlong, "long long", "", 0, 0, NULL, NULL, NULL, NULL, -1, 0, 0, 0};
+const struct CORBA_TypeCode_struct TC_ushort_struct=
+ {{{(ORBit_RootObject_Interface *)&ORBit_TypeCode_epv, CORBA_FALSE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_ushort, "unsigned short", "", 0, 0, NULL, NULL, NULL, NULL, -1, 0, 0, 0};
+const struct CORBA_TypeCode_struct TC_ulong_struct=
+ {{{(ORBit_RootObject_Interface *)&ORBit_TypeCode_epv, CORBA_FALSE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_ulong, "unsigned long", "", 0, 0, NULL, NULL, NULL, NULL, -1, 0, 0, 0};
+const struct CORBA_TypeCode_struct TC_ulonglong_struct=
+ {{{(ORBit_RootObject_Interface *)&ORBit_TypeCode_epv, CORBA_FALSE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_ulonglong, "unsigned long long", "", 0, 0, NULL, NULL, NULL, NULL, -1, 0, 0, 0};
+const struct CORBA_TypeCode_struct TC_float_struct=
+ {{{(ORBit_RootObject_Interface *)&ORBit_TypeCode_epv, CORBA_FALSE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_float, "float", "", 0, 0, NULL, NULL, NULL, NULL, -1, 0, 0, 0};
+const struct CORBA_TypeCode_struct TC_double_struct=
+ {{{(ORBit_RootObject_Interface *)&ORBit_TypeCode_epv, CORBA_FALSE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_double, "double", "", 0, 0, NULL, NULL, NULL, NULL, -1, 0, 0, 0};
+const struct CORBA_TypeCode_struct TC_longdouble_struct=
+ {{{(ORBit_RootObject_Interface *)&ORBit_TypeCode_epv, CORBA_FALSE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_longdouble, "long double", "", 0, 0, NULL, NULL, NULL, NULL, -1, 0, 0, 0};
+const struct CORBA_TypeCode_struct TC_boolean_struct=
+ {{{(ORBit_RootObject_Interface *)&ORBit_TypeCode_epv, CORBA_FALSE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_boolean, "boolean", "", 0, 0, NULL, NULL, NULL, NULL, -1, 0, 0, 0};
+const struct CORBA_TypeCode_struct TC_char_struct=
+ {{{(ORBit_RootObject_Interface *)&ORBit_TypeCode_epv, CORBA_FALSE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_char, "char", "", 0, 0, NULL, NULL, NULL, NULL, -1, 0, 0, 0};
+const struct CORBA_TypeCode_struct TC_wchar_struct=
+ {{{(ORBit_RootObject_Interface *)&ORBit_TypeCode_epv, CORBA_FALSE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_wchar, "wide char", "", 0, 0, NULL, NULL, NULL, NULL, -1, 0, 0, 0};
+const struct CORBA_TypeCode_struct TC_octet_struct=
+ {{{(ORBit_RootObject_Interface *)&ORBit_TypeCode_epv, CORBA_FALSE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_octet, "octet", "", 0, 0, NULL, NULL, NULL, NULL, -1, 0, 0, 0};
+const struct CORBA_TypeCode_struct TC_any_struct=
+ {{{(ORBit_RootObject_Interface *)&ORBit_TypeCode_epv, CORBA_FALSE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_any, "any", "", 0, 0, NULL, NULL, NULL, NULL, -1, 0, 0, 0};
+const struct CORBA_TypeCode_struct TC_TypeCode_struct=
+ {{{(ORBit_RootObject_Interface *)&ORBit_TypeCode_epv, CORBA_FALSE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_TypeCode, "TypeCode", "", 0, 0, NULL, NULL, NULL, NULL, -1, 0, 0, 0};
+const struct CORBA_TypeCode_struct TC_Principal_struct=
+ {{{(ORBit_RootObject_Interface *)&ORBit_TypeCode_epv, CORBA_FALSE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_Principal, "Principal", "", 0, 0, NULL, NULL, NULL, NULL, -1, 0, 0, 0};
+const struct CORBA_TypeCode_struct TC_Object_struct=
+ {{{(ORBit_RootObject_Interface *)&ORBit_TypeCode_epv, CORBA_FALSE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_objref, "Object Reference", "", 0, 0, NULL, NULL, NULL, NULL, -1, 0, 0, 0};
+const struct CORBA_TypeCode_struct TC_string_struct=
+ {{{(ORBit_RootObject_Interface *)&ORBit_TypeCode_epv, CORBA_FALSE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_string, "string", "", 0, 0, NULL, NULL, NULL, NULL, -1, 0, 0, 0};
+const struct CORBA_TypeCode_struct TC_wstring_struct=
+ {{{(ORBit_RootObject_Interface *)&ORBit_TypeCode_epv, CORBA_FALSE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_wstring, "wide string", "", 0, 0, NULL, NULL, NULL, NULL, -1, 0, 0, 0};
+const struct CORBA_TypeCode_struct TC_CORBA_NamedValue_struct=
+ {{{(ORBit_RootObject_Interface *)&ORBit_TypeCode_epv, CORBA_FALSE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_struct, "CORBA NamedValue", "", 0, 0, NULL, NULL, NULL, NULL, -1, 0, 0, 0};
+
+static const CORBA_TypeCode anon_subtypes_array7[] =
+{(CORBA_TypeCode) & TC_CORBA_string_struct};
+
+#if (TC_IMPL_TC_CORBA_Identifier_0 == '/')
+const struct CORBA_TypeCode_struct TC_CORBA_Identifier_struct =
+{
+ {
+ {(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE},
+ CORBA_tk_alias, "Identifier", "IDL:omg.org/CORBA/Identifier:1.0",
+ 0, 1,
+ NULL,
+ (CORBA_TypeCode *) anon_subtypes_array7,
+ NULL,
+ CORBA_OBJECT_NIL, 0, -1, 0, 0
+};
+#endif
+
+#if (TC_IMPL_TC_CORBA_RepositoryId_0 == '/')
+const struct CORBA_TypeCode_struct TC_CORBA_RepositoryId_struct =
+{
+ {
+ {(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE},
+ CORBA_tk_alias, "RepositoryId", "IDL:omg.org/CORBA/RepositoryId:1.0",
+ 0, 1,
+ NULL,
+ (CORBA_TypeCode *) anon_subtypes_array7,
+ NULL,
+ CORBA_OBJECT_NIL, 0, -1, 0, 0
+};
+#endif
diff -urN linux-2.4.1/net/korbit/orb/typecode.h linux-2.4.1-korbit/net/korbit/orb/typecode.h
--- linux-2.4.1/net/korbit/orb/typecode.h Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/orb/typecode.h Thu Feb 1 11:47:14 2001
@@ -0,0 +1,31 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * ORBit: A CORBA v2.2 ORB
+ *
+ * Copyright (C) 1998 Richard H. Porter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Author: Dick Porter <dick@cymru.net>
+ *
+ */
+
+#ifndef _ORBIT_TYPECODE_H_
+#define _ORBIT_TYPECODE_H_
+
+#include "orbit_types.h"
+
+#endif /* !_ORBIT_TYPECODE_H_ */
diff -urN linux-2.4.1/net/korbit/sup/CVS/Entries linux-2.4.1-korbit/net/korbit/sup/CVS/Entries
--- linux-2.4.1/net/korbit/sup/CVS/Entries Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/sup/CVS/Entries Thu Feb 1 11:47:15 2001
@@ -0,0 +1 @@
+D
diff -urN linux-2.4.1/net/korbit/sup/CVS/Repository linux-2.4.1-korbit/net/korbit/sup/CVS/Repository
--- linux-2.4.1/net/korbit/sup/CVS/Repository Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/sup/CVS/Repository Thu Feb 1 11:47:15 2001
@@ -0,0 +1 @@
+/cvsroot/korbit/linux/net/korbit/sup
diff -urN linux-2.4.1/net/korbit/sup/CVS/Root linux-2.4.1-korbit/net/korbit/sup/CVS/Root
--- linux-2.4.1/net/korbit/sup/CVS/Root Thu Jan 1 03:00:00 1970
+++ linux-2.4.1-korbit/net/korbit/sup/CVS/Root Thu Feb 1 11:47:15 2001
@@ -0,0 +1 @@
+vraalsen@cvs.korbit.sourceforge.net:/cvsroot/korbit