fixed return value; must be from table if signal() returns sig_trap. DLW
[unix-history] / usr / src / usr.bin / f77 / libU77 / signal_.c
index 056930d..718f1b1 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
-char id_signal[] = "@(#)signal_.c      1.2";
+char id_signal[] = "@(#)signal_.c      1.3";
  *
  * change the action for a specified signal
  *
  *
  * change the action for a specified signal
  *
@@ -31,17 +31,26 @@ long signal_(sigp, procp, flag)
 long *sigp, *flag;
 int (*procp)();
 {
 long *sigp, *flag;
 int (*procp)();
 {
+       int (*oldsig)();
+       int (*oldispatch)();
+
+       oldispatch = dispatch[*sigp];
+
        if (*sigp < 0 || *sigp > 16)
                return(-((long)(errno=F_ERARG)));
 
        if (*flag < 0)  /* function address passed */
        {
                dispatch[*sigp] = procp;
        if (*sigp < 0 || *sigp > 16)
                return(-((long)(errno=F_ERARG)));
 
        if (*flag < 0)  /* function address passed */
        {
                dispatch[*sigp] = procp;
-               return((long)signal((int)*sigp, sig_trap) );
+               oldsig = signal((int)*sigp, sig_trap);
        }
 
        else            /* integer value passed */
        }
 
        else            /* integer value passed */
-               return((long)signal((int)*sigp, (int)*flag) );
+               oldsig = signal((int)*sigp, (int)*flag);
+
+       if (oldsig == sig_trap)
+               return((long)oldispatch);
+       return((long)oldsig);
 }
 
 sig_trap(sn)
 }
 
 sig_trap(sn)