/* * 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 #include #include 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 */ } } } } } }