void kernel_main() { clear_screen(); fout("SN4 v0.0.1 keyboard testing build 003\n"); echo("Hello, fak u with <3 from deusa!"); fout("lel"); unsigned char kbch = get_kbch(); echoch(kbch); reboot(); }
/*------------------------------------------------------------------------ * ttyInter_in -- handle one arriving char (interrupts disabled) *------------------------------------------------------------------------ */ void ttyInter_in ( struct ttycblk *typtr, /* ptr to ttytab entry */ struct uart_csreg *uptr /* address of UART's CSRs */ ) { char ch; /* next char from device */ int32 avail; /* chars available in buffer */ ch = uptr->buffer; /* extract char. from device */ /* Compute chars available */ avail = semcount(typtr->tyisem); if (avail < 0) { /* one or more processes waiting*/ avail = 0; } /* Handle raw mode */ if (typtr->tyimode == TY_IMRAW) { if (avail >= TY_IBUFLEN) { /* no space => ignore input */ return; } /* Place char in buffer with no editing */ *typtr->tyitail++ = ch; /* Wrap buffer pointer */ if (typtr->tyitail >= &typtr->tyibuff[TY_IBUFLEN]) { typtr->tyitail = typtr->tyibuff; } /* Signal input semaphore and return */ signal(typtr->tyisem); return; } /* Handle cooked and cbreak modes (common part) */ if ( (ch == TY_RETURN) && typtr->tyicrlf ) { ch = TY_NEWLINE; } /* If flow control is in effect, handle ^S and ^Q */ if (typtr->tyoflow) { if (ch == typtr->tyostart) { /* ^Q starts output */ typtr->tyoheld = FALSE; ttyKickOut(typtr, uptr); return; } else if (ch == typtr->tyostop) { /* ^S stops output */ typtr->tyoheld = TRUE; return; } } typtr->tyoheld = FALSE; /* Any other char starts output */ if (typtr->tyimode == TY_IMCBREAK) { /* Just cbreak mode */ /* If input buffer is full, send bell to user */ if (avail >= TY_IBUFLEN) { eputc(typtr->tyifullc, typtr, uptr); } else { /* Input buffer has space for this char */ *typtr->tyitail++ = ch; /* Wrap around buffer */ if (typtr->tyitail>=&typtr->tyibuff[TY_IBUFLEN]) { typtr->tyitail = typtr->tyibuff; } if (typtr->tyiecho) { /* are we echoing chars?*/ echoch(ch, typtr, uptr); } } return; } else { /* Just cooked mode (see common code above) */ /* Line kill character arrives - kill entire line */ if (ch == typtr->tyikillc && typtr->tyikill) { typtr->tyitail -= typtr->tyicursor; if (typtr->tyitail < typtr->tyibuff) { typtr->tyihead += TY_IBUFLEN; } typtr->tyicursor = 0; eputc(TY_RETURN, typtr, uptr); eputc(TY_NEWLINE, typtr, uptr); return; } /* Erase (backspace) character */ if ( (ch == typtr->tyierasec) && typtr->tyierase) { if (typtr->tyicursor > 0) { typtr->tyicursor--; erase1(typtr, uptr); } return; } /* End of line */ if ( (ch == TY_NEWLINE) || (ch == TY_RETURN) ) { if (typtr->tyiecho) { echoch(ch, typtr, uptr); } *typtr->tyitail++ = ch; if (typtr->tyitail>=&typtr->tyibuff[TY_IBUFLEN]) { typtr->tyitail = typtr->tyibuff; } /* Make entire line (plus \n or \r) available */ signaln(typtr->tyisem, typtr->tyicursor + 1); typtr->tyicursor = 0; /* Reset for next line */ return; } /* Character to be placed in buffer - send bell if */ /* buffer has overflowed */ avail = semcount(typtr->tyisem); if (avail < 0) { avail = 0; } if ((avail + typtr->tyicursor) >= TY_IBUFLEN-1) { eputc(typtr->tyifullc, typtr, uptr); return; } /* EOF character: recognize at beginning of line, but */ /* print and ignore otherwise. */ if (ch == typtr->tyeofch && typtr->tyeof) { if (typtr->tyiecho) { echoch(ch, typtr, uptr); } if (typtr->tyicursor != 0) { return; } *typtr->tyitail++ = ch; signal(typtr->tyisem); return; } /* Echo the character */ if (typtr->tyiecho) { echoch(ch, typtr, uptr); } /* Insert character in the input buffer */ typtr->tyicursor++; *typtr->tyitail++ = ch; /* Wrap around if needed */ if (typtr->tyitail >= &typtr->tyibuff[TY_IBUFLEN]) { typtr->tyitail = typtr->tyibuff; } return; } }
/*------------------------------------------------------------------------ * x_snmp - SNMP shell that does MIB object name completion *------------------------------------------------------------------------ */ int x_snmp(int stdin, int stdout, int stderr, int nargs, char *args[]) { int ch; char snmpservstr[BUFSIZE]; struct tty *ttyp; int ct, i, mode; IPaddr destmach; if (nargs != 2) { snusage(stdout); return OK; } args++; nargs--; sninit(); if ((destmach = name2ip(*args)) == (IPaddr)SYSERR) { fprintf(stdout,"snmp: couldn't resolve name %s\n", *args); return OK; } ip2dot(snmpservstr, destmach); sprintf(snmpservstr + strlen(snmpservstr), ":%d", SNMPPORT); ttyp = &ttytab[stdin]; ct = 0; mode = M_CHARIN; next_completion = num_completions = 0; control(stdin, TTC_MODER); /* put stdin into raw mode */ write(stdout, PROMPT, strlen(PROMPT)); /* print the prompt */ while (TRUE) { if ((ch = getc(stdin)) == EOF) { write(stdout, EXITSTR, strlen(EXITSTR)); putc(stdout, '\n'); control(stdin, TTC_MODEC); return OK; } if (ch == SYSERR) { return SYSERR; } if (ch == COMPLETE) { if (mode == M_CHARIN) { mode = M_COMPL; /* find beginning of word */ for (i=ct-1; i >= 0 && buf[i] != ' '; i--) /* empty */; s2clen = ct - ++i; strncpy(str2compl, buf + i, s2clen); find_completions(); } if (num_completions == 0) { putc(stdout, BELL); mode = M_CHARIN; } else print_completion(&ct, stdout); continue; } if (ch == KILLWORD && mode == M_COMPL) { /* kill word in compl. mode goes back to original string to complete. */ eraseword(&ct, stdout); strncpy(buf + ct, str2compl, s2clen); write(stdout, buf + ct, s2clen); ct += s2clen; mode = M_CHARIN; next_completion = num_completions = 0; continue; } if (mode == M_COMPL) { /* && ch != KILLWORD */ mode = M_CHARIN; str2compl[(s2clen = 0)] = '\0'; num_completions = next_completion = 0; } if (ch == KILLWORD) { /* && mode != M_COMPL */ eraseword(&ct, stdout); continue; } if ((ch == ttyp->tty_tchars.tc_kill)) { eraseall(ct, stdout); ct = 0; continue; } if ((ch == ttyp->tty_tchars.tc_erase)) { if (ct > 0) erase1(--ct, stdout); continue; } if ((ch == '\r') || (ch == '\n')) { echoch(ch, stdout); buf[ct] = '\0'; if (strequ(buf, EXITSTR)) { control(stdin, TTC_MODEC); return OK; } sendquery(stdout, snmpservstr); for (i = 0; i < BUFSIZE; i++) buf[i] = '\0'; write(stdout, PROMPT, strlen(PROMPT)); ct = 0; continue; } /* all non-special characters */ if (ct == BUFSIZE - 1) putc(stdout, BELL); else { echoch(ch, stdout); buf[ct++] = ch; } } return OK; }