Annotation of researchv10no/cmd/lcc/ph/d47.c, revision 1.1.1.1

1.1       root        1: /* The Plum Hall Validation Suite for C
                      2:  * Unpublished copyright (c) 1986-1991, Chiron Systems Inc and Plum Hall Inc.
                      3:  * VERSION: 4
                      4:  * DATE: 1993-01-01
                      5:  * The "ANSI" mode of this suite corresponds to official ANSI C, X3.159-1989.
                      6:  * As per your license agreement, your distribution is not to be moved or copied outside the Designated Site
                      7:  * without specific permission from Plum Hall Inc.
                      8:  */
                      9: 
                     10: 
                     11: #include "flags.h"
                     12: #define LIB_TEST 1
                     13: #include "defs.h"  /* 92/05/04 moved here from line 18 */
                     14: #ifndef SKIP47
                     15: /*
                     16:  * 4.7 - Signal handling. Both signal() and raise() are tested here.
                     17:  * This file is not relevant for pre ANSI C.
                     18:  */
                     19: 
                     20: #if !ANSI
                     21: void d4_7() { }
                     22: #else
                     23: 
                     24: #include <signal.h>
                     25: void d4_7x(int);
                     26: void d4_7y(void);
                     27: static volatile sig_atomic_t flag = 0;
                     28: volatile sig_atomic_t flag_sig = 0;
                     29: void (*prev_fn)(int) = SIG_DFL;
                     30: static int num_sig[] = {SIGABRT, SIGFPE, SIGILL, SIGINT, SIGSEGV, SIGTERM};
                     31: typedef void (*PIF)(int);
                     32: PIF d4_7b(int);
                     33: void d4_7b_2(int);
                     34: 
                     35: void d4_7()
                     36:        {
                     37:        int i, j;
                     38: 
                     39:        Filename = "d47.c";
                     40: 
                     41:        /* make sure that these are actually macros */
                     42:        #if !defined(SIG_DFL) || !defined(SIG_ERR) || !defined(SIG_IGN)
                     43:                complain(__LINE__);
                     44:        #elif !defined(SIGABRT) || !defined(SIGFPE) || !defined(SIGILL)
                     45:                complain(__LINE__);
                     46:        #elif !defined(SIGINT) || !defined(SIGSEGV) || !defined(SIGTERM)
                     47:                complain(__LINE__);
                     48:        #endif
                     49: 
                     50: 
                     51: 
                     52: 
                     53:        /* test that SIG modes are distinct and of type void (*)(int) */
                     54:        checkthat(__LINE__, SIG_DFL != SIG_ERR && SIG_DFL != SIG_IGN && SIG_ERR != SIG_IGN);
                     55:        {void (*p)(int) = SIG_DFL; checkthat(__LINE__, sizeof(void (*)(int)) == sizeof(SIG_DFL));}
                     56:        {void (*p)(int) = SIG_ERR; checkthat(__LINE__, sizeof(void (*)(int)) == sizeof(SIG_ERR));}
                     57:        {void (*p)(int) = SIG_IGN; checkthat(__LINE__, sizeof(void (*)(int)) == sizeof(SIG_IGN));}
                     58: 
                     59:        /* test that SIG numbers are positive and distinct */
                     60:        for (i = 0; i < 6; ++i)
                     61:                {
                     62:                checkthat(__LINE__, num_sig[i] > 0);
                     63:                for (j = 0; j < i; ++j)
                     64:                        inotequals(__LINE__, num_sig[i], num_sig[j]);
                     65:                }
                     66: 
                     67: 
                     68: 
                     69:        /* 4.7.1.1 signal
                     70:         * it can be set to a user function ... raise should change the flag
                     71:         */
                     72:        signal(SIGINT, d4_7x);
                     73:        /* 4.7.2.1 raise
                     74:         */
                     75:        iequals(__LINE__, raise(SIGINT), 0);
                     76:        iequals(__LINE__, flag, 2);
                     77: 
                     78:        /* after the raise, the signal handler MAY have set SIG_DFL */
                     79:        checkthat( - __LINE__, signal(SIGINT, d4_7x) == SIG_DFL);
                     80: 
                     81:        /* the signal can be set to ignore the raise */
                     82:        flag = 0;
                     83:        signal(SIGINT, SIG_IGN);
                     84:        iequals(__LINE__, raise(SIGINT), 0);
                     85:        iequals(__LINE__, flag, 0);
                     86:        
                     87:        /* the return from signal should be the "previous" value */
                     88:        signal(SIGINT, d4_7x);
                     89:        checkthat(__LINE__, d4_7x == signal(SIGINT, SIG_DFL));
                     90: 
                     91:        /* more extensive raise tests, with externally-linked subfunctions */
                     92:        checkthat(__LINE__, d4_7b(SIGABRT) != SIG_ERR);
                     93:        flag_sig = 0;
                     94:        raise(SIGABRT);
                     95:        checkthat(__LINE__, flag_sig == (sig_atomic_t)SIGABRT);
                     96:        prev_fn = signal(SIGABRT, SIG_DFL);
                     97:        checkthat( - __LINE__, prev_fn == SIG_DFL);
                     98: 
                     99: 
                    100: 
                    101: 
                    102: 
                    103:        checkthat(__LINE__, d4_7b(SIGTERM) != SIG_ERR);
                    104:        flag_sig = 0;
                    105:        raise(SIGTERM);
                    106:        checkthat(__LINE__, flag_sig == (sig_atomic_t)SIGTERM);
                    107:        prev_fn = signal(SIGTERM, SIG_DFL);
                    108:        checkthat( - __LINE__, prev_fn == SIG_DFL);
                    109: 
                    110:        /* test that signal returns the previous handler */
                    111:        prev_fn = signal(SIGTERM, SIG_IGN);
                    112:        prev_fn = signal(SIGTERM, SIG_DFL);
                    113:        checkthat(__LINE__, prev_fn == SIG_IGN);
                    114: 
                    115:        /* test that we can longjmp out of the signal handler */
                    116:        d4_7y();
                    117: 
                    118:        /* test that bad SIG numbers are diagnosed */
                    119:        /* (But test is only a warning, because signal numbers are implem-def'ed.) */
                    120:        checkthat( - __LINE__, SIG_ERR == signal(100+SIGABRT+SIGFPE+SIGILL+SIGINT+SIGSEGV+SIGTERM, SIG_IGN));
                    121:        }
                    122: 
                    123: 
                    124: 
                    125: 
                    126: void d4_7x(signo)
                    127:        int signo;
                    128:        {
                    129:        iequals(__LINE__, signo, SIGINT);
                    130:        flag = 2;
                    131:        }
                    132: 
                    133: /* make sure that a signal handler can do a longjmp */
                    134: #include <setjmp.h>
                    135: jmp_buf d7jbuf = {0};
                    136: void d4_7y()
                    137:        {
                    138:        signal(SIGINT, d4_7b_2);
                    139:        if (setjmp(d7jbuf) == 0)
                    140:                {
                    141:                raise(SIGINT);
                    142:                /* this line should never be reached */
                    143:                complain(__LINE__);
                    144:                }
                    145:        }
                    146:                
                    147: #endif
                    148: 
                    149: #else /* if SKIP47 */
                    150: void d4_7() { pr_skip("d4_7: SKIPPED ENTIRELY\n"); }
                    151: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.