In 16-bit services, you register a signal handler function that accepts the SIG_PFLG_A signal and acts on the information. To register the signal handler, call DosSetSigHandler() in your main program:

#define INCL_DOSSIGNALS
#include <os2.h>         /* From the TOOLKT13\C\INCLUDE directory */
#include <netcons.h>     /* From the header files supplied with LAN Server */
#include <service.h>     /* From the header files supplied with LAN Server */
.
.
.
int main (void) /* or include argc, etc., to taste */
{
   
.
.
.
   DosSetSigHandler((PFNSIGHANDLER)&sig_handler, /* Signal handler address  */
                    NULL,                        /* Ignore previous handler */
                    0,                           /* Ignore previous action  */
                    SIGA_ACCEPT,                 /* Process the signal      */
                    SERVICE_RCV_SIG_FLAG))       /* This constant is the
                                                     same as SIG_PFLG_A     */
   
.
.
.
}

The outline of the signal handler looks like this:

void sig_handler(USHORT sig_info, USHORT sig_num)
{
    unsigned char opcode, arg;
    struct service_status status;

    opcode = (unsigned char)(sig_info & 0xff);
    arg = (unsigned char)((sig_info >> 8) & 0xff);

    switch (opcode) {
    case SERVICE_CTRL_INTERROGATE:
            /* Code for INTERROGATE */
            break;
    case SERVICE_CTRL_PAUSE:
            /* Code for PAUSE */
            break;
    case SERVICE_CTRL_CONTINUE:
            /* Code for CONTINUE */
            break;
    case SERVICE_CTRL_UNINSTALL:
            /* Code for UNINSTALL */
            break;
    default:
            /* Code for every other case*/
            break;
    } /* Endswitch */

    /* Here or for each case, */
    NetServiceStatus(status, sizeof(struct service_status));

    /* Issue a 'reset' for this signal */
    DosSetSigHandler(0,0,0,SIGA_ACKNOWLEDGE,sig_no);

    return;
}


[Back] [Next]