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

📄 upap.c

📁 自己精简过的PPPD代码。在嵌入中应用可以更好的发挥。比原先的小了很多
💻 C
📖 第 1 页 / 共 2 页
字号:
    len -= UPAP_HEADERLEN;    /*     * Action depends on code.     */    switch (code) {    case UPAP_AUTHREQ:	upap_rauthreq(u, inp, id, len);	break;    case UPAP_AUTHACK:	upap_rauthack(u, inp, id, len);	break;    case UPAP_AUTHNAK:	upap_rauthnak(u, inp, id, len);	break;    default:				/* XXX Need code reject */	break;    }}/* * upap_rauth - Receive Authenticate. */static voidupap_rauthreq(u, inp, id, len)    upap_state *u;    u_char *inp;    int id;    int len;{    u_char ruserlen, rpasswdlen;    char *ruser, *rpasswd;    char rhostname[256];    int retcode;    char *msg;    int msglen;    if (u->us_serverstate < UPAPSS_LISTEN)	return;    /*     * If we receive a duplicate authenticate-request, we are     * supposed to return the same status as for the first request.     */    if (u->us_serverstate == UPAPSS_OPEN) {	upap_sresp(u, UPAP_AUTHACK, id, "", 0);	/* return auth-ack */	return;    }    if (u->us_serverstate == UPAPSS_BADAUTH) {	upap_sresp(u, UPAP_AUTHNAK, id, "", 0);	/* return auth-nak */	return;    }    /*     * Parse user/passwd.     */    if (len < 1) {	UPAPDEBUG(("pap_rauth: rcvd short packet."));	return;    }    GETCHAR(ruserlen, inp);    len -= sizeof (u_char) + ruserlen + sizeof (u_char);    if (len < 0) {	UPAPDEBUG(("pap_rauth: rcvd short packet."));	return;    }    ruser = (char *) inp;    INCPTR(ruserlen, inp);    GETCHAR(rpasswdlen, inp);    if (len < rpasswdlen) {	UPAPDEBUG(("pap_rauth: rcvd short packet."));	return;    }    rpasswd = (char *) inp;    /*     * Check the username and password given.     */    /*/retcode = check_passwd(u->us_unit, ruser, ruserlen, rpasswd,			   rpasswdlen, &msg);*/    BZERO(rpasswd, rpasswdlen);    /*     * Check remote number authorization.  A plugin may have filled in     * the remote number or added an allowed number, and rather than     * return an authenticate failure, is leaving it for us to verify.     */    if (retcode == UPAP_AUTHACK) {	if (!auth_number()) {	    /* We do not want to leak info about the pap result. */	    retcode = UPAP_AUTHNAK; /* XXX exit value will be "wrong" */	    warn("calling number %q is not authorized", remote_number);	}    }    msglen = strlen(msg);    if (msglen > 255)	msglen = 255;    upap_sresp(u, retcode, id, msg, msglen);    /* Null terminate and clean remote name. */    slprintf(rhostname, sizeof(rhostname), "%.*v", ruserlen, ruser);    if (retcode == UPAP_AUTHACK) {	u->us_serverstate = UPAPSS_OPEN;	notice("PAP peer authentication succeeded for %q", rhostname);	auth_peer_success(u->us_unit, PPP_PAP, 0, ruser, ruserlen);    } else {	u->us_serverstate = UPAPSS_BADAUTH;	warn("PAP peer authentication failed for %q", rhostname);	auth_peer_fail(u->us_unit, PPP_PAP);    }    if (u->us_reqtimeout > 0)	UNTIMEOUT(upap_reqtimeout, u);}/* * upap_rauthack - Receive Authenticate-Ack. */static voidupap_rauthack(u, inp, id, len)    upap_state *u;    u_char *inp;    int id;    int len;{    u_char msglen;    char *msg;    if (u->us_clientstate != UPAPCS_AUTHREQ) /* XXX */	return;    /*     * Parse message.     */    if (len < 1) {	UPAPDEBUG(("pap_rauthack: ignoring missing msg-length."));    } else {	GETCHAR(msglen, inp);	if (msglen > 0) {	    len -= sizeof (u_char);	    if (len < msglen) {		UPAPDEBUG(("pap_rauthack: rcvd short packet."));		return;	    }	    msg = (char *) inp;	    PRINTMSG(msg, msglen);	}    }    u->us_clientstate = UPAPCS_OPEN;    auth_withpeer_success(u->us_unit, PPP_PAP, 0);}/* * upap_rauthnak - Receive Authenticate-Nak. */static voidupap_rauthnak(u, inp, id, len)    upap_state *u;    u_char *inp;    int id;    int len;{    u_char msglen;    char *msg;    if (u->us_clientstate != UPAPCS_AUTHREQ) /* XXX */	return;    /*     * Parse message.     */    if (len < 1) {	UPAPDEBUG(("pap_rauthnak: ignoring missing msg-length."));    } else {	GETCHAR(msglen, inp);	if (msglen > 0) {	    len -= sizeof (u_char);	    if (len < msglen) {		UPAPDEBUG(("pap_rauthnak: rcvd short packet."));		return;	    }	    msg = (char *) inp;	    PRINTMSG(msg, msglen);	}    }    u->us_clientstate = UPAPCS_BADAUTH;    error("PAP authentication failed");    auth_withpeer_fail(u->us_unit, PPP_PAP);}/* * upap_sauthreq - Send an Authenticate-Request. */static voidupap_sauthreq(u)    upap_state *u;{    u_char *outp;    int outlen;    outlen = UPAP_HEADERLEN + 2 * sizeof (u_char) +	u->us_userlen + u->us_passwdlen;    outp = outpacket_buf;        MAKEHEADER(outp, PPP_PAP);    PUTCHAR(UPAP_AUTHREQ, outp);    PUTCHAR(++u->us_id, outp);    PUTSHORT(outlen, outp);    PUTCHAR(u->us_userlen, outp);    BCOPY(u->us_user, outp, u->us_userlen);    INCPTR(u->us_userlen, outp);    PUTCHAR(u->us_passwdlen, outp);    BCOPY(u->us_passwd, outp, u->us_passwdlen);    output(u->us_unit, outpacket_buf, outlen + PPP_HDRLEN);    TIMEOUT(upap_timeout, u, u->us_timeouttime);    ++u->us_transmits;    u->us_clientstate = UPAPCS_AUTHREQ;}/* * upap_sresp - Send a response (ack or nak). */static voidupap_sresp(u, code, id, msg, msglen)    upap_state *u;    u_char code, id;    char *msg;    int msglen;{    u_char *outp;    int outlen;    outlen = UPAP_HEADERLEN + sizeof (u_char) + msglen;    outp = outpacket_buf;    MAKEHEADER(outp, PPP_PAP);    PUTCHAR(code, outp);    PUTCHAR(id, outp);    PUTSHORT(outlen, outp);    PUTCHAR(msglen, outp);    BCOPY(msg, outp, msglen);    output(u->us_unit, outpacket_buf, outlen + PPP_HDRLEN);}/* * upap_printpkt - print the contents of a PAP packet. */static char *upap_codenames[] = {    "AuthReq", "AuthAck", "AuthNak"};static intupap_printpkt(p, plen, printer, arg)    u_char *p;    int plen;    void (*printer) __P((void *, char *, ...));    void *arg;{    int code, id, len;    int mlen, ulen, wlen;    char *user, *pwd, *msg;    u_char *pstart;    if (plen < UPAP_HEADERLEN)	return 0;    pstart = p;    GETCHAR(code, p);    GETCHAR(id, p);    GETSHORT(len, p);    if (len < UPAP_HEADERLEN || len > plen)	return 0;    if (code >= 1 && code <= sizeof(upap_codenames) / sizeof(char *))	printer(arg, " %s", upap_codenames[code-1]);    else	printer(arg, " code=0x%x", code);    printer(arg, " id=0x%x", id);    len -= UPAP_HEADERLEN;    switch (code) {    case UPAP_AUTHREQ:	if (len < 1)	    break;	ulen = p[0];	if (len < ulen + 2)	    break;	wlen = p[ulen + 1];	if (len < ulen + wlen + 2)	    break;	user = (char *) (p + 1);	pwd = (char *) (p + ulen + 2);	p += ulen + wlen + 2;	len -= ulen + wlen + 2;	printer(arg, " user=");	print_string(user, ulen, printer, arg);	printer(arg, " password=");	if (!hide_password)	    print_string(pwd, wlen, printer, arg);	else	    printer(arg, "<hidden>");	break;    case UPAP_AUTHACK:    case UPAP_AUTHNAK:	if (len < 1)	    break;	mlen = p[0];	if (len < mlen + 1)	    break;	msg = (char *) (p + 1);	p += mlen + 1;	len -= mlen + 1;	printer(arg, " ");	print_string(msg, mlen, printer, arg);	break;    }    /* print the rest of the bytes in the packet */    for (; len > 0; --len) {	GETCHAR(code, p);	printer(arg, " %.2x", code);    }    return p - pstart;}

⌨️ 快捷键说明

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