/** * sip_process_int_msg - process internal IPC message from the * the message queue waiting thread. * * @param - none. * * @return none. */ static void sip_process_int_msg (void) { const char *fname = "sip_process_int_msg"; ssize_t rcv_len; uint8_t num_messages = 0; uint8_t response = 0; sip_int_msg_t *int_msg; void *msg; phn_syshdr_t *syshdr; /* read the msg count from the IPC socket */ rcv_len = cprRecvFrom(sip_ipc_serv_socket, &num_messages, sizeof(num_messages), 0, NULL, NULL); if (rcv_len < 0) { CCSIP_DEBUG_ERROR(SIP_F_PREFIX"read IPC failed:" " errno=%d\n", fname, cpr_errno); return; } if (num_messages == 0) { CCSIP_DEBUG_ERROR(SIP_F_PREFIX"message queue is empty!\n", fname); return; } if (num_messages > MAX_SIP_MESSAGES) { CCSIP_DEBUG_ERROR(SIP_F_PREFIX"number of messages on queue exceeds maximum %d\n", fname, num_messages); num_messages = MAX_SIP_MESSAGES; } /* process messages */ int_msg = &sip_int_msgq_buf[0]; while (num_messages) { msg = int_msg->msg; syshdr = int_msg->syshdr; if (msg != NULL && syshdr != NULL) { SIPTaskProcessListEvent(syshdr->Cmd, msg, syshdr->Usr.UsrPtr, syshdr->Len); cprReleaseSysHeader(syshdr); int_msg->msg = NULL; int_msg->syshdr = NULL; } num_messages--; /* one less message to work on */ int_msg++; /* advance to the next message */ } /* * Signal message queue waiting thread to get more messages. */ if (cprSendTo(sip_ipc_serv_socket, (void *)&response, sizeof(response), 0, (cpr_sockaddr_t *)&sip_clnt_sock_addr, cpr_sun_len(sip_clnt_sock_addr)) < 0) { CCSIP_DEBUG_ERROR(SIP_F_PREFIX"%d sending IPC\n", fname); } }
/** * sip_process_int_msg - process internal IPC message from the * the message queue waiting thread. * * @param - none. * * @return none. */ static void sip_process_int_msg (void) { const char *fname = "sip_process_int_msg"; ssize_t rcv_len; uint8_t num_messages = 0; uint8_t response = 0; sip_int_msg_t *int_msg; void *msg; phn_syshdr_t *syshdr; /* read the msg count from the IPC socket */ rcv_len = cprRecvFrom(sip_ipc_serv_socket, &num_messages, sizeof(num_messages), 0, NULL, NULL); if (rcv_len < 0) { CCSIP_DEBUG_ERROR(SIP_F_PREFIX"read IPC failed:" " errno=%d\n", fname, cpr_errno); return; } if (num_messages == 0) { CCSIP_DEBUG_ERROR(SIP_F_PREFIX"message queue is empty!\n", fname); return; } if (num_messages > MAX_SIP_MESSAGES) { CCSIP_DEBUG_ERROR(SIP_F_PREFIX"number of messages on queue exceeds maximum %d\n", fname, num_messages); num_messages = MAX_SIP_MESSAGES; } /* process messages */ int_msg = &sip_int_msgq_buf[0]; while (num_messages) { msg = int_msg->msg; syshdr = int_msg->syshdr; if (msg != NULL && syshdr != NULL) { if (syshdr->Cmd == THREAD_UNLOAD) { /* * Cleanup here, as SIPTaskProcessListEvent wont return. * - Remove last tmp file and tmp dir. */ cprCloseSocket(sip_ipc_serv_socket); unlink(sip_serv_sock_addr.sun_path); char stmpdir[sizeof(sip_serv_sock_addr.sun_path)]; PR_snprintf(stmpdir, sizeof(stmpdir), SIP_IPC_TEMP_PATH, getpid()); if (rmdir(stmpdir) != 0) { CCSIP_DEBUG_ERROR(SIP_F_PREFIX"failed to remove temp dir\n", fname); } } SIPTaskProcessListEvent(syshdr->Cmd, msg, syshdr->Usr.UsrPtr, syshdr->Len); cprReleaseSysHeader(syshdr); int_msg->msg = NULL; int_msg->syshdr = NULL; } num_messages--; /* one less message to work on */ int_msg++; /* advance to the next message */ } /* * Signal message queue waiting thread to get more messages. */ if (cprSendTo(sip_ipc_serv_socket, (void *)&response, sizeof(response), 0, (cpr_sockaddr_t *)&sip_clnt_sock_addr, cpr_sun_len(sip_clnt_sock_addr)) < 0) { CCSIP_DEBUG_ERROR(SIP_F_PREFIX"%d sending IPC\n", fname); } }