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

📄 ckutio.c

📁 C语言核心协议的C语言源代码,用于早期网络通信
💻 C
📖 第 1 页 / 共 4 页
字号:
/* Got the line, now set the desired value for local. */    if (*lcl < 0) *lcl = xlocal;/* Some special stuff for v7... */#ifdef	V7	if (kmem[TTY] < 0) {	/*  If open, then skip this.  */		qaddr[TTY] = initrawq(ttyfd);	/* Init the queue. */		if ((kmem[TTY] = open("/dev/kmem", 0)) < 0) {			fprintf(stderr, "Can't read /dev/kmem in ttopen.\n");			perror("/dev/kmem");			exit(1);		}	}#endif	V7/* Request exclusive access on systems that allow it. */#ifndef XENIX/* Xenix exclusive access prevents open(close(...)) from working... */#ifdef TIOCEXCL    	if (ioctl(ttyfd,TIOCEXCL, NULL) < 0)	    fprintf(stderr,"Warning, problem getting exclusive access\n");#endif#endif/* Get tty device settings */#ifndef UXIII    gtty(ttyfd,&ttold);			/* Get sgtty info */    gtty(ttyfd,&ttraw);			/* And a copy of it for packets*/    gtty(ttyfd,&tttvt);			/* And one for virtual tty service */#else    ioctl(ttyfd,TCGETA,&ttold);		/* Same deal for Sys III, Sys V */    ioctl(ttyfd,TCGETA,&ttraw);    ioctl(ttyfd,TCGETA,&tttvt);#endif    debug(F101,"ttopen, ttyfd","",ttyfd);    debug(F101," lcl","",*lcl);    debug(F111," lock file",flfnam,lkf);    return(0);}/*  T T C L O S  --  Close the TTY, releasing any lock.  */ttclos() {    if (ttyfd < 0) return(0);		/* Wasn't open. */    if (xlocal) {	if (tthang())			/* Hang up phone line */	    fprintf(stderr,"Warning, problem hanging up the phone\n");    	if (ttunlck())			/* Release uucp-style lock */	    fprintf(stderr,"Warning, problem releasing lock\n");    }    ttres();				/* Reset modes. *//* Relinquish exclusive access if we might have had it... */#ifndef XENIX#ifdef TIOCEXCL#ifdef TIOCNXCL    if (ioctl(ttyfd, TIOCNXCL, NULL) < 0)    	fprintf(stderr,"Warning, problem relinquishing exclusive access\n");#endif#endif#endif    close(ttyfd);			/* Close it. */    ttyfd = -1;				/* Mark it as closed. */    return(0);}/*  T T H A N G -- Hangup phone line */tthang() {#ifdef UXIII    unsigned short ttc_save;#endif    if (ttyfd < 0) return(0);		/* Not open. */#ifdef ANYBSD    ioctl(ttyfd,TIOCCDTR,0);		/* Clear DTR */    msleep(500);			/* Let things settle */    ioctl(ttyfd,TIOCSDTR,0);		/* Restore DTR */#endif#ifdef UXIII    ttc_save = ttraw.c_cflag;    ttraw.c_cflag &= ~CBAUD;		/* swa: set baud rate to 0 to hangup */    if (ioctl(ttyfd,TCSETAF,&ttraw) < 0) return(-1); /* do it */    msleep(100);			/* let things settle */    ttraw.c_cflag = ttc_save;#ifndef XENIX		/* xenix cannot do close/open when carrier drops */				/* following corrects a PC/IX defficiency */    ttc_save = fcntl(ttyfd,F_GETFL,0);    close(ttyfd);		/* close/reopen file descriptor */    if ((ttyfd = open(ttnmsv, ttc_save)) < 0) return(-1);#endif    if (ioctl(ttyfd,TCSETAF,&ttraw) < 0) return(-1); /* un-do it */#endif    return (0);}/*  T T R E S  --  Restore terminal to "normal" mode.  */ttres() {				/* Restore the tty to normal. */    if (ttyfd < 0) return(-1);		/* Not open. */#ifndef UXIII				/* except for sIII, */    sleep(1);				/* Wait for pending i/o to finish. */#endif					/*   (sIII does wait in ioctls) */#ifdef KERLD    if (kerld) ioctl(ttyfd,TIOCSETD,&oldld); /* Restore old line discipline. */#endif#ifdef UXIII    if (ioctl(ttyfd,TCSETAW,&ttold) < 0) return(-1); /* restore termio stuff */#else    if (stty(ttyfd,&ttold) < 0) return(-1); /* Restore sgtty stuff */#endif#ifdef KERLD    if (kerld) ioctl(ttyfd,TIOCSETC,&oldc); /* Restore old special chars. */#endif    return(0);}/* Exclusive uucp file locking control *//* by H. Fischer, creative non-Bell coding ! copyright rights for lock modules assigned to Columbia University*/static char *xxlast(s,c) char *s; char c; {		/* Equivalent to strrchr() */    int i;    for (i = strlen(s); i > 0; i--)    	if ( s[i-1] == c ) return( s + (i - 1) );    return(NULL);	    }staticlook4lk(ttname) char *ttname; {    extern char *strcat(), *strcpy();    char *device, *devname;    char lockfil[50];			/* Max length for lock file name */#ifdef ISIII    char *lockdir = "/etc/locks";#else#ifdef ATT3BX    char *lockdir = "/usr/spool/locks";#else    char *lockdir = "/usr/spool/uucp";#endif#endif    device = ( (devname=xxlast(ttname,'/')) != NULL ? devname+1 : ttname);#ifdef ISIII    (void) strcpy( lockfil, device );#else    strcat( strcpy( lockfil, "LCK.." ), device );#endif    if (access( lockdir, 04 ) < 0) {	/* read access denied on lock dir */	fprintf(stderr,"Warning, read access to lock directory denied\n");	return( 1 );			/* cannot check or set lock file */    }	    strcat(strcat(strcpy(flfnam,lockdir),"/"), lockfil);    debug(F110,"look4lk",flfnam,0);    if ( ! access( flfnam, 00 ) ) {	/* print out lock file entry */	char lckcmd[40] ;	strcat( strcpy(lckcmd, "ls -l ") , flfnam);	system(lckcmd);	if (access(flfnam,02) == 0)	    printf("(You may type \"! rm %s\" to remove this file)\n",flfnam);	return( -1 );    }    if ( access( lockdir, 02 ) < 0 ) {	/* lock file cannot be written */	fprintf(stderr,"Warning, write access to lock directory denied\n");	return( 1 );    }    return( 0 );			/* okay to go ahead and lock */}/*  T T L O C K  */staticttlock(ttyfd) char *ttyfd; {		/* lock uucp if possible */#ifdef ATT3BX    FILE *lck_fild;#endif    int lck_fil, l4l;    int pid_buf = getpid();		/* pid to save in lock file */	    hasLock = 0;			/* not locked yet */    l4l = look4lk(ttyfd);    if (l4l < 0) return (-1);		/* already locked */    if (l4l == 1) return (0);		/* can't read/write lock directory */    lck_fil = creat(flfnam, 0444);	/* create lock file ... */    if (lck_fil < 0) return (-1);	/* create of lockfile failed */		/* creat leaves file handle open for writing -- hf */#ifdef ATT3BX    fprintf((lck_fild = fdopen(lck_fil, "w")), "%10d\n", pid_buf);    fflush(lck_fild);#else    write (lck_fil, &pid_buf, sizeof(pid_buf) ); /* uucp expects int in file */#endif    close (lck_fil);    hasLock = 1;			/* now is locked */    return(0);}/*  T T U N L O C K  */staticttunlck() {				/* kill uucp lock if possible */    if (hasLock) return( unlink( flfnam ) );}/*  T T P K T  --  Condition the communication line for packets. *//*		or for modem dialing */#define DIALING	4		/* flags (via flow) for modem handling */#define CONNECT 5/*  If called with speed > -1, also set the speed.  *//*  Returns 0 on success, -1 on failure.  */ttpkt(speed,flow) int speed, flow; {    int s;    if (ttyfd < 0) return(-1);		/* Not open. */#ifdef KERLD/* Note, KERLD ignores the TANDEM, ECHO, and CRMOD bits */    if (kerld) {	ioctl(ttyfd,TIOCGETD,&oldld);	/* Get line discipline */	ioctl(ttyfd,TIOCGETC,&oldc);	/* Get special chars */	newc = oldc;			/* Copy special chars */	newc.t_brkc = '\r';		/* Set CR to be break character */	if(ioctl(ttyfd,TIOCSETC,&newc) < 0) return(-1);    }#endif    s = ttsspd(speed);			/* Check the speed */#ifndef UXIII    if (flow == 1) ttraw.sg_flags |= TANDEM; /* Use XON/XOFF if selected */    if (flow == 0) ttraw.sg_flags &= ~TANDEM;    ttraw.sg_flags |= RAW;		/* Go into raw mode */    ttraw.sg_flags &= ~(ECHO|CRMOD);	/* Use CR for break character */#ifdef TOWER1    ttraw.sg_flags &= ~ANYP; 		/* Must tell Tower no parityr */#endif    if (s > -1) ttraw.sg_ispeed = ttraw.sg_ospeed = s; /* Do the speed */    if (stty(ttyfd,&ttraw) < 0) return(-1);	/* Set the new modes. */#ifdef MYREAD#ifdef BSD4/* Try to make reads nonblocking */    if (kerld == 0) {	if (fcntl(ttyfd,F_SETFL,fcntl(ttyfd,F_GETFL,0) & FNDELAY) == -1)    	    return(-1);	else return(0);    }#endif#endif#endif#ifdef UXIII    if (flow == 1) ttraw.c_iflag |= (IXON|IXOFF);    if (flow == 0) ttraw.c_iflag &= ~(IXON|IXOFF);    if (flow == DIALING)  ttraw.c_cflag |= CLOCAL|HUPCL;    if (flow == CONNECT)  ttraw.c_cflag &= ~CLOCAL;    ttraw.c_lflag &= ~(ICANON|ECHO);    ttraw.c_lflag |= ISIG;		/* do check for interrupt */    ttraw.c_iflag |= (BRKINT|IGNPAR);    ttraw.c_iflag &= ~(IGNBRK|INLCR|IGNCR|ICRNL|IUCLC|INPCK|ISTRIP|IXANY);    ttraw.c_oflag &= ~OPOST;    ttraw.c_cflag &= ~(CSIZE|PARENB);    ttraw.c_cflag |= (CS8|CREAD);    ttraw.c_cc[4] = 1;    ttraw.c_cc[5] = 0;    if (s > -1) ttraw.c_cflag &= ~CBAUD, ttraw.c_cflag |= s; /* set speed */    if (ioctl(ttyfd,TCSETAW,&ttraw) < 0) return(-1);  /* set new modes . */    if (flow == DIALING) {	if (fcntl(ttyfd,F_SETFL, fcntl(ttyfd, F_GETFL, 0) & ~O_NDELAY) < 0 )		return(-1);	close( open(ttnmsv,2) );	/* magic to force mode change!!! */	}#endif#ifdef KERLD    if (kerld) {	if (ioctl(ttyfd,TIOCSETD,&ld) < 0)	    return(-1); /* Set line discpline. */    }#endif    ttflui();				/* Flush any pending input */    return(0);}/*  T T V T -- Condition communication line for use as virtual terminal  */ttvt(speed,flow) int speed, flow; {    int s;    if (ttyfd < 0) return(-1);		/* Not open. */    s = ttsspd(speed);			/* Check the speed */#ifndef UXIII    if (flow == 1) tttvt.sg_flags |= TANDEM; /* XON/XOFF if selected */    if (flow == 0) tttvt.sg_flags &= ~TANDEM;    tttvt.sg_flags |= RAW;		/* Raw mode */#ifdef TOWER1    tttvt.sg_flags &= ~(ECHO|ANYP);	/* No echo or system III ??? parity */#else    tttvt.sg_flags &= ~ECHO;		/* No echo */#endif        if (s > -1) tttvt.sg_ispeed = tttvt.sg_ospeed = s; /* Do the speed */    if (stty(ttyfd,&tttvt) < 0) return(-1);#ifdef MYREAD#ifdef BSD4/* Make reads nonblocking */    if (kerld == 0) {	if (fcntl(ttyfd,F_SETFL,fcntl(ttyfd,F_GETFL,0) & FNDELAY) == -1)	    return(-1);	else return(0);    }#endif#endif#else    if (flow == 1) tttvt.c_iflag |= (IXON|IXOFF);    if (flow == 0) tttvt.c_iflag &= ~(IXON|IXOFF);    if (flow == DIALING)  tttvt.c_cflag |= CLOCAL|HUPCL;    if (flow == CONNECT)  tttvt.c_cflag &= ~CLOCAL;    tttvt.c_lflag &= ~(ISIG|ICANON|ECHO);    tttvt.c_iflag |= (IGNBRK|IGNPAR);    tttvt.c_iflag &= ~(INLCR|IGNCR|ICRNL|IUCLC|BRKINT|INPCK|ISTRIP|IXANY);    tttvt.c_oflag &= ~OPOST;    tttvt.c_cflag &= ~(CSIZE|PARENB);    tttvt.c_cflag |= (CS8|CREAD);    tttvt.c_cc[4] = 1;    tttvt.c_cc[5] = 0;    if (s > -1) tttvt.c_cflag &= ~CBAUD, tttvt.c_cflag |= s; /* set speed */    if (ioctl(ttyfd,TCSETAW,&tttvt) < 0) return(-1);  /* set new modes . */    if (flow == DIALING) {	if (fcntl(ttyfd,F_SETFL, fcntl(ttyfd, F_GETFL, 0) & ~O_NDELAY) < 0 )		return(-1);	close( open(ttnmsv,2) );	/* magic to force mode change!!! */	}    return(0);#endif}/*  T T S S P D  --  Return the internal baud rate code for 'speed'.  */ttsspd(speed) {    int s, spdok;    if (speed < 0) return(-1);	spdok = 1;			/* Assume arg ok */	switch (speed) {	    case 0:    s = B0;    break;	/* Just the common ones. */	    case 110:  s = B110;  break;	/* The others from ttydev.h */	    case 150:  s = B150;  break;	/* could also be included if */	    case 300:  s = B300;  break;	/* necessary... */	    case 600:  s = B600;  break;	    case 1200: s = B1200; break;	    case 1800: s = B1800; break;	    case 2400: s = B2400; break;	    case 4800: s = B4800; break;	    case 9600: s = B9600; break;#ifdef PLEXUS	    case 19200: s = EXTA; break;#endif	    default:	    	spdok = 0;		fprintf(stderr,"Unsupported line speed - %d\n",speed);		fprintf(stderr,"Current speed not changed\n");		break;	}	    	if (spdok) return(s); else return(-1); }/*  T T F L U I  --  Flush tty input buffer */ttflui() {#ifndef UXIII    long n;#endif    if (ttyfd < 0) return(-1);		/* Not open. */    ungotn = -1;			/* Initialize myread() stuff */    inbufc = 0;#ifdef UXIII    if (ioctl(ttyfd,TCFLSH,0) < 0) perror("flush failed");#else#ifdef TIOCFLUSH#ifdef ANYBSD    n = FREAD;				/* Specify read queue */    if (ioctl(ttyfd,TIOCFLUSH,&n) < 0) perror("flush failed");#else    if (ioctl(ttyfd,TIOCFLUSH,0) < 0) perror("flush failed");#endif#endif#endif    return(0);}/* Interrupt Functions *//* Timeout handler for communication line input functions */timerh() {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -