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

📄 ckutio.c

📁 C语言核心协议的C语言源代码,用于早期网络通信
💻 C
📖 第 1 页 / 共 4 页
字号:
	} else {	    ch = n;	    n = 1;		}#else    	n = read(ttyfd,&ch,1);		/* Otherwise call the system. */#endif    }    alarm(0);				/* Turn off timer, */    signal(SIGALRM,SIG_DFL);		/* and interrupt. */    return( (n > 0) ? (ch & 0377) : n ); /* Return char or -1. */}/*  T T S N D B  --  Send a BREAK signal  */ttsndb() {    int x; long n; char spd;    if (ttyfd < 0) return(-1);		/* Not open. */#ifdef PROVX1    gtty(ttyfd,&ttbuf);			/* Get current tty flags */    spd = ttbuf.sg_ospeed;		/* Save speed */    ttbuf.sg_ospeed = B50;		/* Change to 50 baud */    stty(ttyfd,&ttbuf);			/*  ... */    write(ttyfd,brnuls,3);		/* Send 3 nulls */    ttbuf.sg_ospeed = spd;		/* Restore speed */    stty(ttyfd,&ttbuf);			/*  ... */    return(0);#else#ifdef UXIII    if (ioctl(ttyfd,TCSBRK,(char *)0) < 0) {	/* Send a BREAK */    	perror("Can't send BREAK");	return(-1);    }    return(0);#else#ifdef ANYBSD    n = FWRITE;				/* Flush output queue. */    ioctl(ttyfd,TIOCFLUSH,&n); 		/* Ignore any errors.. */    if (ioctl(ttyfd,TIOCSBRK,(char *)0) < 0) {	/* Turn on BREAK */    	perror("Can't send BREAK");	return(-1);    }    x = msleep(275);			/* Sleep for so many milliseconds */    if (ioctl(ttyfd,TIOCCBRK,(char *)0) < 0) {	/* Turn off BREAK */	perror("BREAK stuck!!!");	doexit(1);			/* Get out, closing the line. */					/*   with exit status = 1 */    }    return(x);#else#ifdef	V7    genbrk(ttyfd);			/* Simulate a BREAK */    return(x);#endif#endif#endif#endif}/*  M S L E E P  --  Millisecond version of sleep().  *//* Intended only for small intervals.  For big ones, just use sleep().*/msleep(m) int m; {#ifdef PROVX1    if (m <= 0) return(0);    sleep(-((m * 60 + 500) / 1000));    return(0);#endif#ifdef ANYBSD    int t1, t3, t4;    if (m <= 0) return(0);#ifndef BSD42/* 2.9 and 4.1 BSD do it this way */    if (ftime(&ftp) < 0) return(-1);	/* Get current time. */    t1 = ((ftp.time & 0xff) * 1000) + ftp.millitm;    while (1) {	ftime(&ftp);			/* new time */	t3 = (((ftp.time & 0xff) * 1000) + ftp.millitm) - t1;	if (t3 > m) return (t3);    }#else/* 4.2 & above can do it with select()... */    if (gettimeofday(&tv, &tz) < 0) return(-1); /* Get current time. */    t1 = tv.tv_sec;			/* Seconds */    tv.tv_sec = 0;			/* Use select() */    tv.tv_usec = m * 1000;    return(select( 0, (int *)0, (int *)0, (int *)0, &tv) );#endif#endif#ifdef UXIII#ifdef XENIX#define CLOCK_TICK 50			/* millisecs per clock tick */#else#define CLOCK_TICK 17			/* 1/60 sec */#endif    extern long times();    long t1, t2, tarray[4];    int t3;    if (m <= 0) return(0);    if ((t1 = times(tarray)) < 0) return(-1);    while (1) {	if ((t2 = times(tarray)) < 0) return(-1);	t3 = ((int)(t2 - t1)) * CLOCK_TICK;	if (t3 > m) return(t3);    }#endif#ifdef TOWER1    int t1, t3;    if (m <= 0) return(0);    if (ftime(&ftp) < 0) return(-1);		/* Get current time. */    t1 = ((ftp.time & 0xff) * 1000) + ftp.millitm;    while (1) {	ftime(&ftp);				/* new time */	t3 = (((ftp.time & 0xff) * 1000) + ftp.millitm) - t1;	if (t3 > m) return (t3);    }#endif}/*  R T I M E R --  Reset elapsed time counter  */rtimer() {    tcount = time( (long *) 0 );}/*  G T I M E R --  Get current value of elapsed time counter in seconds  */gtimer() {    int x;    x = (int) (time( (long *) 0 ) - tcount);    rtimer();    return( (x < 0) ? 0 : x );}/*  Z T I M E  --  Return date/time string  */ztime(s) char **s; {#ifdef UXIII    extern long time();			/* Sys III/V way to do it */    char *ctime();    long clock_storage;    clock_storage = time( (long *) 0 );    *s = ctime( &clock_storage );#endif#ifdef PROVX1    int utime[2];			/* Venix way */    time(utime);    *s = ctime(utime);#endif#ifdef ANYBSD    char *asctime();			/* Berkeley way */    struct tm *localtime();    struct tm *tp;#ifdef BSD42    gettimeofday(&tv, &tz);		/* BSD 4.2 */    time(&tv.tv_sec);    tp = localtime(&tv.tv_sec);#else    time(&clock);			/* BSD 4.1, 2.9 ... ceb */    tp = localtime(&clock);#endif    *s = asctime(tp);#endif#ifdef TOWER1    char *asctime();			/* Tower way */    struct tm *localtime();    struct tm *tp;    time(&clock);    tp = localtime(&clock);    *s = asctime(tp);#endif#ifdef V7    char *asctime();			/* V7 way */    struct tm *localtime();    struct tm *tp;    time(&clock);    tp = localtime(&clock);    *s = asctime(tp);#endif}/*  C O N G M  --  Get console terminal modes.  *//* Saves current console mode, and establishes variables for switching between  current (presumably normal) mode and other modes.*/congm() {    if (!isatty(0)) return(0);		/* only for real ttys */#ifndef UXIII     gtty(0,&ccold);			/* Structure for restoring */     gtty(0,&cccbrk);			/* For setting CBREAK mode */     gtty(0,&ccraw);			/* For setting RAW mode */#else     ioctl(0,TCGETA,&ccold);     ioctl(0,TCGETA,&cccbrk);     ioctl(0,TCGETA,&ccraw);#endif     cgmf = 1;				/* Flag that we got them. */}/*  C O N C B --  Put console in cbreak mode.  *//*  Returns 0 if ok, -1 if not  */concb(esc) char esc; {    int x;    if (!isatty(0)) return(0);		/* only for real ttys */    if (cgmf == 0) congm();		/* Get modes if necessary. */    escchr = esc;			/* Make this available to other fns */    ckxech = 1;				/* Program can echo characters */#ifndef UXIII    cccbrk.sg_flags |= CBREAK;		/* Set to character wakeup, */    cccbrk.sg_flags &= ~ECHO;		/* no echo. */    x = stty(0,&cccbrk);#else    cccbrk.c_lflag &= ~(ICANON|ECHO);    cccbrk.c_cc[0] = 003;		/* interrupt char is control-c */    cccbrk.c_cc[1] = escchr;		/* escape during packet modes */    cccbrk.c_cc[4] = 1;    cccbrk.c_cc[5] = 1;    x = ioctl(0,TCSETAW,&cccbrk);  	/* set new modes . */#endif    if (x > -1) setbuf(stdout,NULL);	/* Make console unbuffered. */#ifdef	V7    if (kmem[CON] < 0) {	qaddr[CON] = initrawq(0);	if((kmem[CON] = open("/dev/kmem", 0)) < 0) {	    fprintf(stderr, "Can't read /dev/kmem in concb.\n");	    perror("/dev/kmem");	    exit(1);	}    }#endif	V7    return(x);}/*  C O N B I N  --  Put console in binary mode  *//*  Returns 0 if ok, -1 if not  */conbin(esc) char esc; {    if (!isatty(0)) return(0);		/* only for real ttys */    if (cgmf == 0) congm();		/* Get modes if necessary. */    escchr = esc;			/* Make this available to other fns */    ckxech = 1;				/* Program can echo characters */#ifndef UXIII    ccraw.sg_flags |= (RAW|TANDEM);   	/* Set rawmode, XON/XOFF */    ccraw.sg_flags &= ~(ECHO|CRMOD);  	/* Set char wakeup, no echo */    return(stty(0,&ccraw));#else    ccraw.c_lflag &= ~(ISIG|ICANON|ECHO);    ccraw.c_iflag |= (BRKINT|IGNPAR);    ccraw.c_iflag &= ~(IGNBRK|INLCR|IGNCR|ICRNL|IUCLC|IXON|IXANY|IXOFF			|INPCK|ISTRIP);    ccraw.c_oflag &= ~OPOST;/*** Kermit used to put the console in 8-bit raw mode, but some users have *** pointed out that this should not be done, since some sites actually *** use terminals with parity settings on their Unix systems, and if we *** override the current settings and stop doing parity, then their terminals *** will display blotches for characters whose parity is wrong.  Therefore, *** the following two lines are commented out (Larry Afrin, Clemson U): *** ***   ccraw.c_cflag &= ~(PARENB|CSIZE); ***   ccraw.c_cflag |= (CS8|CREAD); *** *** Sys III/V sites that have trouble with this can restore these lines. ***/    ccraw.c_cc[4] = 1;    ccraw.c_cc[5] = 1;    return(ioctl(0,TCSETAW,&ccraw) );  	/* set new modes . */#endif}/*  C O N R E S  --  Restore the console terminal  */conres() {    if (cgmf == 0) return(0);		/* Don't do anything if modes */    if (!isatty(0)) return(0);		/* only for real ttys */#ifndef UXIII				/* except for sIII, */    sleep(1);				/*  not known! */#endif					/*   (sIII does wait in ioctls) */    ckxech = 0;				/* System should echo chars */#ifndef UXIII    return(stty(0,&ccold));		/* Restore controlling tty */#else    return(ioctl(0,TCSETAW,&ccold));#endif}/*  C O N O C  --  Output a character to the console terminal  */conoc(c) char c; {    write(1,&c,1);}/*  C O N X O  --  Write x characters to the console terminal  */conxo(x,s) char *s; int x; {    write(1,s,x);}/*  C O N O L  --  Write a line to the console terminal  */conol(s) char *s; {    int len;    len = strlen(s);    write(1,s,len);}/*  C O N O L A  --  Write an array of lines to the console terminal */conola(s) char *s[]; {    int i;    for (i=0 ; *s[i] ; i++) conol(s[i]);}/*  C O N O L L  --  Output a string followed by CRLF  */conoll(s) char *s; {    conol(s);    write(1,"\r\n",2);}/*  C O N C H K  --  Return how many characters available at console  */conchk() {    int x; long n;#ifdef PROVX1     x = ioctl(0, TIOCQCNT, &ttbuf);    n = ttbuf.sg_ispeed & 0377;    return((x < 0) ? 0 : n);#else#ifdef V7    lseek(kmem[CON], (long) qaddr[CON], 0);    x = read(kmem[CON], &n, sizeof(int));    return((x == sizeof(int))? n: 0);#else#ifdef UXIII    if (conesc) {			/* Escape typed */	conesc = 0;	signal(SIGQUIT,esctrp);		/* Restore escape */	return(1);    }    return(0);#else#ifdef C70    if (conesc) {			/* Escape typed */	conesc = 0;	signal(SIGQUIT,esctrp);		/* Restore escape */	return(1);    }    return(0);#else#ifdef FIONREAD    x = ioctl(0, FIONREAD, &n);		/* BSD and maybe some others */    return((x < 0) ? 0 : n);#else    return(0);				/* Others can't do. */#endif#endif#endif#endif#endif}/*  C O N I N C  --  Get a character from the console  */coninc(timo) int timo; {    int n = 0; char ch;    if (timo <= 0 ) {			/* untimed */	n = read(0, &ch, 1);		/* Read a character. */	ch &= 0377;	if (n > 0) return(ch); 		/* Return the char if read */	else #ifdef UXIII	    if (n < 0 && errno == EINTR) /* if read was interrupted by QUIT */		return(escchr);		 /* user entered escape character */	    else		    /* couldnt be ^c, sigint never returns */#endif		return(-1);  		/* Return the char, or -1. */	}    signal(SIGALRM,timerh);		/* Timed read, so set up timer */    alarm(timo);    if (setjmp(sjbuf)) n = -2;    else {	n = read(0, &ch, 1);	ch &= 0377;    }    alarm(0);				/* Stop timing, we got our character */    signal(SIGALRM,SIG_DFL);    if (n > 0) return(ch);      else#ifdef UXIII        if (n == -1 && errno == EINTR)  /* If read interrupted by QUIT, */	    return(escchr);		/* user entered escape character, */        else		    		/* can't be ^c, sigint never returns */#endif	return(-1);}

⌨️ 快捷键说明

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