Date: Sat, 17 Dec 2011 15:16:54 +0000 (UTC) From: Andriy Gapon <avg@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r228633 - in head/sys: kern sys Message-ID: <201112171516.pBHFGsjW064564@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: avg Date: Sat Dec 17 15:16:54 2011 New Revision: 228633 URL: http://svn.freebsd.org/changeset/base/228633 Log: introduce cngets, a method for kernel to read a string from console This is intended as a replacement for libkern's gets and mostly borrows its implementation. It uses cngrab/cnungrab to delimit kernel's access to console input. Note: libkern's gets obviously doesn't share any bits of implementation iwth libc's gets. They also have different APIs and the former doesn't have the overflow problems of the latter. Inspired by: bde MFC after: 2 months Modified: head/sys/kern/kern_cons.c head/sys/sys/cons.h Modified: head/sys/kern/kern_cons.c ============================================================================== --- head/sys/kern/kern_cons.c Sat Dec 17 15:11:22 2011 (r228632) +++ head/sys/kern/kern_cons.c Sat Dec 17 15:16:54 2011 (r228633) @@ -408,6 +408,55 @@ cncheckc(void) } void +cngets(char *cp, size_t size, int visible) +{ + char *lp, *end; + int c; + + cngrab(); + + lp = cp; + end = cp + size - 1; + for (;;) { + c = cngetc() & 0177; + switch (c) { + case '\n': + case '\r': + cnputc(c); + *lp = '\0'; + cnungrab(); + return; + case '\b': + case '\177': + if (lp > cp) { + if (visible) { + cnputc(c); + cnputs(" \b"); + } + lp--; + } + continue; + case '\0': + continue; + default: + if (lp < end) { + switch (visible) { + case GETS_NOECHO: + break; + case GETS_ECHOPASS: + cnputc('*'); + break; + default: + cnputc(c); + break; + } + *lp++ = c; + } + } + } +} + +void cnputc(int c) { struct cn_device *cnd; Modified: head/sys/sys/cons.h ============================================================================== --- head/sys/sys/cons.h Sat Dec 17 15:11:22 2011 (r228632) +++ head/sys/sys/cons.h Sat Dec 17 15:16:54 2011 (r228633) @@ -121,6 +121,7 @@ void cngrab(void); void cnungrab(void); int cncheckc(void); int cngetc(void); +void cngets(char *, size_t, int); void cnputc(int); void cnputs(char *); int cnunavailable(void);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201112171516.pBHFGsjW064564>