Use setjmp and alarm to break out of options handling

This commit is contained in:
Kevin Lange 2011-12-04 03:43:33 -06:00
parent f841e5fe16
commit f18f1e401a
1 changed files with 86 additions and 68 deletions

View File

@ -46,6 +46,7 @@
#include <unistd.h>
#include <signal.h>
#include <time.h>
#include <setjmp.h>
#include "telnet.h"
/* The animation frames are stored separately. */
@ -89,6 +90,18 @@ void SIGINT_handler(int sig){
exit(0);
}
jmp_buf environment;
/*
* Handle the alarm which breaks us off of options
* handling if we didn't receive a terminal
*/
void SIGALRM_handler(int sig) {
alarm(0);
longjmp(environment, 1);
/* Unreachable */
}
void newline(int n) {
int i = 0;
for (i = 0; i < n; ++i) {
@ -200,7 +213,10 @@ int main(int argc, char ** argv) {
}
}
signal(SIGALRM, SIGALRM_handler);
/* Negotiate options */
if (!setjmp(environment)) {
alarm(1);
while (!feof(stdin) && !done) {
unsigned char i = getchar();
unsigned char opt = 0;
@ -211,6 +227,7 @@ int main(int argc, char ** argv) {
/* End of extended option mode */
sb_mode = 0;
if (sb[0] == TTYPE) {
alarm(0);
strcpy(term, &sb[2]);
goto ready;
}
@ -274,6 +291,7 @@ int main(int argc, char ** argv) {
}
}
}
}
} else {
/* Otherwise, we were run standalone, find the terminal type from the environement */
char * nterm = getenv("TERM");