Пример #1
0
static int
TRANS(Os2Write)(XtransConnInfo ciptr, char *buf, int size)
{
    int ret;
    APIRET rc;
    ULONG nWritten;
    PRMSG(2,"Os2Write(%d,%x,%d)\n", ciptr->fd, buf, size );
    rc = DosWrite(ciptr->fd, buf, size, &nWritten);
    if (rc == 0){
         ret = nWritten;
         if(nWritten == 0) {
                 errno=EAGAIN;
                 ret = -1;
                 }
         }
    else if ((rc == 39) || (rc == 112)){
        errno = EAGAIN;
        ret = -1;
        }
    else if ((rc == 109) || (rc == 230) || (rc == 233)){
        errno = EPIPE;
        ret = -1;
        }
    else if (rc == 6){
         errno=EBADF;
         ret = -1;
         }
    else {
        PRMSG(2,"(Os2Write)Unknown return code from DosWrite, fd %d rc=%d\n", ciptr->fd,rc,0 );
        errno = EINVAL;
        ret = -1;
        }
    return (ret);
}
Пример #2
0
static XtransConnInfo
TRANS(DNETOpenCOTSServer) (Xtransport *thistrans, char *protocol, 
			   char *host, char *port)

{
    XtransConnInfo	ciptr;

    PRMSG (2,"DNETOpenCOTSServer(%s,%s,%s)\n", protocol, host, port);

    if ((ciptr = (XtransConnInfo) xcalloc (
	1, sizeof(struct _XtransConnInfo))) == NULL)
    {
	PRMSG (1, "DNETOpenCOTSServer: malloc failed\n", 0, 0, 0);
	return NULL;
    }

    if ((ciptr->fd = socket (AF_DECnet, SOCK_STREAM, 0)) < 0)
    {
	xfree ((char *) ciptr);
	return NULL;
    }

    ciptr->index = 0;		/* only one form of DECnet */

    return (ciptr);
}
Пример #3
0
static int
TRANS(Os2Read)(XtransConnInfo ciptr, char *buf, int size)
{
    int ret;
    APIRET rc;
    ULONG ulRead;
    PRMSG(2,"Os2Read(%d,%x,%d)\n", ciptr->fd, buf, size );
    errno = 0;
    rc = DosRead(ciptr->fd, buf, size, &ulRead);
    if (rc == 0){
        ret = ulRead;
        }
    else if ((rc == 232) || (rc == 231)){
        errno = EAGAIN;
        ret = -1;
        }
    else if (rc == 6){
        errno = EBADF;
        ret = -1;
        }
     else if ((rc == 109) || (rc == 230) || (rc == 233)){
        errno = EPIPE;
       ret = -1;
        }
    else {
           PRMSG(2,"Os2Read: Unknown return code from DosRead, fd %d rc=%d\n", ciptr->fd,rc,0 );
           errno = EINVAL;
           ret = -1;
           }
    return (ret);
}
Пример #4
0
int
TRANS(Connect) (XtransConnInfo ciptr, char *address)

{
    char	*protocol;
    char	*host;
    char	*port;
    int		ret;

    PRMSG (2,"Connect(%d,%s)\n", ciptr->fd, address, 0);

    if (TRANS(ParseAddress) (address, &protocol, &host, &port) == 0)
    {
	PRMSG (1,"Connect: Unable to Parse address %s\n",
	       address, 0, 0);
	return -1;
    }

    if (!port || !*port)
    {
	PRMSG (1,"Connect: Missing port specification in %s\n",
	      address, 0, 0);
	if (protocol) xfree (protocol);
	if (host) xfree (host);
	return -1;
    }

    ret = ciptr->transptr->Connect (ciptr, host, port);

    if (protocol) xfree (protocol);
    if (host) xfree (host);
    if (port) xfree (port);
    
    return ret;
}
Пример #5
0
static int
TRANS(DNETGetPeerAddr) (XtransConnInfo ciptr)

{
    struct sockaddr_dn	sockname;
    int			namelen = sizeof(sockname);

    PRMSG (3,"DNETGetPeerAddr(%x)\n", ciptr, 0, 0);

    if (getpeername (ciptr->fd, (struct sockaddr *) &sockname, &namelen) < 0)
    {
	PRMSG (1,"DNETGetPeerAddr: getpeername() failed: %d\n",
	      EGET(), 0, 0);
	return -1;
    }

    /*
     * Everything looks good: fill in the XtransConnInfo structure.
     */

    if ((ciptr->peeraddr = (char *) xalloc (namelen)) == NULL)
    {
        PRMSG (1,
	      "DNETGetPeerAddr: Can't allocate space for the addr\n",
	      0, 0, 0);
        return -1;
    }

    ciptr->peeraddrlen = namelen;
    memcpy (ciptr->peeraddr, &sockname, ciptr->peeraddrlen);

    return 0;
}
Пример #6
0
static XtransConnInfo
TRANS(DNETAccept) (XtransConnInfo ciptr, int *status)

