Index: dlls/winsock/socket.c
===================================================================
RCS file: /home/wine/wine/dlls/winsock/socket.c,v
retrieving revision 1.138
diff -u -r1.138 socket.c
--- dlls/winsock/socket.c	14 Oct 2003 05:27:43 -0000	1.138
+++ dlls/winsock/socket.c	8 Nov 2003 19:30:10 -0000
@@ -122,6 +122,7 @@
 #include "winsock2.h"
 #include "ws2tcpip.h"
 #include "wsipx.h"
+#include "wsnwlink.h"
 #include "wine/winsock16.h"
 #include "winnt.h"
 #include "wownt32.h"
@@ -1248,7 +1249,7 @@
  * Work horse for both synchronous and asynchronous send() operations.
  */
 static int WS2_send ( int fd, struct iovec* iov, int count,
-                      const struct WS_sockaddr *to, INT tolen, DWORD dwFlags )
+                      const struct WS_sockaddr *to, INT tolen, DWORD dwFlags, SOCKET s )
 {
     struct msghdr hdr;
     int n = -1;
@@ -1262,7 +1263,27 @@
 #if DEBUG_SOCKADDR
         dump_sockaddr (to);
 #endif
-        hdr.msg_name = (struct sockaddr*) ws_sockaddr_ws2u ( to, tolen, &hdr.msg_namelen );
+
+#ifdef HAVE_IPX
+	if(to->sa_family == WS_AF_IPX)
+	{
+            struct sockaddr_ipx* uipx;
+	    uipx = (struct sockaddr_ipx*) ws_sockaddr_ws2u ( to, tolen, &hdr.msg_namelen );
+
+	    SERVER_START_REQ(packet_type )
+	    {
+		req->flags = IPX_GET_PTYPE;
+		req->handle = SOCKET2HANDLE(s);
+    		wine_server_call( req );
+    		uipx->sipx_type=reply->ptype;
+	    }
+	    SERVER_END_REQ;
+	    hdr.msg_name = (struct sockaddr*) uipx;
+	}    
+	else
+#endif
+            hdr.msg_name = (struct sockaddr*) ws_sockaddr_ws2u ( to, tolen, &hdr.msg_namelen );
+
         if ( !hdr.msg_name )
         {
             WSASetLastError ( WSAEFAULT );
@@ -1309,7 +1330,7 @@
     }
 
     result = WS2_send ( wsa->async.fd, wsa->iovec, wsa->n_iovecs,
-                        wsa->addr, wsa->addrlen.val, wsa->flags );
+                        wsa->addr, wsa->addrlen.val, wsa->flags, 0);
 
     if (result >= 0)
     {
@@ -1827,6 +1848,55 @@
         return 0;
     }
 
+#ifdef HAVE_IPX
+    if(level == NSPROTO_IPX)
+    {
+    	struct WS_sockaddr_ipx addr;
+	IPX_ADDRESS_DATA *data;
+	int namelen;
+	switch(optname)
+	{
+	    case IPX_PTYPE:
+		SERVER_START_REQ(packet_type )
+		{
+		    req->flags = IPX_GET_PTYPE;
+		    req->handle = SOCKET2HANDLE (s);
+
+    		    wine_server_call( req );
+    		    *(int*)optval = reply->ptype;
+		    *optlen = sizeof(int);
+		}
+		SERVER_END_REQ;
+		return 0;
+		break;	    
+    	    case IPX_ADDRESS:
+		namelen = sizeof(struct WS_sockaddr);
+		memset(&addr, 0, sizeof(struct WS_sockaddr));
+		WS_getsockname(s, (struct WS_sockaddr*)&addr, &namelen);
+
+		data = (IPX_ADDRESS_DATA*)optval;
+                memcpy(data->nodenum,&addr.sa_nodenum,sizeof(data->nodenum));
+                memcpy(data->netnum,&addr.sa_netnum,sizeof(data->netnum));
+		data->adapternum = 0;
+		data->wan = FALSE; /* We are not on a wan for now .. */
+		data->status = FALSE; /* Since we are not on a wan, the wan link isn't up */
+		data->maxpkt = 1500; /* Is this value correct, I found it on a IPX page */
+		data->linkspeed = 100000; /* Set the line speed in 100bits, for now assume 10Mbit */
+		FIXME("IPX_ADDRESS\n");
+		return 0;	
+		break;
+	    case IPX_MAX_ADAPTER_NUM:
+    		*(int*)optval = 1; /* Only one card for the moment .. */
+		FIXME("IPX_MAX_ADAPTER_NUM\n");
+		return 0;
+		break;
+	    default:
+		FIXME("opt_name:%x\n", optname);
+		return SOCKET_ERROR;
+	}
+    }
+#endif
+
     fd = _get_sock_fd(s);
     if (fd != -1)
     {
@@ -2504,7 +2574,7 @@
         do_block(fd, POLLOUT);
     }
 
-    n = WS2_send ( fd, iovec, dwBufferCount, to, tolen, dwFlags );
+    n = WS2_send ( fd, iovec, dwBufferCount, to, tolen, dwFlags, s);
     if ( n == -1 )
     {
         err = wsaErrno();
@@ -2600,6 +2670,46 @@
         return 0;
     }
 
+
+#ifdef HAVE_IPX
+    if(level == NSPROTO_IPX)
+    {
+    	struct WS_sockaddr addr;
+	struct sockaddr_ipx* sipx;
+	int namelen, uaddrlen;
+	switch(optname)
+	{
+	    case IPX_PTYPE:
+		namelen = sizeof(struct WS_sockaddr);
+		memset(&addr, 0, sizeof(struct WS_sockaddr));
+		WS_getsockname(s, &addr, &namelen);
+		sipx = (struct sockaddr_ipx*)ws_sockaddr_ws2u(&addr, sizeof(addr), &uaddrlen);
+
+		SERVER_START_REQ(packet_type )
+		{
+		    req->flags = IPX_SET_PTYPE;
+		    req->handle = SOCKET2HANDLE (s);
+	
+		    req->value = *optval;
+    		    wine_server_call( req );
+		}
+		SERVER_END_REQ;
+
+		return 0;
+		break;
+	    case IPX_FILTERPTYPE:
+		/* sets the receive filter packet type */
+		/* SO_ATTACH_FILTER ??*/
+		FIXME("IPX_FILTERPTYPE: %x\n", *optval);
+		return 0;
+		break;
+	    default:
+		FIXME("opt_name:%x\n", optname);
+		return SOCKET_ERROR;
+	}
+	return 0;
+    }
+#endif
 
     fd = _get_sock_fd(s);
     if (fd != -1)
Index: include/wine/server_protocol.h
===================================================================
RCS file: /home/wine/wine/include/wine/server_protocol.h,v
retrieving revision 1.88
diff -u -r1.88 server_protocol.h
--- include/wine/server_protocol.h	14 Oct 2003 01:30:42 -0000	1.88
+++ include/wine/server_protocol.h	8 Nov 2003 19:30:13 -0000
@@ -3114,6 +3114,23 @@
 #define SET_GLOBAL_TASKMAN_WINDOW  0x04
 
 
+struct packet_type_request
+{
+    struct request_header __header;
+    obj_handle_t handle;
+    unsigned int flags;
+    int value;
+};
+struct packet_type_reply
+{
+    struct reply_header __header;
+    int ptype;
+};
+
+#define IPX_GET_PTYPE 0x1
+#define IPX_SET_PTYPE 0x2
+
+
 enum request
 {
     REQ_new_process,
@@ -3295,6 +3312,7 @@
     REQ_set_clipboard_info,
     REQ_open_token,
     REQ_set_global_windows,
+    REQ_packet_type,
     REQ_NB_REQUESTS
 };
 
@@ -3481,6 +3499,7 @@
     struct set_clipboard_info_request set_clipboard_info_request;
     struct open_token_request open_token_request;
     struct set_global_windows_request set_global_windows_request;
+    struct packet_type_request packet_type_request;
 };
 union generic_reply
 {
@@ -3665,8 +3684,9 @@
     struct set_clipboard_info_reply set_clipboard_info_reply;
     struct open_token_reply open_token_reply;
     struct set_global_windows_reply set_global_windows_reply;
+    struct packet_type_reply packet_type_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 126
+#define SERVER_PROTOCOL_VERSION 129
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
Index: server/protocol.def
===================================================================
RCS file: /home/wine/wine/server/protocol.def,v
retrieving revision 1.87
diff -u -r1.87 protocol.def
--- server/protocol.def	14 Oct 2003 01:30:42 -0000	1.87
+++ server/protocol.def	8 Nov 2003 19:30:16 -0000
@@ -2175,3 +2175,15 @@
 #define SET_GLOBAL_SHELL_WINDOWS   0x01  /* set both main shell and listview windows */
 #define SET_GLOBAL_PROGMAN_WINDOW  0x02
 #define SET_GLOBAL_TASKMAN_WINDOW  0x04
+
+/* store ipx packet type to work around linux/windows socket incompatibilities */
+@REQ(packet_type)
+    obj_handle_t handle;        /* handle to the socket */
+    unsigned int flags;		/* get/set packet type */
+    int value;			/* packet type */
+@REPLY
+    int ptype;
+@END
+
+#define IPX_GET_PTYPE 0x1	/* get ipx packet type */
+#define IPX_SET_PTYPE 0x2	/* set ipx packet type */
Index: server/sock.c
===================================================================
RCS file: /home/wine/wine/server/sock.c,v
retrieving revision 1.46
diff -u -r1.46 sock.c
--- server/sock.c	5 Sep 2003 23:15:41 -0000	1.46
+++ server/sock.c	8 Nov 2003 19:30:17 -0000
@@ -84,6 +84,7 @@
     struct sock*        deferred;    /* socket that waits for a deferred accept */
     struct async_queue  read_q;      /* Queue for asynchronous reads */
     struct async_queue  write_q;     /* Queue for asynchronous writes */
+    int			ptype;	     /* packte type in the case of IPX */
 };
 
 static void sock_dump( struct object *obj, int verbose );
@@ -616,6 +617,7 @@
     sock->event   = NULL;
     sock->window  = 0;
     sock->message = 0;
+    sock->ptype   = 0;
     sock->wparam  = 0;
     sock->deferred = NULL;
     if (!(sock->fd = create_anonymous_fd( &sock_fd_ops, sockfd, &sock->obj )))
@@ -925,3 +927,23 @@
     sock->deferred = acceptsock;
     release_object ( sock );
 }
+
+DECL_HANDLER(packet_type)
+{
+    struct sock *sock;
+
+    sock=(struct sock*)get_handle_obj( current->process,req->handle,
+                                       GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE,&sock_ops );
+    if(!sock)
+    {
+        return;
+    }
+
+    if(req->flags == IPX_GET_PTYPE)
+       reply->ptype = sock->ptype;
+    else
+       sock->ptype = req->value;
+
+     release_object ( sock );
+}
+      
