- Move gets() function to libkern (I want to use it outside vfs_mount.c).
- Add buffer size limitations (overflow will not be possible anymore). - Add 'visible' option, which will allow for passphrase reading in the future. - Remove special treatment of '@' and '#', those two are only confusing. Discussed with: rwatson MFC after: 2 weeks
This commit is contained in:
parent
f01116dd05
commit
0609f60831
@ -1221,6 +1221,7 @@ libkern/bcd.c standard
|
||||
libkern/bsearch.c standard
|
||||
libkern/crc32.c standard
|
||||
libkern/fnmatch.c standard
|
||||
libkern/gets.c standard
|
||||
libkern/iconv.c optional libiconv
|
||||
libkern/iconv_converter_if.m optional libiconv
|
||||
libkern/iconv_xlat.c optional libiconv
|
||||
|
@ -39,9 +39,9 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/cons.h>
|
||||
#include <sys/jail.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/libkern.h>
|
||||
#include <sys/mac.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/mount.h>
|
||||
@ -73,7 +73,6 @@ __FBSDID("$FreeBSD$");
|
||||
#define ROOTNAME "root_device"
|
||||
#define VFS_MOUNTARG_SIZE_MAX (1024 * 64)
|
||||
|
||||
static void gets(char *cp);
|
||||
static int vfs_domount(struct thread *td, const char *fstype,
|
||||
char *fspath, int fsflags, void *fsdata);
|
||||
static int vfs_mount_alloc(struct vnode *dvp, struct vfsconf *vfsp,
|
||||
@ -1290,7 +1289,7 @@ vfs_mountroot_ask(void)
|
||||
printf(" ? List valid disk boot devices\n");
|
||||
printf(" <empty line> Abort manual input\n");
|
||||
printf("\nmountroot> ");
|
||||
gets(name);
|
||||
gets(name, sizeof(name), 1);
|
||||
if (name[0] == '\0')
|
||||
return (1);
|
||||
if (name[0] == '?') {
|
||||
@ -1303,47 +1302,6 @@ vfs_mountroot_ask(void)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Local helper function for vfs_mountroot_ask.
|
||||
*/
|
||||
static void
|
||||
gets(char *cp)
|
||||
{
|
||||
char *lp;
|
||||
int c;
|
||||
|
||||
lp = cp;
|
||||
for (;;) {
|
||||
printf("%c", c = cngetc() & 0177);
|
||||
switch (c) {
|
||||
case -1:
|
||||
case '\n':
|
||||
case '\r':
|
||||
*lp++ = '\0';
|
||||
return;
|
||||
case '\b':
|
||||
case '\177':
|
||||
if (lp > cp) {
|
||||
printf(" \b");
|
||||
lp--;
|
||||
}
|
||||
continue;
|
||||
case '#':
|
||||
lp--;
|
||||
if (lp < cp)
|
||||
lp = cp;
|
||||
continue;
|
||||
case '@':
|
||||
case 'u' & 037:
|
||||
lp = cp;
|
||||
printf("%c", '\n');
|
||||
continue;
|
||||
default:
|
||||
*lp++ = c;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* ---------------------------------------------------------------------
|
||||
* Functions for querying mount options/arguments from filesystems.
|
||||
|
67
sys/libkern/gets.c
Normal file
67
sys/libkern/gets.c
Normal file
@ -0,0 +1,67 @@
|
||||
/*-
|
||||
* Copyright (c) 1999 Michael Smith
|
||||
* Copyright (c) 2005 Pawel Jakub Dawidek <pjd@FreeBSD.org>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/cons.h>
|
||||
#include <sys/libkern.h>
|
||||
|
||||
void
|
||||
gets(char *cp, size_t size, int visible)
|
||||
{
|
||||
char *lp, *end;
|
||||
int c;
|
||||
|
||||
lp = cp;
|
||||
end = cp + size - 1;
|
||||
for (;;) {
|
||||
c = cngetc() & 0177;
|
||||
switch (c) {
|
||||
case -1:
|
||||
case '\n':
|
||||
case '\r':
|
||||
*lp = '\0';
|
||||
return;
|
||||
case '\b':
|
||||
case '\177':
|
||||
if (lp > cp) {
|
||||
if (visible)
|
||||
printf("%c \b", c);
|
||||
lp--;
|
||||
}
|
||||
continue;
|
||||
default:
|
||||
if (lp < end) {
|
||||
if (visible)
|
||||
printf("%c", c);
|
||||
*lp++ = c;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -83,6 +83,7 @@ int fls(int);
|
||||
int flsl(long);
|
||||
#endif
|
||||
int fnmatch(const char *, const char *, int);
|
||||
void gets(char *, size_t, int);
|
||||
int locc(int, char *, u_int);
|
||||
void qsort(void *base, size_t nmemb, size_t size,
|
||||
int (*compar)(const void *, const void *));
|
||||
|
Loading…
Reference in New Issue
Block a user