u_int sleep(u_int i) { register time_t t; /* loop for that number of seconds, polling BIOS, so that it may handle interrupts */ for (t = getsecs() + i; getsecs() < t; cnischar()); return 0; }
static int readline(char *buf, size_t n, int to) { #ifdef DEBUG extern int debug; #endif char *p = buf, ch; /* Only do timeout if greater than 0 */ if (to > 0) { u_long i = 0; time_t tt = getsecs() + to; #ifdef DEBUG if (debug > 2) printf ("readline: timeout(%d) at %u\n", to, tt); #endif /* check for timeout expiration less often (for some very constrained archs) */ while (!cnischar()) if (!(i++ % 1000) && (getsecs() >= tt)) break; if (!cnischar()) { strlcpy(buf, "boot", 5); putchar('\n'); return strlen(buf); } } else while (!cnischar()) ; /* User has typed something. Turn off timeouts. */ cmd.timeout = 0; while (1) { switch ((ch = getchar())) { case CTRL('u'): while (p > buf) { putchar('\177'); p--; } continue; case '\n': case '\r': p[1] = *p = '\0'; break; case '\b': case '\177': if (p > buf) { putchar('\177'); p--; } continue; default: if (p - buf < n-1) *p++ = ch; else { putchar('\007'); putchar('\177'); } continue; } break; } return p - buf; }