Linux MS DOS discussions
 help / color / mirror / Atom feed
From: Stas Sergeev <stssppnn@yahoo.com>
To: linux-msdos@vger.kernel.org
Subject: Re: checking IPX route
Date: Thu, 08 Aug 2002 02:22:58 +0400	[thread overview]
Message-ID: <3D519DC2.2060707@yahoo.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 289 bytes --]

Hello.

> The attached patch is completely untested,
> please check if it works. I think I have
> completely preserved the logic of your patch,
> but who knows...
Yes, it is still completely untested but
contains one bug less than the previous one:)
Grigory, please see if this one works.

[-- Attachment #2: ipx_proc.diff --]
[-- Type: text/plain, Size: 3887 bytes --]

--- src/dosext/net/net/ipxglt.c	Fri Aug  2 18:31:46 2002
+++ src/dosext/net/net/ipxglt.c	Thu Aug  8 00:19:14 2002
@@ -33,6 +33,7 @@
 
 #include "emu.h"
 #include "dosemu_select.h"
+#include "utilities.h"
 
 #define FALSE   0
 #define TRUE    1
@@ -55,14 +56,16 @@
 	struct sockaddr_ipx	*st = (struct sockaddr_ipx *)&rt.rt_dst;
 	struct sockaddr_ipx	*sr = (struct sockaddr_ipx *)&rt.rt_gateway;
 	int sock;
-	int i;
 	
+	if (!can_do_root_stuff) {
+		error("IPX: Cannot add route, root privs required!\n");
+		return -2;
+	}
+
 	rt.rt_flags = RTF_GATEWAY;
 	st->sipx_network = targetNet;
         sr->sipx_network = network;
-	for( i=0; i<6; i++ ) {
-		sr->sipx_node[i] = node[i];
-	}	
+	memcpy(sr->sipx_node, node, 6);
 	sr->sipx_family = st->sipx_family = AF_IPX;
 	
 	enter_priv_on();
@@ -85,6 +88,33 @@
         return(0);
 }
 
+int CheckRouteExist(unsigned long targetNet, unsigned network,
+        unsigned char node[])
+{
+char buf_targ[9], buf_net[9], buf_node[13], proc_net[9], proc_node[13], *proc_str;
+
+	sprintf(buf_targ, "%08lX", (unsigned long)htonl(targetNet));
+	sprintf(buf_net, "%08lX", (unsigned long)htonl(network));
+	sprintf(buf_node, "%02X%02X%02X%02X%02X%02X", node[0], node[1],
+                     node[2], node[3], node[4], node[5]);
+
+	open_proc_scan("/proc/net/ipx_route");
+	proc_str = get_proc_string_by_key(buf_targ);
+
+	if (!proc_str) {
+		close_proc_scan();
+		return 0;
+	}
+
+	sscanf(proc_str, "%s %s", proc_net, proc_node);
+	close_proc_scan();
+
+	if (strcmp(buf_net, proc_net) || strcmp(buf_node, proc_node))
+		return 0;
+
+	return 1;
+}
+
 /* network must be passed in in network order (that is, high-low) */
 /* returns 0 on success, less than 0 on failure */
 int IPXGetLocalTarget( unsigned long network, int *hops, int *ticks )
@@ -220,20 +250,27 @@
         
                 *hops = htons(RipResponse.Hops);
                 *ticks = htons(RipResponse.Ticks);
-                retCode = AddRoute( network, ipxs.sipx_network,
+		if (CheckRouteExist(network, ipxs.sipx_network, ipxs.sipx_node)) {
+		   n_printf("IPX: Route <%08lx through %08lx:%02x%02x%02x%02x%02x%02x> already exists\n",
+                     (unsigned long int)htonl(network), (unsigned long int)htonl(ipxs.sipx_network),
+                     ipxs.sipx_node[0],ipxs.sipx_node[1],ipxs.sipx_node[2],
+                     ipxs.sipx_node[3],ipxs.sipx_node[4],ipxs.sipx_node[5] );
+		} else {
+                  retCode = AddRoute( network, ipxs.sipx_network,
                         ipxs.sipx_node );
-                if( retCode < 0 ) {
-                        n_printf("IPX: Failure %d adding route <%08lx through %08lx:%02x%02x%02x%02x%02x%02x>\n",
-                                retCode,
+                  if( retCode < 0 ) {
+                        error("IPX: Failure adding route <%08lx through %08lx:%02x%02x%02x%02x%02x%02x>\n",
                                 (unsigned long int)htonl(network), (unsigned long int)htonl(ipxs.sipx_network),
                                 ipxs.sipx_node[0],ipxs.sipx_node[1],ipxs.sipx_node[2],
                                 ipxs.sipx_node[3],ipxs.sipx_node[4],ipxs.sipx_node[5] );
-                } else {
+			error("IPX: Try manually add this route with ipx_route command\nor use RIP daemon like ipxripd\n");
+                  } else {
                         n_printf("IPX: Success adding route <%08lx through %08lx:%02x%02x%02x%02x%02x%02x>\n",
                                 (unsigned long int)htonl(network), (unsigned long int)htonl(ipxs.sipx_network),
                                 ipxs.sipx_node[0],ipxs.sipx_node[1],ipxs.sipx_node[2],
                                 ipxs.sipx_node[3],ipxs.sipx_node[4],ipxs.sipx_node[5] );
-                }
+                  }
+		}
         } else {
                 printf("IPX: Error %d in GetLocalTarget main packet send/receive loop\n", retCode);
         }

             reply	other threads:[~2002-08-07 22:22 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-08-07 22:22 Stas Sergeev [this message]
2002-08-08  4:53 ` checking IPX route Grigory Batalov
  -- strict thread matches above, loose matches on Subject: below --
2002-08-07 20:32 Stas Sergeev
2002-08-07 12:43 Grigory Batalov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3D519DC2.2060707@yahoo.com \
    --to=stssppnn@yahoo.com \
    --cc=linux-msdos@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox