⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ckcnet.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 4 页
字号:
  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 + -