db@sunbim.be (Danny Backx) (10/18/90)
I managed to add DECnet support for Sun's (Sunlink DNI) to Xlib.
Here's what I sent to xbugs :
X Window System Bug Report
xbugs@expo.lcs.mit.edu
VERSION:
R4
CLIENT MACHINE and OPERATING SYSTEM:
Sun (All)
DISPLAY TYPE:
All
WINDOW MANAGER:
All
AREA:
Xlib
SYNOPSIS:
There is no support for X over DECnet for Sun's. This used to be impossible
due to Sunlink DNI bugs. I have a working version now...
DESCRIPTION:
You need Sunlink DNI 6.0 + the 'DNI 6.0 Jumbo Patch'.
(Patch ID 100107-01, dated 17-Aug-90).
I came up with a hacked up version of XConnDis.c and Xlibos.h.
There are two problems with the implementation :
1. There seems to be no way to find out how many bytes are ready for
being read on a DNI socket. So I used select with a randomly chosen
timeout, and told the rest of Xlib that there was one packet of data
ready to be read.
2. The Sunlink DNI implementation is non-standard about setting
non-blocking I/O. So I had to remove the original syscall, and
insert the appropriate one.
Due to the wonders of shared libraries, this does allow you to use any
program that uses a shared Xlib with the DECnet protocols...
SAMPLE FIX:
*** XConnDis.c.orig Thu Oct 18 11:02:37 1990
--- XConnDis.c Thu Oct 18 13:10:31 1990
***************
*** 1,3 ****
--- 1,4 ----
+ #define NEED_REPLIES
/*
* $XConsortium: XConnDis.c,v 11.65 89/12/09 19:10:20 rws Exp $
*
***************
*** 33,40 ****
#include <X11/Xauth.h>
#include <ctype.h>
#ifdef DNETCONN
! #include <netdnet/dn.h>
! #include <netdnet/dnetdb.h>
#endif
#ifndef X_CONNECTION_RETRIES /* number retries on ECONNREFUSED */
--- 34,45 ----
#include <X11/Xauth.h>
#include <ctype.h>
#ifdef DNETCONN
! # ifndef sun
! # include <netdnet/dn.h>
! # include <netdnet/dnetdb.h>
! # else /* SUN */
! # include <netdni/dni.h>
! # endif
#endif
#ifndef X_CONNECTION_RETRIES /* number retries on ECONNREFUSED */
***************
*** 278,283 ****
--- 283,291 ----
ioctl (fd, FIOSNBIO, &arg);
}
#else
+ #if defined(DNETCONN) && defined(sun)
+ if (! dnet)
+ #endif
(void) fcntl (fd, F_SETFL, FNDELAY);
#endif /* FIOSNBIO */
***************
*** 360,365 ****
--- 368,374 ----
#ifdef DNETCONN
+ #ifndef sun
static int MakeDECnetConnection (phostname, idisplay, retries,
familyp, saddrlenp, saddrp)
char *phostname;
***************
*** 411,416 ****
--- 420,489 ----
bcopy ((char *)&dnaddr, *saddrp, *saddrlenp);
return fd;
}
+ #else /* SUN */
+ /*
+ ** This is an attempt to make Xlib work with SunLink DNI 6.0 (+Jumbo patch)
+ **
+ ** Danny Backx, BIM, 17/10/1990
+ */
+ static int MakeDECnetConnection (phostname, idisplay, retries,
+ familyp, saddrlenp, saddrp)
+ char *phostname;
+ int idisplay;
+ int retries;
+ int *familyp; /* RETURN */
+ int *saddrlenp; /* RETURN */
+ char **saddrp; /* RETURN */
+ {
+ int fd;
+ char objname[20];
+ OpenBlock opblk;
+ struct ses_io_type sesopts;
+
+ if (!phostname) phostname = "0";
+
+ /*
+ * build the target object name.
+ */
+ sprintf (objname, "X$X%d", idisplay);
+
+ /*
+ * Attempt to open the DECnet connection, return -1 if fails; ought to
+ * do some retries here....
+ */
+ if ((fd = open("/dev/dni", O_RDWR)) < 0)
+ return -1;
+ if (ioctl(fd, SES_GET_LINK, 0) < 0) {
+ close(fd);
+ return -1;
+ }
+
+ *familyp = FamilyDECnet;
+ strcpy(opblk.op_node_name, phostname);
+ strcpy(opblk.op_task_name, objname);
+ opblk.op_userid[0] = '\0';
+ opblk.op_object_nbr = 0;
+ opblk.op_account[0] = '\0';
+ opblk.op_password[0] = '\0';
+ opblk.op_opt_data.im_length = 0;
+
+ if (ioctl(fd, SES_LINK_ACCESS, &opblk)) {
+ close(fd);
+ return -1;
+ }
+
+ *saddrlenp = 4;
+ *saddrp = phostname;
+
+ /* This may not belong here... */
+ sesopts.io_flags = SES_IO_NBIO;
+ if (ioctl(fd, SES_IO_TYPE, &sesopts)) {
+ close(fd);
+ return -1;
+ }
+ return fd;
+ }
+ #endif /* SUN */
#endif /* DNETCONN */
***************
*** 795,797 ****
--- 868,893 ----
(void) WritevToServer (dpy->fd, iovarray, niov);
return;
}
+
+ #if defined(DNETCONN) && defined(sun)
+
+ int _dni_bytes_readable(fd, ptr)
+ int fd, *ptr;
+ {
+ fd_set rfs;
+ int r;
+ struct timeval to;
+
+ FD_ZERO(&rfs);
+ FD_SET(fd, &rfs);
+ to.tv_sec = 0;
+ to.tv_usec = 100; /* Arbitrary, but not too long (1/10 sec) */
+
+ if (select(32, &rfs, 0, 0, &to) > 0)
+ *ptr = sizeof(xReply); /* Tell Xlib there is 1 packet */
+ else
+ *ptr = 0;
+
+ return 0;
+ }
+ #endif
*** Xlibos.h.orig Thu Oct 18 12:52:02 1990
--- Xlibos.h Wed Oct 17 16:27:50 1990
***************
*** 26,32 ****
#include <sys/uio.h> /* needed for XlibInt.c */
#include <sys/param.h> /* needed for XConnDis.c */
! #define BytesReadable(fd, ptr) ioctl ((fd), FIONREAD, (ptr))
#define MSKCNT ((NOFILE + 31) / 32) /* size of bit array */
#endif /* att else bsdish */
--- 26,36 ----
#include <sys/uio.h> /* needed for XlibInt.c */
#include <sys/param.h> /* needed for XConnDis.c */
! #if defined(DNETCONN) && defined(sun)
! # define BytesReadable(fd, ptr) _dni_bytes_readable((fd), (ptr))
! #else
! # define BytesReadable(fd, ptr) ioctl ((fd), FIONREAD, (ptr))
! #endif
#define MSKCNT ((NOFILE + 31) / 32) /* size of bit array */
#endif /* att else bsdish */
Danny Backx
BIM Networks System Engineer
E-Mail: db@sunbim.be (or uunet!mcsun!ub4b!sunbim!db)
Telephone: +32(2)759.59.25 Fax : +32(2)759.47.95
Postal Mail :
Danny Backx
BIM
Kwikstraat 4
3078 Everberg
Belgium