diff options
Diffstat (limited to 'serverboot/gets.c')
-rw-r--r-- | serverboot/gets.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/serverboot/gets.c b/serverboot/gets.c new file mode 100644 index 00000000..61d14460 --- /dev/null +++ b/serverboot/gets.c @@ -0,0 +1,90 @@ +/* + * Mach Operating System + * Copyright (c) 1993-1989 Carnegie Mellon University. + * Copyright (c) 1994 The University of Utah and + * the Computer Systems Laboratory (CSL). + * All rights reserved. + * + * Permission to use, copy, modify and distribute this software and its + * documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON, THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF + * THIS SOFTWARE IN ITS "AS IS" CONDITION, AND DISCLAIM ANY LIABILITY + * OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF + * THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie Mellon + * the rights to redistribute these changes. + */ + +#include <mach.h> +#include <device/device.h> +#include <varargs.h> + +extern mach_port_t __libmach_console_port; + +safe_gets(str, maxlen) + char *str; + int maxlen; +{ + register char *lp; + register int c; + + char inbuf[IO_INBAND_MAX]; + mach_msg_type_number_t count; + register char *ip; + char *strmax = str + maxlen - 1; /* allow space for trailing 0 */ + + lp = str; + for (;;) { + count = IO_INBAND_MAX; + (void) device_read_inband(__libmach_console_port, + (dev_mode_t)0, (recnum_t)0, + sizeof(inbuf), inbuf, &count); + for (ip = inbuf; ip < &inbuf[count]; ip++) { + c = *ip; + switch (c) { + case '\n': + case '\r': + printf("\n"); + *lp++ = 0; + return; + + case '\b': + case '#': + case '\177': + if (lp > str) { + printf("\b \b"); + lp--; + } + continue; + case '@': + case 'u'&037: + lp = str; + printf("\n\r"); + continue; + default: + if (c >= ' ' && c < '\177') { + if (lp < strmax) { + *lp++ = c; + printf("%c", c); + } + else { + printf("%c", '\007'); /* beep */ + } + } + } + } + } +} + |