{
    XtransConnInfo	newciptr;
    struct sockaddr_dn	sockname;
    int			namelen = sizeof(sockname);

    PRMSG (2, "DNETAccept(%x,%d)\n", ciptr, ciptr->fd, 0);

    if ((newciptr = (XtransConnInfo) xcalloc(
	1, sizeof (struct _XtransConnInfo))) == NULL)
    {
	PRMSG (1, "DNETAccept: malloc failed\n", 0, 0, 0);
	*status = TRANS_ACCEPT_BAD_MALLOC;
	return NULL;
    }

    if((newciptr->fd = accept (ciptr->fd,
	(struct sockaddr *) &sockname, &namelen)) < 0)
    {
	PRMSG (1, "DNETAccept: accept() failed\n", 0, 0, 0);

	xfree (newciptr);
	*status = TRANS_ACCEPT_FAILED;
	return NULL;
    }

    /*
     * Get this address again because the transport may give a more 
     * specific address now that a connection is established.
     */

    if (TRANS(DNETGetAddr) (newciptr) < 0)
    {
	PRMSG(1,
	"DNETAccept: ...DNETGetAddr() failed:\n", 0, 0, 0);
	close (newciptr->fd);
	xfree (newciptr);
	*status = TRANS_ACCEPT_MISC_ERROR;
        return NULL;
    }

    if (TRANS(DNETGetPeerAddr) (newciptr) < 0)
    {
	PRMSG(1,
	"DNETAccept: ...DNETGetPeerAddr() failed:\n", 0, 0, 0);

	close (newciptr->fd);
	if (newciptr->addr) xfree (newciptr->addr);
	xfree (newciptr);
	*status = TRANS_ACCEPT_MISC_ERROR;
        return NULL;
    }

    *status = 0;

    return newciptr;
}
Пример #7
0
static XtransConnInfo
TRANS(Os2OpenCLTSClient)(Xtransport *thistrans, char *protocol,
			 char *host, char *port)
{
	PRMSG(2,"Os2OpenCLTSClient(%s,%s,%s)\n",protocol,host,port);
	return TRANS(Os2OpenClient)(thistrans, protocol, host, port);
}
Пример #8
0
static int
TRANS(Os2BytesReadable)(XtransConnInfo ciptr, BytesReadable_t *pend )
{
   ULONG rc, state, nread;
  AVAILDATA avail;
  char buffer;

  PRMSG(2,"Os2BytesReadable(%x->%d,%x)\n", ciptr, ciptr->fd, pend);

  rc = DosPeekNPipe (ciptr->fd, &buffer, 0, &nread, &avail, &state);
  if (rc != 0)
    {
      errno = EPIPE;
      *pend = 0;
      return -1;
    }
  if (state == NP_STATE_CLOSING)
     {
        errno = EPIPE;
        *pend = 0;
        return -1;
      }
  errno = 0;
  *pend = avail.cbpipe;
  return 0;
}
Пример #9
0
int
TRANS(NoListen) (char * protocol)
	
{
   Xtransport *trans;
   int i = 0, ret = 0;
   
   if ((trans = TRANS(SelectTransport)(protocol)) == NULL) 
   {
	PRMSG (1,"TransNoListen: unable to find transport: %s\n", 
	       protocol, 0, 0);

	return -1;
   }
   if (trans->flags & TRANS_ALIAS) {
       if (trans->nolisten)
	   while (trans->nolisten[i]) {
	       ret |= TRANS(NoListen)(trans->nolisten[i]);
	       i++;
       }
   }

   trans->flags |= TRANS_NOLISTEN;
   return ret;
}
Пример #10
0
static Xtransport *
TRANS(SelectTransport) (char *protocol)

{
    char 	protobuf[PROTOBUFSIZE];
    int		i;

    PRMSG (3,"SelectTransport(%s)\n", protocol, 0, 0);

    /*
     * Force Protocol to be lowercase as a way of doing
     * a case insensitive match.
     */

    strncpy (protobuf, protocol, PROTOBUFSIZE - 1);

    for (i = 0; i < PROTOBUFSIZE && protobuf[i] != '\0'; i++)
	if (isupper (protobuf[i]))
	    protobuf[i] = tolower (protobuf[i]);

    /* Look at all of the configured protocols */

    for (i = 0; i < NUMTRANS; i++)
    {
	if (!strcmp (protobuf, Xtransports[i].transport->TransName))
	    return Xtransports[i].transport;
    }

    return NULL;
}
Пример #11
0
XtransConnInfo
TRANS(OpenCLTSClient) (char *address)

