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

📄 pppd.c

📁 eCos操作系统源码
💻 C
📖 第 1 页 / 共 2 页
字号:
    if (modem) {	setdtr(ttyfd, FALSE);	/*	 * This sleep is in case the serial port has CLOCAL set by default,	 * and consequently will reassert DTR when we close the device.	 */	sleep(1);    }#endif        db_printf("%s called\n", __PRETTY_FUNCTION__);        restore_tty(tty_handle);    if( ppp_tty.t_handle != 0 )    {        cyg_ppp_pppclose( &ppp_tty, 0 );        ppp_tty.t_handle = 0;    }    tty_handle = 0;}struct	callout {    struct timeval	c_time;		/* time at which to call routine */    void		*c_arg;		/* argument to routine */    void		(*c_func) __P((void *)); /* routine */    struct		callout *c_next;};static struct callout *callout = NULL;	/* Callout list */static struct timeval timenow;		/* Current time *//* * timeout - Schedule a timeout. * * Note that this timeout takes the number of seconds, NOT hz (as in * the kernel). */voidcyg_ppp_timeout(void (*func) __P((void *)),                void *arg,                int time){    struct callout *newp, *p, **pp;      MAINDEBUG((LOG_DEBUG, "Timeout %lx:%lx in %d seconds.",	       (long) func, (long) arg, time));        /*     * Allocate timeout.     */    if ((newp = (struct callout *) malloc(sizeof(struct callout))) == NULL) {	syslog(LOG_ERR, "Out of memory in timeout()!");	die(1);    }    newp->c_arg = arg;    newp->c_func = func;    gettimeofday(&timenow, NULL);    newp->c_time.tv_sec = timenow.tv_sec + time;    newp->c_time.tv_usec = timenow.tv_usec;      /*     * Find correct place and link it in.     */    for (pp = &callout; (p = *pp); pp = &p->c_next)	if (newp->c_time.tv_sec < p->c_time.tv_sec	    || (newp->c_time.tv_sec == p->c_time.tv_sec		&& newp->c_time.tv_usec < p->c_time.tv_sec))	    break;    newp->c_next = p;    *pp = newp;}/* * untimeout - Unschedule a timeout. */voidcyg_ppp_untimeout(void (*func) __P((void *)),                  void *arg){    struct callout **copp, *freep;      MAINDEBUG((LOG_DEBUG, "Untimeout %lx:%lx.", (long) func, (long) arg));      /*     * Find first matching timeout and remove it from the list.     */    for (copp = &callout; (freep = *copp); copp = &freep->c_next)	if (freep->c_func == func && freep->c_arg == arg) {	    *copp = freep->c_next;	    (void) free((char *) freep);	    break;	}}/* * calltimeout - Call any timeout routines which are now due. */static voidcalltimeout(){    struct callout *p;    while (callout != NULL) {	p = callout;	if (gettimeofday(&timenow, NULL) < 0) {	    syslog(LOG_ERR, "Failed to get time of day: %m");	    die(1);	}	if (!(p->c_time.tv_sec < timenow.tv_sec	      || (p->c_time.tv_sec == timenow.tv_sec		  && p->c_time.tv_usec <= timenow.tv_usec)))	    break;		/* no, it's not time yet */	callout = p->c_next;	(*p->c_func)(p->c_arg);	free((char *) p);    }}/* * timeleft - return the length of time until the next timeout is due. */static struct timeval *timeleft(tvp)    struct timeval *tvp;{    if (callout == NULL)	return NULL;    gettimeofday(&timenow, NULL);    tvp->tv_sec = callout->c_time.tv_sec - timenow.tv_sec;    tvp->tv_usec = callout->c_time.tv_usec - timenow.tv_usec;    if (tvp->tv_usec < 0) {	tvp->tv_usec += 1000000;	tvp->tv_sec -= 1;    }    if (tvp->tv_sec < 0)	tvp->tv_sec = tvp->tv_usec = 0;    return tvp;}/* * log_packet - format a packet and log it. */char line[256];			/* line to be logged accumulated here */char *linep;voidlog_packet(p, len, prefix, level)    u_char *p;    int len;    char *prefix;    int level;{    strcpy(line, prefix);    linep = line + strlen(line);    format_packet(p, len, pr_log, NULL);    if (linep != line)	syslog(level, "%s", line);}/* * format_packet - make a readable representation of a packet, * calling `printer(arg, format, ...)' to output it. */voidformat_packet(p, len, printer, arg)    u_char *p;    int len;    void (*printer) __P((void *, char *, ...));    void *arg;{    int i, n;    u_short proto;    u_char x;    struct protent *protp;    if (len >= PPP_HDRLEN && p[0] == PPP_ALLSTATIONS && p[1] == PPP_UI) {	p += 2;	GETSHORT(proto, p);	len -= PPP_HDRLEN;	for (i = 0; (protp = protocols[i]) != NULL; ++i)	    if (proto == protp->protocol)		break;	if (protp != NULL) {	    printer(arg, "[%s", protp->name);	    n = (*protp->printpkt)(p, len, printer, arg);	    printer(arg, "]");	    p += n;	    len -= n;	} else {	    printer(arg, "[proto=0x%x]", proto);	}    }    for (; len > 0; --len) {	GETCHAR(x, p);	printer(arg, " %.2x", x);    }}static voidpr_log __V((void *arg, char *fmt, ...)){    int n;    va_list pvar;    char buf[256];#if __STDC__    va_start(pvar, fmt);#else    void *arg;    char *fmt;    va_start(pvar);    arg = va_arg(pvar, void *);    fmt = va_arg(pvar, char *);#endif    n = vfmtmsg(buf, sizeof(buf), fmt, pvar);    va_end(pvar);    if (linep + n + 1 > line + sizeof(line)) {	syslog(LOG_DEBUG, "%s", line);	linep = line;    }    strcpy(linep, buf);    linep += n;}/* * print_string - print a readable representation of a string using * printer. */voidprint_string(p, len, printer, arg)    char *p;    int len;    void (*printer) __P((void *, char *, ...));    void *arg;{    int c;    printer(arg, "\"");    for (; len > 0; --len) {	c = *p++;	if (' ' <= c && c <= '~') {	    if (c == '\\' || c == '"')		printer(arg, "\\");	    printer(arg, "%c", c);	} else {	    switch (c) {	    case '\n':		printer(arg, "\\n");		break;	    case '\r':		printer(arg, "\\r");		break;	    case '\t':		printer(arg, "\\t");		break;	    default:		printer(arg, "\\%.3o", c);	    }	}    }    printer(arg, "\"");}/* * novm - log an error message saying we ran out of memory, and die. */voidnovm(msg)    char *msg;{    syslog(LOG_ERR, "Virtual memory exhausted allocating %s\n", msg);    die(1);}/* * fmtmsg - format a message into a buffer.  Like sprintf except we * also specify the length of the output buffer, and we handle * %r (recursive format), %m (error message) and %I (IP address) formats. * Doesn't do floating-point formats. * Returns the number of chars put into buf. */intfmtmsg __V((char *buf, int buflen, char *fmt, ...)){    va_list args;    int n;#if __STDC__    va_start(args, fmt);#else    char *buf;    int buflen;    char *fmt;    va_start(args);    buf = va_arg(args, char *);    buflen = va_arg(args, int);    fmt = va_arg(args, char *);#endif    n = vfmtmsg(buf, buflen, fmt, args);    va_end(args);    return n;}/* * vfmtmsg - like fmtmsg, takes a va_list instead of a list of args. */#define OUTCHAR(c)	(buflen > 0? (--buflen, *buf++ = (c)): 0)intvfmtmsg(buf, buflen, fmt, args)    char *buf;    int buflen;    char *fmt;    va_list args;{    int c, i, n;    int width, prec, fillch;    int base, len, neg, quoted;    unsigned long val = 0;    char *str, *f, *buf0;    unsigned char *p;    char num[32];    time_t t;    static char hexchars[] = "0123456789abcdef";    buf0 = buf;    --buflen;    while (buflen > 0) {	for (f = fmt; *f != '%' && *f != 0; ++f)	    ;	if (f > fmt) {	    len = f - fmt;	    if (len > buflen)		len = buflen;	    memcpy(buf, fmt, len);	    buf += len;	    buflen -= len;	    fmt = f;	}	if (*fmt == 0)	    break;	c = *++fmt;	width = prec = 0;	fillch = ' ';	if (c == '0') {	    fillch = '0';	    c = *++fmt;	}	if (c == '*') {	    width = va_arg(args, int);	    c = *++fmt;	} else {	    while (isdigit(c)) {		width = width * 10 + c - '0';		c = *++fmt;	    }	}	if (c == '.') {	    c = *++fmt;	    if (c == '*') {		prec = va_arg(args, int);		c = *++fmt;	    } else {		while (isdigit(c)) {		    prec = prec * 10 + c - '0';		    c = *++fmt;		}	    }	}	str = 0;	base = 0;	neg = 0;	++fmt;	switch (c) {	case 'd':	    i = va_arg(args, int);	    if (i < 0) {		neg = 1;		val = -i;	    } else		val = i;	    base = 10;	    break;	case 'o':	    val = va_arg(args, unsigned int);	    base = 8;	    break;	case 'x':	    val = va_arg(args, unsigned int);	    base = 16;	    break;	case 'p':	    val = (unsigned long) va_arg(args, void *);	    base = 16;	    neg = 2;	    break;	case 's':	    str = va_arg(args, char *);	    break;	case 'c':	    num[0] = va_arg(args, int);	    num[1] = 0;	    str = num;	    break;	case 'm':	    str = strerror(errno);	    break;	case 'I':	    str = ip_ntoa(va_arg(args, u_int32_t));	    break;	case 'r':	    f = va_arg(args, char *);//#ifndef __powerpc__//	    n = vfmtmsg(buf, buflen + 1, f, va_arg(args, va_list));//#else	    /* On the powerpc, a va_list is an array of 1 structure */	    n = vfmtmsg(buf, buflen + 1, f, va_arg(args, void *));//#endif	    buf += n;	    buflen -= n;	    continue;	case 't':	    time(&t);	    str = ctime(&t);	    str += 4;		/* chop off the day name */	    str[15] = 0;	/* chop off year and newline */	    break;	case 'v':		/* "visible" string */	case 'q':		/* quoted string */	    quoted = c == 'q';	    p = va_arg(args, unsigned char *);	    if (fillch == '0' && prec > 0) {		n = prec;	    } else {		n = strlen((char *)p);		if (prec > 0 && prec < n)		    n = prec;	    }	    while (n > 0 && buflen > 0) {		c = *p++;		--n;		if (!quoted && c >= 0x80) {		    OUTCHAR('M');		    OUTCHAR('-');		    c -= 0x80;		}		if (quoted && (c == '"' || c == '\\'))		    OUTCHAR('\\');		if (c < 0x20 || (0x7f <= c && c < 0xa0)) {		    if (quoted) {			OUTCHAR('\\');			switch (c) {			case '\t':	OUTCHAR('t');	break;			case '\n':	OUTCHAR('n');	break;			case '\b':	OUTCHAR('b');	break;			case '\f':	OUTCHAR('f');	break;			default:			    OUTCHAR('x');			    OUTCHAR(hexchars[c >> 4]);			    OUTCHAR(hexchars[c & 0xf]);			}		    } else {			if (c == '\t')			    OUTCHAR(c);			else {			    OUTCHAR('^');			    OUTCHAR(c ^ 0x40);			}		    }		} else		    OUTCHAR(c);	    }	    continue;	default:	    *buf++ = '%';	    if (c != '%')		--fmt;		/* so %z outputs %z etc. */	    --buflen;	    continue;	}	if (base != 0) {	    str = num + sizeof(num);	    *--str = 0;	    while (str > num + neg) {		*--str = hexchars[val % base];		val = val / base;		if (--prec <= 0 && val == 0)		    break;	    }	    switch (neg) {	    case 1:		*--str = '-';		break;	    case 2:		*--str = 'x';		*--str = '0';		break;	    }	    len = num + sizeof(num) - 1 - str;	} else {	    len = strlen(str);	    if (prec > 0 && len > prec)		len = prec;	}	if (width > 0) {	    if (width > buflen)		width = buflen;	    if ((n = width - len) > 0) {		buflen -= n;		for (; n > 0; --n)		    *buf++ = fillch;	    }	}	if (len > buflen)	    len = buflen;	memcpy(buf, str, len);	buf += len;	buflen -= len;    }    *buf = 0;    return buf - buf0;}

⌨️ 快捷键说明

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