/* * $Source$ * $Author$ * $Locker$ * $Header$ * * (c) Copyright 1988 by the Massachusetts Institute of Technology. * For copying and distribution information, please see the file * . */ #ifndef lint static char *rcsid_display_c = "$Header$"; #endif lint #include #include #include #include #include "userreg.h" #define DESC_WIDTH 18 #define HEADER "*** Project Athena User Registration ***" #ifdef ibm032 #define HELP " Press backspace to delete a character. Press Ctrl-C to start over." #else #ifdef vax #define HELP " Press the key marked _cury, queryw -> _curx - 1); wclrtoeol (queryw); wrefresh (queryw); } } break; case '\003': /* Ctrl-C */ if (getuid() != 0) { clear(); /* Exit if not root. */ restore_display(); exit(0); } else restart(); break; default: if (c >= ' ') { /* Ignore all other control chars */ buf[i++] = c; if (echop) { waddch (queryw, c); wrefresh (queryw); } } break; } if (valuep && i >= maxsize) { wprintw (displayw, "You are not allowed to type more than %d characters for this answer.\n", maxsize); wrefresh (displayw); goto retry; } } if (i == 0) { if (emptyok && valuep && (askyn("Do you really want this field left blank (y/n)? ") == NO)) goto retry; if (!emptyok) { wprintw(displayw, "You must enter something here.\n"); wrefresh(displayw); goto retry; } } /* Input is complete so disable interval timer. */ it.it_interval.tv_sec = 0; it.it_interval.tv_usec = 0; it.it_value.tv_sec = 0; it.it_value.tv_usec = 0; setitimer (ITIMER_REAL, &it, (struct itimerval *) 0); buf[i] = '\0'; /* Put a null on the end */ werase (queryw); /* Clean up the query window */ wrefresh (queryw); return; /* And get out of here. */ } int askyn(prompt) char *prompt; { int ypos, xpos; int answer; struct itimerval it; char c; start: werase (queryw); mvwaddstr (queryw, 0, 0, prompt); wrefresh (queryw); xpos = queryw->_curx; ypos = queryw->_cury; answer = 2; /* No answer. */ /* Reset interval timer for y/n question. */ it.it_interval.tv_sec = 0; it.it_interval.tv_usec = 0; it.it_value.tv_sec = YN_TIMEOUT; it.it_value.tv_usec = 0; setitimer (ITIMER_REAL, &it, (struct itimerval *) 0); while ((c = getchar ()) != '\r') { /* Wait for CR. */ switch (c) { case 'n': /* No. */ case 'N': wmove(queryw, ypos, xpos); wclrtoeol(queryw); waddstr(queryw, "no"); wrefresh(queryw); answer = NO; continue; case 'y': /* Yes. */ case 'Y': wmove(queryw, ypos, xpos); wclrtoeol(queryw); waddstr(queryw, "yes"); wrefresh(queryw); answer = YES; continue; case '\177': /* Delete */ case '\010': /* Backspace */ case '\025': /* Ctl-U */ wmove(queryw, ypos, xpos); wclrtoeol(queryw); wrefresh(queryw); answer = 2; /* No answer. */ break; case EOF: /* We're in raw mode, so EOF means disaster */ exit(1); break; case '\003': /* Ctrl-C */ /* if (getuid() != 0) */ { clear(); /* Exit if not root. */ restore_display(); exit(0); } break; default: /* Ignore everything else. */ break; } } if (answer == 2) /* No answer. */ { display_text_line(0); display_text_line("Please answer y or n."); goto start; } return(answer); } /* Display_text_line puts up a line of text in the display window */ /* Special case: if line is 0, clear the display area */ display_text_line (line) char *line; { if (line) { waddstr (displayw, line); waddch (displayw, '\n'); wrefresh (displayw); } else { werase (displayw); } wrefresh (displayw); } /* Display_text displays a canned message from a file */ display_text (filename) char *filename; { FILE * fp; char buf[100]; werase (displayw); if ((fp = fopen (filename, "r")) == NULL) { wprintw (displayw, "Can't open file %s for reading.\n", filename); return; } while (fgets (buf, 100, fp)) { /* get rid of the newline */ buf[strlen (buf) - 1] = 0; display_text_line (buf); } fclose (fp); } /* Clear_display wipes the display and turns off curses */ restore_display() { clear(); refresh(); noraw(); echo(); endwin(); } timer_on() { struct itimerval it; it.it_interval.tv_sec = 0; it.it_interval.tv_usec = 0; it.it_value.tv_sec = TIMER_TIMEOUT; it.it_value.tv_usec = 0; setitimer (ITIMER_REAL, &it, (struct itimerval *) 0); } timer_off() { struct itimerval it; it.it_interval.tv_sec = 0; it.it_interval.tv_usec = 0; it.it_value.tv_sec = 0; it.it_value.tv_usec = 0; setitimer (ITIMER_REAL, &it, (struct itimerval *) 0); } wfeep() { char buf = '\007'; write(1, &buf, 1); }