Skip to content
Snippets Groups Projects
Commit 9ea09ca8 authored by Ove Kåven's avatar Ove Kåven Committed by Alexandre Julliard
Browse files

Added handling of SIGUSR2 for the new event interruption handling,

bumping up the protocol revision. Made some debug messages not be
output when it's not necessary.
parent 866b3376
No related branches found
No related tags found
No related merge requests found
......@@ -69,7 +69,8 @@ int XREAD(int fd,void*buf,int size) {
perror("dosmod read");
return -1;
}
fprintf(stderr,"dosmod read only %d of %d bytes.\n",res,size);
if (res) /* don't print the EOF condition */
fprintf(stderr,"dosmod read only %d of %d bytes.\n",res,size);
return res;
}
}
......@@ -108,7 +109,7 @@ void get_timer(struct timeval*tim)
*tim=cur.it_value;
}
volatile int sig_pend,sig_fatal=0,sig_alrm=0;
volatile int sig_pend,sig_fatal=0,sig_alrm=0,sig_cb=0;
void*img;
struct vm86plus_struct VM86;
......@@ -121,8 +122,10 @@ void sig_handler(int sig)
void bad_handler(int sig)
{
fprintf(stderr,"DOSMOD caught fatal signal %d\n",sig);
fprintf(stderr,"(Last known VM86 CS:IP was %04x:%04lx)\n",VM86.regs.cs,VM86.regs.eip);
if (sig!=SIGTERM) {
fprintf(stderr,"DOSMOD caught fatal signal %d\n",sig);
fprintf(stderr,"(Last known VM86 CS:IP was %04x:%04lx)\n",VM86.regs.cs,VM86.regs.eip);
}
sig_pend=sig; sig_fatal++;
signal(sig,bad_handler);
}
......@@ -133,6 +136,12 @@ void alarm_handler(int sig)
signal(sig,alarm_handler);
}
void cb_handler(int sig)
{
sig_cb++;
signal(sig,cb_handler);
}
int main(int argc,char**argv)
{
int mfd=open(argv[0],O_RDWR);
......@@ -169,7 +178,7 @@ int main(int argc,char**argv)
signal(SIGHUP,sig_handler);
signal(SIGINT,sig_handler);
signal(SIGUSR1,sig_handler);
signal(SIGUSR2,sig_handler);
signal(SIGUSR2,cb_handler);
signal(SIGALRM,alarm_handler);
signal(SIGQUIT,bad_handler);
......@@ -183,7 +192,7 @@ int main(int argc,char**argv)
set_timer(&tim);
#endif
/* report back to the main program that we're ready */
ret=1; /* dosmod protocol revision 1 */
ret=2; /* dosmod protocol revision */
XWRITE(1,&ret,sizeof(ret));
/* context exchange loop */
do {
......@@ -202,14 +211,20 @@ int main(int argc,char**argv)
case DOSMOD_ENTER:
default:
if (XREAD(0,&VM86,sizeof(VM86))!=sizeof(VM86)) return 1;
if (sig_pend||sig_alrm) ret=DOSMOD_SIGNAL; else
if (sig_pend||sig_alrm||sig_cb) ret=DOSMOD_SIGNAL; else
ret=vm86plus(func,&VM86);
if (XWRITE(1,&ret,sizeof(ret))!=sizeof(ret)) return 1;
if (XWRITE(1,&VM86,sizeof(VM86))!=sizeof(VM86)) return 1;
switch (ret&0xff) {
case DOSMOD_SIGNAL:
ret=sig_pend; sig_pend=0;
if (!ret) { ret=SIGALRM; sig_alrm--; }
if (!ret) {
if (sig_alrm) {
ret=SIGALRM; sig_alrm--;
} else {
ret=SIGUSR2; sig_cb--;
}
}
if (XWRITE(1,&ret,sizeof(ret))!=sizeof(ret)) return 1;
if (sig_fatal) return 1;
break;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment