|
|
1.1 ! root 1: /* camtec.c - X.25, CONS abstractions for CAMTEC CCL */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/compat/RCS/camtec.c,v 7.1 90/07/09 14:31:37 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/compat/RCS/camtec.c,v 7.1 90/07/09 14:31:37 mrose Exp $ ! 9: * ! 10: * Contributed by Keith Ruttle, CAMTEC Electronics Ltd ! 11: * ! 12: * ! 13: * $Log: camtec.c,v $ ! 14: * Revision 7.1 90/07/09 14:31:37 mrose ! 15: * sync ! 16: * ! 17: * Revision 7.0 89/11/23 21:22:56 mrose ! 18: * Release 6.0 ! 19: * ! 20: */ ! 21: ! 22: /* ! 23: * NOTICE ! 24: * ! 25: * Acquisition, use, and distribution of this module and related ! 26: * materials are subject to the restrictions of a license agreement. ! 27: * Consult the Preface in the User's Manual for the full terms of ! 28: * this agreement. ! 29: * ! 30: */ ! 31: ! 32: ! 33: /* LINTLIBRARY */ ! 34: ! 35: #include <errno.h> ! 36: #include <stdio.h> ! 37: #include "general.h" ! 38: #include "manifest.h" ! 39: ! 40: #ifdef X25 ! 41: ! 42: #include "x25.h" ! 43: #include "isoaddrs.h" ! 44: ! 45: ! 46: #ifdef CAMTEC_CCL ! 47: ! 48: #include "tailor.h" ! 49: #include "tpkt.h" ! 50: ! 51: /* 4.[23] UNIX: CCL X25 */ ! 52: ! 53: ! 54: static char calling_dte[NSAP_DTELEN + 1]; ! 55: ! 56: /* */ ! 57: ! 58: int start_x25_client (local) ! 59: struct NSAPaddr *local; ! 60: { ! 61: int sd, pgrp; ! 62: CONN_DB l_iov; ! 63: ! 64: if (local != NULLNA) ! 65: local -> na_stack = NA_X25, local -> na_community = ts_comm_x25_default; ! 66: if ((sd = socket (AF_CCL, SOCK_STREAM, CCLPROTO_X25)) == NOTOK) { ! 67: SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("socket")); ! 68: return NOTOK; /* Error can be found in errno */ ! 69: } ! 70: ! 71: pgrp = getpid(); ! 72: if (ioctl(sd, SIOCSPGRP, &pgrp)) { ! 73: SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("SIOCSPGRP")); ! 74: return NOTOK; /* Error can be found in errno */ ! 75: } ! 76: ! 77: l_iov.ccl_iovec[0].iov_base = calling_dte; ! 78: gen2if(local, &l_iov, ADDR_LOCAL); ! 79: ! 80: return sd; ! 81: } ! 82: ! 83: /* */ ! 84: ! 85: int start_x25_server (local, backlog, opt1, opt2) ! 86: struct NSAPaddr *local; ! 87: int backlog, ! 88: opt1, ! 89: opt2; ! 90: { ! 91: int sd, pgrp; ! 92: CONN_DB b_iov; ! 93: char param1[128]; ! 94: ! 95: b_iov.ccl_iovec[0].iov_base = param1; ! 96: ! 97: if ((sd = socket (AF_CCL, SOCK_STREAM, CCLPROTO_X25)) == NOTOK) { ! 98: SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("socket")); ! 99: return NOTOK; /* Can't get an X.25 socket */ ! 100: } ! 101: ! 102: pgrp = getpid(); ! 103: if (ioctl(sd, SIOCSPGRP, &pgrp)) { ! 104: SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("SIOCSPGRP")); ! 105: return NOTOK; /* Error can be found in errno */ ! 106: } ! 107: ! 108: if (local != NULLNA) { ! 109: local -> na_stack = NA_X25, local -> na_community = ts_comm_x25_default; ! 110: if (local -> na_dtelen == 0) { ! 111: (void) strcpy (local -> na_dte, x25_local_dte); ! 112: local -> na_dtelen = strlen(x25_local_dte); ! 113: if (local -> na_pidlen == 0 && *x25_local_pid) ! 114: local -> na_pidlen = ! 115: str2sel (x25_local_pid, -1, local -> na_pid, NPSIZE); ! 116: } ! 117: } ! 118: ! 119: (void) gen2if (local, &b_iov, ADDR_LISTEN); ! 120: if (bind (sd, &b_iov, sizeof(b_iov)) != NOTOK) { ! 121: if (ioctl(sd, CCL_AUTO_ACCEPT, 1) < 0) { ! 122: SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ! 123: ("CCL_AUTO_ACCEPT")); ! 124: close (sd); ! 125: return NOTOK; ! 126: } ! 127: (void) listen (sd, backlog); ! 128: return sd; ! 129: } ! 130: ! 131: (void) close (sd); ! 132: return NOTOK; ! 133: } ! 134: ! 135: /* */ ! 136: ! 137: int join_x25_client (fd, remote) ! 138: int fd; ! 139: struct NSAPaddr *remote; ! 140: { ! 141: CONN_DB sck; ! 142: struct iovec *iov; ! 143: int i, len = 0; ! 144: int nfd; ! 145: char param1[128]; ! 146: char param2[128]; ! 147: char param3[128]; ! 148: char param4[256]; ! 149: ! 150: iov = &(sck.ccl_iovec[0]); ! 151: if((nfd = accept (fd, (char *) 0, &len)) == NOTOK) ! 152: return NOTOK; ! 153: iov[0].iov_base = param1; ! 154: iov[1].iov_base = param2; ! 155: iov[2].iov_base = param3; ! 156: iov[3].iov_base = param4; ! 157: iov[0].iov_len = iov[1].iov_len = iov[2].iov_len = 128; ! 158: iov[3].iov_len = 256; ! 159: iov[4].iov_len = iov[5].iov_len = iov[6].iov_len = 0; ! 160: if (ioctl(nfd, CCL_FETCH_CONNECT, &iov[0]) < 0) ! 161: return NOTOK; ! 162: (void) if2gen (remote, &sck, ADDR_REMOTE); ! 163: ioctl (nfd, CCL_SEND_TYPE, 0); ! 164: return nfd; ! 165: } ! 166: ! 167: int join_x25_server (fd, remote) ! 168: int fd; ! 169: struct NSAPaddr *remote; ! 170: { ! 171: CONN_DB zsck; ! 172: CONN_DB *sck = &zsck; ! 173: int r; ! 174: struct iovec *iov = &( zsck.ccl_iovec[0] ); ! 175: char param1[128]; ! 176: char param3[128]; ! 177: char param4[256]; ! 178: ! 179: if (remote == NULLNA || remote -> na_stack != NA_X25) ! 180: { ! 181: SLOG (compat_log, LLOG_EXCEPTIONS, NULLCP, ! 182: ("Invalid type na%d", remote->na_stack)); ! 183: return NOTOK; ! 184: } ! 185: ! 186: iov[0].iov_base = param1; ! 187: iov[1].iov_base = calling_dte; ! 188: iov[1].iov_len = strlen(calling_dte); ! 189: iov[2].iov_base = param3; ! 190: iov[3].iov_base = param4; ! 191: iov[4].iov_len = iov[5].iov_len = iov[6].iov_len = 0; ! 192: ! 193: (void) gen2if (remote, sck, ADDR_REMOTE); ! 194: if ((r = connect (fd, sck, sizeof (CONN_DB))) >= 0) ! 195: ioctl (fd, CCL_SEND_TYPE, 0); ! 196: bzero(calling_dte, sizeof calling_dte ); ! 197: return (r); ! 198: } ! 199: ! 200: int read_x25_socket (fd, buffer, len) ! 201: int fd, len; ! 202: char *buffer; ! 203: { ! 204: static u_char mode; ! 205: int cc, count = 0, total = len; ! 206: char *p = buffer; ! 207: ! 208: do { ! 209: cc = recv (fd, p, total, 0); ! 210: switch (cc) { ! 211: case NOTOK: ! 212: if (errno == ECONNRESET) { ! 213: struct iovec iov[7]; ! 214: char parm[34]; ! 215: int i; ! 216: iov[0].iov_base = parm; ! 217: iov[0].iov_len = 1; ! 218: iov[1].iov_base = parm + 1; ! 219: iov[1].iov_len = 32; ! 220: for (i = 2; i < 7; i++) { ! 221: iov[i].iov_base = (char *)0; ! 222: iov[i].iov_len = 0; ! 223: } ! 224: ioctl(fd, CCL_FETCH_RESET, iov); ! 225: elucidate_x25_err( 1 << RECV_DIAG, iov[0].iov_base); ! 226: } ! 227: case 0: ! 228: return cc; ! 229: ! 230: default: ! 231: ioctl (fd, CCL_RECV_TYPE, &mode); ! 232: count += cc; ! 233: p += cc; ! 234: total -= cc; ! 235: break; ! 236: } ! 237: } while (total > 0 && (mode & MORE_DATA)); ! 238: ! 239: DLOG (compat_log, LLOG_DEBUG, ! 240: ("X25 read, total %d", count )); ! 241: return count; ! 242: } ! 243: ! 244: int write_x25_socket (fd, buffer, len) ! 245: int fd, len; ! 246: char *buffer; ! 247: { ! 248: int count; ! 249: int cc; ! 250: ! 251: count = send(fd, buffer, len, 0); ! 252: DLOG (compat_log, LLOG_DEBUG, ! 253: ("X25 write, total %d/%d", count, len)); ! 254: return count; ! 255: } ! 256: #endif ! 257: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.