📄 ckcnet.c
字号:
padparms[PAD_SUPPRESSION_OF_DATA] = 0; /* no supression of user data */ padparms[PAD_PADDING_AFTER_CR] = 0; /* no padding after CR */ padparms[PAD_LINE_FOLDING] = 0; /* no line fold */ padparms[PAD_LINE_SPEED] = 0; /* line speed - don't care */ padparms[PAD_FLOW_CONTROL_BY_USER] = 0; /* flow cont of PAD - not used */ padparms[PAD_LF_AFTER_CR] = 0; /* no LF insertion after CR */ padparms[PAD_PADDING_AFTER_LF] = 0; /* no padding after LF */ padparms[PAD_EDITING] = 1; /* can edit */ padparms[PAD_CHAR_DELETE_CHAR] = 8; /* character delete character */ padparms[PAD_BUFFER_DELETE_CHAR] = 21; /* buffer delete character */ padparms[PAD_BUFFER_DISPLAY_CHAR] = 18; /* buffer display character */}/* Set PAD parameters */VOIDsetpad(s,n) CHAR *s; int n; { int i; CHAR *ps = s; for (i = 0; i < n; i++) { if (*ps > MAXPADPARMS) x29err[i+2] = *ps; else padparms[*ps] = *(ps+1); ps += 2; }}/* Read PAD parameters */VOIDreadpad(s,n,r) CHAR *s; int n; CHAR *r; { int i; CHAR *ps = s; CHAR *pr = r; *pr++ = X29_PARAMETER_INDICATION; for (i = 0; i < n; i++, ps++) { if (*ps > MAXPADPARMS) { x29err[i+2] = *ps++; } else { *pr++ = *ps; *pr++ = padparms[*ps++]; } }}intqbitpkt(s,n) CHAR *s; int n; { CHAR *ps = s; int x29cmd = *ps; CHAR *psa = s+1; CHAR x29resp[(MAXPADPARMS*2)+1]; switch (x29cmd) { case X29_SET_PARMS: setpad (ps+1,n/2); if ((int)strlen(x29err) > 2) { ttol (x29err,(int)strlen(x29err)); x29err[2] = '\0'; } return (-2); case X29_READ_PARMS: readpad (ps+1,n/2,x29resp); setqbit (); ttol (x29resp,n+1); if ((int)strlen(x29err) > 2) { ttol (x29err,(int)strlen(x29err)); x29err[2] = '\0'; } resetqbit(); break; case X29_SET_AND_READ_PARMS: setpad (ps+1,n/2); readpad (ps+1,n/2,x29resp); setqbit(); ttol (x29resp,n+1); if ((int)strlen(x29err) > 2) { ttol (x29err,(int)strlen(x29err)); x29err [2] = '\0'; } resetqbit(); return (-2); case X29_INVITATION_TO_CLEAR: (VOID) x25clear(); return (-1) ; case X29_INDICATION_OF_BREAK: break; } return (0);}/* PAD break action processor */VOIDbreakact() { extern char x25obuf[MAXOX25]; extern int obufl; extern int active; extern unsigned char tosend; static CHAR indbrk[3] = { X29_INDICATION_OF_BREAK, PAD_SUPPRESSION_OF_DATA, 1 }; CHAR intudat, cause, diag; if (x25stat() < 0) return(0); /* Ignore if no virtual call established */ if (padparms[PAD_BREAK_ACTION] != 0) /* Forward condition */ if (ttol(x25obuf,obufl) < 0) { perror ("\r\nCan't send characters"); active = 0; } else { bzero (x25obuf,sizeof(x25obuf)); obufl = 0; tosend = 0; }; switch (padparms[PAD_BREAK_ACTION]) { case 0 : break; /* do nothing */ case 1 : /* send interrupt packet with interrupt user data field = 1 */ intudat = 1; x25intr (intudat); break; case 2 : /* send reset packet with cause and diag = 0 */ cause = diag = 0; x25reset (cause,diag); break; case 5 : /* send interrupt packet with interrupt user data field = 0 */ intudat = 0; x25intr (intudat) ; setqbit (); /* send indication of break without a parameter field */ ttoc(X29_INDICATION_OF_BREAK); resetqbit (); break; case 8 : active = 0; /* leave data transfer */ conol ("\r\n"); break; case 21: /* send interrupt packet with interrupt user data field = 0 */ intudat = 0; x25intr (intudat); setpad (indbrk+1,2); /* set pad to discard input */ setqbit (); /* send indication of break with parameter field */ ttol (indbrk,sizeof(indbrk)); resetqbit (); break; }}/* X.25 support functions */X25_CAUSE_DIAG diag;/* Convert a null-terminated string representing an X.121 address to a packed BCD form.*/intpkx121(str,bcd) char *str; CHAR *bcd; { int i, j; u_char c; i = j = 0; while (str[i]) { if ( i >= 15 || str [i] < '0' || str [i] > '9' ) return (-1); c = str [i] - '0'; if ( i & 1 ) bcd [j++] |= c; else bcd [j] = c << 4; i++; } return (i);}/* Reads and prints X.25 diagnostic */intx25diag () { int i; bzero ((char *)&diag,sizeof(diag)); if (ioctl(ttyfd,X25_RD_CAUSE_DIAG,&diag)) { perror ("Reading X.25 diagnostic"); return(-1); } if (diag.datalen > 0) { printf ("X.25 Diagnostic :"); for (i = 0; i < diag.datalen; i++) printf (" %02x",diag.data[i]); printf ("\r\n"); } return(0);}/* X.25 Out-of-Band Signal Handler */VOIDx25oobh() { int oobtype; u_char oobdata; (VOID) signal(SIGURG,x25oobh); do { if (ioctl(ttyfd,X25_OOB_TYPE,&oobtype)) { perror ("Getting signal type"); return; } switch (oobtype) { case INT_DATA: if (recv(ttyfd,oobdata,1,MSG_OOB) < 0) { perror ("Receiving X.25 interrupt data"); return; } printf ("\r\nInterrupt received, data = %d\r\n", oobdata); break; case VC_RESET: printf ("\r\nVirtual circuit reset\r\n"); x25diag (); break; case N_RESETS: printf ("\r\nReset timeout\r\n"); break; case N_CLEARS: printf ("\r\nClear timeout\r\n"); break; case MSG_TOO_LONG: printf ("\r\nMessage discarded, too long\r\n"); break; default: if (oobtype) printf("\r\nUnknown oob type %d\r\n",oobtype); break; } } while (oobtype);}/* Send a X.25 interrupt packet */int#ifdef CK_ANSICx25intr(char intr)#elsex25intr(intr) char intr;#endif /* CK_ANSIC *//* x25intr */ { if (send(ttyfd,&intr,1,MSG_OOB) < 0) return(-1); debug(F100,"X.25 intr","",0); return(0);}/* Reset X.25 virtual circuit */int#ifdef CK_ANSICx25reset(char cause, char diagn)#elsex25reset(cause, diagn) char cause; char diagn;#endif /* CK_ANSIC *//* x25reset */ { bzero ((char *)&diag,sizeof(diag)); diag.flags = 0; diag.datalen = 2; diag.data[0] = cause; diag.data[1] = diagn; if (ioctl(ttyfd,X25_WR_CAUSE_DIAG,&diag) < 0) return(-1); debug(F100,"X.25 reset","",0); return(0);}/* Clear X.25 virtual circuit */intx25clear() { int i; debug(F100,"X.25 clear","",0); bzero ((char *)&diag,sizeof(diag)); diag.flags = (1 << DIAG_TYPE); diag.datalen = 2; diag.data[0] = 0; diag.data[1] = 0; ioctl (ttyfd,X25_WR_CAUSE_DIAG,&diag); /* Send Clear Request */ return(ttclos(0)); /* Close socket */}/* X.25 status */intx25stat() { if (ttyfd < 0) return (-1); return(0);}/* Set Q_BIT on */VOIDsetqbit() { static int qbiton = 1 << Q_BIT; ioctl (ttyfd,X25_SEND_TYPE,&qbiton);}/* Set Q_BIT off */VOIDresetqbit() { static int qbitoff = 0; ioctl (ttyfd,X25_SEND_TYPE,&qbitoff);}/* Read n characters from X.25 circuit into buf */intx25xin(n,buf) int n; CHAR *buf; { register int x, c; int qpkt; do { x = read(ttyfd,buf,n); if (buf[0] & (1 << Q_BIT)) { /* If Q_BIT packet, process it */ /* If return -1 : invitation to clear; -2 : PAD changes */ if ((c=qbitpkt(buf+1,x-2)) < 0) return(c); qpkt = 1; } else qpkt = 0; } while (qpkt); if (x > 0) buf[x] = '\0'; if (x < 1) x = -1; debug(F101,"x25xin x","",x); return(x);}#ifdef COMMENT /* NO LONGER NEEDED! *//* X.25 read a line */int#ifdef PARSENSE#ifdef CK_ANSICx25inl(CHAR *dest, int max,int timo, CHAR eol, CHAR start)#elsex25inl(dest,max,timo,eol,start) int max,timo; CHAR *dest, eol, start;#endif /* CK_ANSIC */#else /* not PARSENSE */#ifdef CK_ANSICx25inl(CHAR *dest, int max,int timo, CHAR eol)#elsex25inl(dest,max,timo,eol) int max,timo; CHAR *dest, eol;#endif /* __SDTC__ */#endif /* PARSENSE *//* x25inl */ { CHAR *pdest; int pktype, goteol, rest, n; int i, flag = 0; extern int ttprty, ttpflg; int ttpmsk; ttpmsk = (ttprty) ? 0177 : 0377; /* Set parity stripping mask */ debug(F101,"x25inl max","",max); debug(F101,"x25inl eol","",eol); pdest = dest; rest = max; goteol = 0; do { n = read(ttyfd,pdest,rest); n--; pktype = *pdest & 0x7f; switch (pktype) { case 1 << Q_BIT: if (qbitpkt(pdest+1,--n) < 0) return(-2); break; default: if (flag == 0) { /* if not in packet, search start */ for (i = 1; (i < n) && !(flag = ((dest[i] & 0x7f) == start)); i++); if (flag == 0) { /* not found, discard junk */ debug(F101,"x25inl skipping","",n); continue; } else { /* found, discard junk before start */ int k; n = n - i + 1; for (k = 1; k <= n; k++, i++) dest[k] = dest[i]; } } for (i = 0; (i < n) && /* search for eol */ !(goteol=(((*pdest = *(pdest+1)&ttpmsk)&0x7f)== eol)); i++,pdest++); *pdest = '\0'; rest -= n; } } while ( (rest > 0) && (!goteol) ); if (goteol) { n = max - rest; debug (F111,"x25inl X.25 got",(char *) dest,n); if (timo) ttimoff(); if (ttpflg++ == 0 && ttprty == 0) { if ((ttprty = parchk(dest,start,n)) > 0) { int j; debug(F101,"x25inl senses parity","",ttprty); debug(F110,"x25inl packet before",(char *)dest,0); ttpmsk = 0x7f; for (j = 0; j < n; j++) dest[j] &= 0x7f; /* Strip parity from packet */ debug(F110,"x25inl packet after ",dest,0); } else { debug(F101,"parchk","",ttprty); if (ttprty < 0) { ttprty = 0; n = -1; } } } ttimoff(); return(n); } ttimoff(); return(-1);}#endif /* COMMENT */#endif /* SUNX25 */#endif /* NETCONN */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -