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);
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to