/** * @brief The Server's Message Queue Listener function. * * An endless loop calls the function \c ProcessEventsServer() to check for * messages sent by clients. * If the message is valid, \c CreateContextThread() is called to serve this * request. */ static void SVCServiceRunLoop(void) { int rsp; LONG rv; uint32_t dwClientID; /* Connection ID used to reference the Client */ while (TRUE) { if (AraKiri) { /* stop the hotpug thread and waits its exit */ #ifdef USE_USB (void)HPStopHotPluggables(); #endif (void)SYS_Sleep(1); /* now stop all the drivers */ RFCleanupReaders(); EHDeinitializeEventStructures(); ContextsDeinitialize(); at_exit(); } switch (rsp = ProcessEventsServer(&dwClientID)) { case 0: Log2(PCSC_LOG_DEBUG, "A new context thread creation is requested: %d", dwClientID); rv = CreateContextThread(&dwClientID); if (rv != SCARD_S_SUCCESS) Log1(PCSC_LOG_ERROR, "Problem during the context thread creation"); break; case 2: /* * timeout in ProcessEventsServer(): do nothing * this is used to catch the Ctrl-C signal at some time when * nothing else happens */ break; case -1: Log1(PCSC_LOG_ERROR, "Error in ProcessEventsServer"); break; case -2: /* Nothing to do in case of a syscall interrupted * It happens when SIGUSR1 (reload) or SIGINT (Ctrl-C) is received * We just try again */ break; default: Log2(PCSC_LOG_ERROR, "ProcessEventsServer unknown retval: %d", rsp); break; } } }
/** * @brief The Server's Message Queue Listener function. * * An endless loop calls the function \c SHMProcessEventsServer() to check for * messages sent by clients. * If the message is valid, \c CreateContextThread() is called to serve this * request. */ void SVCServiceRunLoop(void) { int rsp; LONG rv; DWORD dwClientID; /* Connection ID used to reference the Client */ rsp = 0; rv = 0; /* * Initialize the comm structure */ rsp = SHMInitializeCommonSegment(); if (rsp == -1) { Log1(PCSC_LOG_CRITICAL, "Error initializing pcscd."); exit(-1); } /* * Initialize the contexts structure */ rv = ContextsInitialize(); if (rv == -1) { Log1(PCSC_LOG_CRITICAL, "Error initializing pcscd."); exit(-1); } /* * Solaris sends a SIGALRM and it is annoying */ signal(SIGALRM, SIG_IGN); signal(SIGPIPE, SIG_IGN); signal(SIGHUP, SIG_IGN); /* needed for Solaris. The signal is sent * when the shell is existed */ /* * This function always returns zero */ rsp = SYS_MutexInit(&usbNotifierMutex); /* * Set up the search for USB/PCMCIA devices */ HPSearchHotPluggables(); HPRegisterForHotplugEvents(); /* * Set up the power management callback routine */ // PMRegisterForPowerEvents(); while (1) { switch (rsp = SHMProcessEventsServer(&dwClientID, 0)) { case 0: Log2(PCSC_LOG_DEBUG, "A new context thread creation is requested: %d", dwClientID); rv = CreateContextThread(&dwClientID); if (rv != SCARD_S_SUCCESS) { Log1(PCSC_LOG_ERROR, "Problem during the context thread creation"); AraKiri = 1; } break; case 2: /* * timeout in SHMProcessEventsServer(): do nothing * this is used to catch the Ctrl-C signal at some time when * nothing else happens */ break; case -1: Log1(PCSC_LOG_ERROR, "Error in SHMProcessEventsServer"); break; case -2: /* Nothing to do in case of a syscall interrupted * It happens when SIGUSR1 (reload) or SIGINT (Ctrl-C) is received * We just try again */ break; default: Log2(PCSC_LOG_ERROR, "SHMProcessEventsServer unknown retval: %d", rsp); break; } if (AraKiri) { /* stop the hotpug thread and waits its exit */ Log1(PCSC_LOG_ERROR, "Preparing to exit..."); HPStopHotPluggables(); SYS_Sleep(1); /* now stop all the drivers */ RFCleanupReaders(1); } } }