{
    PRMSG (2,"OpenCLTSClient(%s)\n", address, 0, 0);
    return TRANS(Open) (XTRANS_OPEN_CLTS_CLIENT, address);
}
Пример #12
0
XtransConnInfo
TRANS(OpenCLTSServer) (char *address)

{
    PRMSG (2,"OpenCLTSServer(%s)\n", address, 0, 0);
    return TRANS(Open) (XTRANS_OPEN_CLTS_SERVER, address);
}
Пример #13
0
XtransConnInfo
TRANS(ReopenCLTSServer) (int trans_id, int fd, char *port)

{
    PRMSG (2,"ReopenCLTSServer(%d, %d, %s)\n", trans_id, fd, port);
    return TRANS(Reopen) (XTRANS_OPEN_CLTS_SERVER, trans_id, fd, port);
}
Пример #14
0
static XtransConnInfo
TRANS(Os2OpenCOTSServer)(Xtransport *thistrans, char *protocol,
			 char *host, char *port)
{
	PRMSG(2,"Os2OpenCOTSServer(%s,%s,%s)\n",protocol,host,port);
	return TRANS(Os2OpenServer)(thistrans, protocol, host, port);
}
Пример #15
0
static XtransConnInfo
TRANS(Os2ReopenCOTSServer)(Xtransport *thistrans, int fd, char *port)
{

    XtransConnInfo ciptr;
    char addr_name[256];
    int namelen;

    PRMSG(2,"Os2ReopenCOTSServer(%d,%s)\n", fd, port, 0);

    if( (ciptr=(XtransConnInfo)xcalloc(1,sizeof(struct _XtransConnInfo))) == NULL )
    {
	PRMSG(1,"Os2ReopenCOTSServer: xcalloc(1,%d) failed\n",
	      sizeof(struct _XtransConnInfo),0,0 );
	return NULL;
    }

        strcpy(addr_name,"local");
        namelen=sizeof(addr_name);
        if ((ciptr->addr = (char *) xalloc (namelen)) == NULL)
          {
                PRMSG (1, "Os2ReopenCOTSServer: Can't allocate space for the addr\n",
	        0, 0, 0);
                xfree(ciptr);
                return(NULL);
           }

        ciptr->addrlen = namelen;
        memcpy (ciptr->addr, addr_name, ciptr->addrlen);
        if ((ciptr->peeraddr = (char *) xalloc (namelen)) == NULL)
          {
                PRMSG (1, "Os2ReopenCOTSServer: Can't allocate space for the addr\n",
	        0, 0, 0);
                xfree(ciptr);
                return(NULL);
           }

       ciptr->peeraddrlen = namelen;
       memcpy (ciptr->peeraddr,addr_name, ciptr->addrlen);

    ciptr->fd = fd;
    ciptr->family=AF_UNIX;
    ciptr->flags=1;
    PRMSG(1,"Os2ReopenCOTSServer: Filled-in info for handle %d on port %s.\n", fd, port, 0);

    return(ciptr);
}
Пример #16
0
static int
TRANS(DNETReadv) (XtransConnInfo ciptr, struct iovec *buf, int size)

{
    PRMSG (2,"DNETReadv(%d,%x,%d)\n", ciptr->fd, buf, size);

    return READV (ciptr, buf, size);
}
Пример #17
0
static int
TRANS(DNETSetOption) (XtransConnInfo ciptr, int option, int arg)

{
    PRMSG (2,"DNETSetOption(%d,%d,%d)\n", ciptr->fd, option, arg);

    return -1;
}
Пример #18
0
static int
TRANS(Os2Close)(XtransConnInfo ciptr)
{
    int ret;
    PRMSG(2,"Os2Close(%x->%d)\n", ciptr, ciptr->fd ,0);
    ret=close(ciptr->fd);
    return ret;
}
Пример #19
0
static int
TRANS(DNETWritev) (XtransConnInfo ciptr, struct iovec *buf, int size)

{
    PRMSG (2,"DNETWritev(%d,%x,%d)\n", ciptr->fd, buf, size);

    return WRITEV (ciptr, buf, size);
}
Пример #20
0
static int
TRANS(DNETDisconnect) (XtransConnInfo ciptr)

{
    PRMSG (2,"DNETDisconnect(%x,%d)\n", ciptr, ciptr->fd, 0);

    return shutdown (ciptr->fd, 2); /* disallow further sends and receives */
}
Пример #21
0
static int
TRANS(DNETClose) (XtransConnInfo ciptr)

