void SipperMediaListener::removeController(int accSock) { MutexGuard(&_mutex); _controllerMap.erase(accSock); MutexSignal(); SipperMediaPortable::getTimeOfDay(&_lastActivityTime); }
void SipperProxyStatSockAcceptor::_processIncomingConnections() { fd_set read_fds; while(true) { { MutexGuard(&_mutex); if(_shutdownFlag) return; } FD_ZERO(&read_fds); FD_SET(_sock, &read_fds); struct timeval time_out; time_out.tv_sec = 1; time_out.tv_usec = 0; if(select(_sock + 1, &read_fds, NULL, NULL, &time_out) == -1) { std::string errMsg = SipperProxyPortable::errorString(); logger.logMsg(ERROR_FLAG, 0, "Error getting socket status. [%s]\n", errMsg.c_str()); continue; } if(FD_ISSET(_sock, &read_fds)) { struct sockaddr_in cliAddr; memset(&cliAddr, 0, sizeof(cliAddr)); #ifdef __UNIX__ socklen_t len = sizeof(cliAddr); #else int len = sizeof(cliAddr); #endif int accSock = accept(_sock, (struct sockaddr *)&cliAddr, &len); if(accSock == -1) { std::string errMsg = SipperProxyPortable::errorString(); logger.logMsg(ERROR_FLAG, 0, "Accept failed for [%d]. [%s]\n", _sock, errMsg.c_str()); continue; } logger.logMsg(ALWAYS_FLAG, 0, "Accepted connection Sock[%d] From IP[%s] Port[%d]\n", accSock, inet_ntoa(cliAddr.sin_addr), ntohs(cliAddr.sin_port)); SipperProxyPortable::setNonBlocking(accSock); SipperProxyPortable::setTcpNoDelay(accSock); SipperProxyRefObjHolder<SipperProxyStatDispatcher> holder(new SipperProxyStatSockDispatcher(accSock, _mgr)); } } }
void SipperMediaListener::shutdown() { logger.logMsg(ALWAYS_FLAG, 0, "Shutdown called on listener. \n"); MutexGuard(&_mutex); _shutdownFlag = true; for(SipperMediaControllerMapIt it = _controllerMap.begin(); it != _controllerMap.end(); ++it) { logger.logMsg(ALWAYS_FLAG, 0, "Shutdown called on controller[%d]. \n", it->first); it->second->shutdown(); } return; }
char_ptr JobQueue_JobQueueServiceImpl::generateJobId () const { MutexGuard(d_->lock_); struct timeval tv; struct timezone tz; gettimeofday(&tv, &tz); long secs=tv.tv_sec; long usecs=tv.tv_usec; char buf[strlen(d_->hostname_.get())+100]; sprintf(buf, "%s-%d-%ld-%ld", d_->hostname_.get(), d_->pid_, secs, usecs); if (strlen(buf) > strlen(d_->hostname_.get())+99) { PANICV("buffer overflow in JobQueue_JobQueueServiceImpl::generateJobId strlen(%s)=%d", buf, strlen(buf)); } return ptr_strdup(buf); }
std::string SipperProxyConfig::getConfig(const std::string §ion, const std::string ¶mName, const std::string &defaultValue) { std::string ret; { MutexGuard(&_mutex); SectionMapIt it; if(section == "") { it = _sectionConfig.find("Global"); } else { it = _sectionConfig.find(section); } if(it == _sectionConfig.end()) { ret = defaultValue; } else { ConfigMap &currconfig = it->second; ConfigMapIt cit = currconfig.find(paramName); if(cit == currconfig.end()) { ret = defaultValue; } else { ret = cit->second; } } } return ret; }
void SipperMediaListener::addController(int accSock, SipperMediaController *controller) { MutexGuard(&_mutex); _controllerMap[accSock] = controller; SipperMediaPortable::getTimeOfDay(&_lastActivityTime); }
int SipperMediaListener::startListener(unsigned short port) { #ifndef __UNIX__ WSADATA wsaData; int iResult; iResult = WSAStartup(MAKEWORD(2,2), &wsaData); if (iResult != 0) { logger.logMsg(ERROR_FLAG, 0, "WSAStartup failed: %d\n", iResult); exit(1); } #endif SipperMediaConfig &config = SipperMediaConfig::getInstance(); int inActiveDuration = atoi(config.getConfig("Global", "InActiveDuration", "300").c_str()); if(inActiveDuration < 0) { logger.logMsg(ERROR_FLAG, 0, "InActiveTimer is -ve. Using default Value\n"); inActiveDuration = 300; } _shutdownFlag = false; int sock = socket(AF_INET, SOCK_STREAM, 0); u_int flagOn = 1; #ifndef __UNIX__ setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char *)&flagOn, sizeof(flagOn)); #else setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &flagOn, sizeof(flagOn)); #endif sockaddr_in svrInfo; memset(&svrInfo, 0, sizeof(sockaddr_in)); svrInfo.sin_family = AF_INET; svrInfo.sin_addr.s_addr = INADDR_ANY; svrInfo.sin_port = htons(port); if(bind(sock, (struct sockaddr *)&svrInfo, sizeof(sockaddr_in)) == -1) { logger.logMsg(ERROR_FLAG, 0, "Unable to bind to Port[%d] Error[%s].\n", port, SipperMediaListener::errorString().c_str()); SipperMediaListener::disconnectSocket(sock); return -1; } if(listen(sock, 5) == -1) { logger.logMsg(ERROR_FLAG, 0, "Listen call failed for Port[%d] Error[%s].\n", port, SipperMediaListener::errorString().c_str()); SipperMediaListener::disconnectSocket(sock); return -2; } SipperMediaListener::setNonBlocking(sock); SipperMediaListener::setTcpNoDelay(sock); fd_set read_fds; while(true) { FD_ZERO(&read_fds); FD_SET(sock, &read_fds); if(inActiveDuration > 0) { MutexGuard(&_mutex); struct timeval currtime; SipperMediaPortable::getTimeOfDay(&currtime); if(currtime.tv_sec > (_lastActivityTime.tv_sec + inActiveDuration)) { if(_controllerMap.size() == 0) { logger.logMsg(ALWAYS_FLAG, 0, "Shutdown on inActivity."); _shutdownFlag = true; break; } } } struct timeval time_out; time_out.tv_sec = 1; time_out.tv_usec = 0; if(select(sock + 1, &read_fds, NULL, NULL, &time_out) == -1) { std::string errMsg = SipperMediaListener::errorString(); logger.logMsg(ERROR_FLAG, 0, "Error getting socket status. [%s]\n", errMsg.c_str()); continue; } if(_shutdownFlag) { break; } if(FD_ISSET(sock, &read_fds)) { struct sockaddr_in cliAddr; memset(&cliAddr, 0, sizeof(cliAddr)); #ifdef __UNIX__ socklen_t len = sizeof(cliAddr); #else int len = sizeof(cliAddr); #endif int accSock = accept(sock, (struct sockaddr *)&cliAddr, &len); if(accSock == -1) { std::string errMsg = SipperMediaListener::errorString(); logger.logMsg(ERROR_FLAG, 0, "Accept failed for [%d]. [%s]\n", sock, errMsg.c_str()); continue; } logger.logMsg(ALWAYS_FLAG, 0, "Accepted connection Sock[%d] From IP[%s] Port[%d]\n", accSock, inet_ntoa(cliAddr.sin_addr), ntohs(cliAddr.sin_port)); SipperMediaListener::setNonBlocking(accSock); SipperMediaListener::setTcpNoDelay(accSock); { MutexGuard(&_mutex); SipperMediaPortable::getTimeOfDay(&_lastActivityTime); } pthread_t currthread; SipperMediaListenerThreadData *thrData = new SipperMediaListenerThreadData; thrData->listener = this; thrData->socket = accSock; pthread_create(&currthread, NULL, SipperMediaListener::_startControllerThread, (void *)thrData); } } SipperMediaListener::disconnectSocket(sock); this->shutdown(); { MutexGuard(&_mutex); while(_controllerMap.size() > 0) { logger.logMsg(ALWAYS_FLAG, 0, "Waiting for [%d] controllers to exit.\n", _controllerMap.size()); MutexWait(1000); } } #ifndef __UNIX__ Sleep(100); #else sleep(1); #endif logger.logMsg(ALWAYS_FLAG, 0, "Listener ended.\n"); return 0; }
void SipperProxyConfig::loadConfigFile(const std::string &configFile) { MutexGuard(&_mutex); FILE *fp = fopen(configFile.c_str(), "r"); if(fp == NULL) { return; } std::string section = "Global"; char data[201]; data[200] = '\0'; while(fgets(data, 200, fp) != NULL) { int len = strlen(data); while((len > 0) && ((data[len - 1] == '\r') || (data[len - 1] == '\n'))) { len--; data[len] = '\0'; } if(data[0] == '#') { continue; } if(data[0] == '[') { char *start = data + 1; while((*start != '\0') && (*start == ' ')) { start++; } if(*start == '\0') continue; char *end = strstr(data + 1, "]"); if(end == NULL) { continue; } *end = '\0'; end--; while((end > start) && (*end == ' ')) { *end = '\0'; end--; } if(end == start) continue; section = start; logger.logMsg(TRACE_FLAG, 0, "Section [%s]\n", section.c_str()); continue; } char *paramName = data; while(*paramName == ' ') paramName++; char *end = strstr(paramName, "="); if(end == NULL) continue; char *paramValue = end + 1; *end = '\0'; end--; while((end > paramName) && (*end == ' ')) { *end = '\0'; end--; } if(*paramName == '\0') continue; while(*paramValue == ' ') paramValue++; end = paramValue; while(*end != '\0' && *end != ' ') { end++; } if(*end == ' ') *end = '\0'; _sectionConfig[section][paramName] = paramValue; logger.logMsg(ALWAYS_FLAG, 0, "Section[%s] Name[%s] Value[%s]\n", section.c_str(), paramName, paramValue); } fclose(fp); }