{
    PRMSG (2,"DNETClose(%x,%d)\n", ciptr, ciptr->fd, 0);

    return close (ciptr->fd);
}
Пример #22
0
static int
TRANS(Os2Readv)(XtransConnInfo ciptr, struct iovec *buf, int size)
{
    int ret;
    PRMSG(2,"Os2Readv(%d,%x,%d)\n", ciptr->fd, buf, size );
    ret = READV(ciptr,buf,size);
    if ((ret <0) && (errno == EINVAL)) errno = EPIPE;
    return (ret);
}
Пример #23
0
int
TRANS(GetPeerAddr) (XtransConnInfo ciptr, int *familyp, int *addrlenp, 
		    Xtransaddr **addrp)

{
    PRMSG (2,"GetPeerAddr(%d)\n", ciptr->fd, 0, 0);

    *familyp = ciptr->family;
    *addrlenp = ciptr->peeraddrlen;

    if ((*addrp = (Xtransaddr *) xalloc (ciptr->peeraddrlen)) == NULL)
    {
	PRMSG (1,"GetPeerAddr: malloc failed\n", 0, 0, 0);
	return -1;
    }
    memcpy(*addrp, ciptr->peeraddr, ciptr->peeraddrlen);

    return 0;
}
Пример #24
0
static XtransConnInfo
TRANS(DNETOpenCLTSServer) (Xtransport *thistrans, char *protocol, 
			   char *host, char *port)

{
    /* NEED TO IMPLEMENT */

    PRMSG (2,"DNETOpenCLTSServer(%s,%s,%s)\n", protocol, host, port);
    return NULL;
}
Пример #25
0
static int
TRANS(Os2Writev)(XtransConnInfo ciptr, struct iovec *buf, int size)
{
    int ret;
    PRMSG(2,"Os2Writev(%d,%x,%d)\n", ciptr->fd, buf, size );
    ret = WRITEV(ciptr,buf,size);
    if ((ret <0) && (errno == EINVAL)) errno = EPIPE;
    if ((ret <0) && (errno == ENOSPC)) errno = EAGAIN;
    return (ret);
}
Пример #26
0
static XtransConnInfo
TRANS(DNETReopenCLTSServer) (Xtransport *thistrans, int fd, char *port)

{
    XtransConnInfo	ciptr;

    PRMSG (2,"DNETReopenCLTSServer(%d,%s)\n", fd, port, 0);

    if ((ciptr = (XtransConnInfo) xcalloc (
	1, sizeof(struct _XtransConnInfo))) == NULL)
    {
	PRMSG (1, "DNETReopenCLTSServer: malloc failed\n", 0, 0, 0);
	return NULL;
    }

    ciptr->fd = fd;
    ciptr->index = 0;		/* only one form of DECnet */

    return (ciptr);
}
Пример #27
0
int
TRANS(WSAStartup) (void)
{
    static WSADATA wsadata;

    PRMSG (2,"WSAStartup()\n", 0, 0, 0);

    if (!wsadata.wVersion && WSAStartup(0x0101, &wsadata))
        return 1;
    return 0;
}
Пример #28
0
static int
TRANS(DNETBytesReadable) (XtransConnInfo ciptr, BytesReadable_t *pend)

{
    PRMSG (2,"DNETBytesReadable(%x,%d,%x)\n", ciptr, ciptr->fd, pend);

#ifdef WIN32
    return ioctlsocket ((SOCKET) ciptr->fd, FIONREAD, (u_long *) pend);
#else
    return ioctl(ciptr->fd, FIONREAD, (char *)pend);
#endif /* WIN32 */
}
Пример #29
0
static int
TRANS(DNETWrite) (XtransConnInfo ciptr, char *buf, int size)

{
    PRMSG (2,"DNETWrite(%d,%x,%d)\n", ciptr->fd, buf, size);

#ifdef WIN32
    return send ((SOCKET)ciptr->fd, buf, size, 0);
#else
    return write (ciptr->fd, buf, size);
#endif /* WIN32 */
}
Пример #30
0
static XtransConnInfo
TRANS(DNETOpenCLTSClient) (Xtransport *thistrans, char *protocol, 
			   char *host, char *port)

{
    XtransConnInfo	ciptr;

    PRMSG (2,"DNETOpenCLTSClient(%s,%s,%s)\n", protocol, host, port);

    if ((ciptr = (XtransConnInfo) xcalloc (
	1, sizeof (struct _XtransConnInfo))) == NULL)
    {
	PRMSG (1, "DNETOpenCLTSClient: malloc failed\n", 0, 0, 0);
	return NULL;
    }

    ciptr->index = 0;		/* only one form of DECnet */

    /* nothing else to do here */

    return ciptr;
}