void log_log(CmsLogLevel level, const char *func, UINT32 lineNum, const char *pFmt, ... ) { va_list ap; char buf[MAX_LOG_LINE_LENGTH] = {0}; int len=0, maxLen; char *logLevelStr=NULL; const CmsEntityInfo *einfo=NULL; int logTelnetFd = -1; maxLen = sizeof(buf); if (level <= logLevel) { va_start(ap, pFmt); if (logHeaderMask & CMSLOG_HDRMASK_APPNAME) { if ((einfo = cmsEid_getEntityInfo(gEid)) != NULL) { len = snprintf(buf, maxLen, "%s:", einfo->name); } else { len = snprintf(buf, maxLen, "unknown:"); } } if ((logHeaderMask & CMSLOG_HDRMASK_LEVEL) && (len < maxLen)) { /* * Only log the severity level when going to stderr * because syslog already logs the severity level for us. */ if (logDestination == LOG_DEST_STDERR) { switch(level) { case LOG_LEVEL_ERR: logLevelStr = "error"; break; case LOG_LEVEL_NOTICE: logLevelStr = "notice"; break; case LOG_LEVEL_DEBUG: logLevelStr = "debug"; break; default: logLevelStr = "invalid"; break; } len += snprintf(&(buf[len]), maxLen - len, "%s:", logLevelStr); } } /* * Log timestamp for both stderr and syslog because syslog's * timestamp is when the syslogd gets the log, not when it was * generated. */ if ((logHeaderMask & CMSLOG_HDRMASK_TIMESTAMP) && (len < maxLen)) { CmsTimestamp ts; cmsTms_get(&ts); len += snprintf(&(buf[len]), maxLen - len, "%u.%03u:", ts.sec%1000, ts.nsec/NSECS_IN_MSEC); } if ((logHeaderMask & CMSLOG_HDRMASK_LOCATION) && (len < maxLen)) { len += snprintf(&(buf[len]), maxLen - len, "%s:%u:", func, lineNum); } if (len < maxLen) { maxLen -= len; vsnprintf(&buf[len], maxLen, pFmt, ap); } if (logDestination == LOG_DEST_STDERR) { fprintf(stderr, "%s\n", buf); fflush(stderr); } else if (logDestination == LOG_DEST_TELNET ) { #ifdef DESKTOP_LINUX /* Fedora Desktop Linux */ logTelnetFd = open("/dev/pts/1", O_RDWR); #else /* CPE use ptyp0 as the first pesudo terminal */ logTelnetFd = open("/dev/ttyp0", O_RDWR); #endif if(logTelnetFd != -1) { write(logTelnetFd, buf, strlen(buf)); write(logTelnetFd, "\n", strlen("\n")); close(logTelnetFd); } } else { oalLog_syslog(level, buf); } va_end(ap); } } /* End of log_log() */
CmsRet oalMsg_init(CmsEntityId eid, void **msgHandle) { CmsMsgHandle *handle; const CmsEntityInfo *eInfo; struct sockaddr_un serverAddr; SINT32 rc; if ((eInfo = cmsEid_getEntityInfo(eid)) == NULL) { cmsLog_error("Invalid eid %d", eid); return CMSRET_INVALID_ARGUMENTS; } if ((handle = (CmsMsgHandle *) cmsMem_alloc(sizeof(CmsMsgHandle), ALLOC_ZEROIZE)) == NULL) { cmsLog_error("could not allocate storage for msg handle"); return CMSRET_RESOURCE_EXCEEDED; } /* store caller's eid */ handle->eid = eid; #ifdef DESKTOP_LINUX /* * Applications may be run without smd on desktop linux, so if we * don't see a socket for smd, don't bother connecting to it. */ { struct stat statbuf; if ((rc = stat(SMD_MESSAGE_ADDR, &statbuf)) < 0) { handle->commFd = CMS_INVALID_FD; handle->standalone = TRUE; *msgHandle = (void *) handle; cmsLog_notice("no smd server socket detected, running in standalone mode."); return CMSRET_SUCCESS; } } #endif /* DESKTOP_LINUX */ /* * Create a unix domain socket. */ handle->commFd = socket(AF_LOCAL, SOCK_STREAM, 0); if (handle->commFd < 0) { cmsLog_error("Could not create socket"); cmsMem_free(handle); return CMSRET_INTERNAL_ERROR; } /* * Set close-on-exec, even though all apps should close their * fd's before fork and exec. */ if ((rc = fcntl(handle->commFd, F_SETFD, FD_CLOEXEC)) != 0) { cmsLog_error("set close-on-exec failed, rc=%d errno=%d", rc, errno); close(handle->commFd); cmsMem_free(handle); return CMSRET_INTERNAL_ERROR; } /* * Connect to smd. */ memset(&serverAddr, 0, sizeof(serverAddr)); serverAddr.sun_family = AF_LOCAL; strncpy(serverAddr.sun_path, SMD_MESSAGE_ADDR, sizeof(serverAddr.sun_path)); rc = connect(handle->commFd, (struct sockaddr *) &serverAddr, sizeof(serverAddr)); if (rc != 0) { cmsLog_error("connect to %s failed, rc=%d errno=%d", SMD_MESSAGE_ADDR, rc, errno); close(handle->commFd); cmsMem_free(handle); return CMSRET_INTERNAL_ERROR; } else { cmsLog_debug("commFd=%d connected to smd", handle->commFd); } /* send a launched message to smd */ { CmsRet ret; CmsMsgHeader launchMsg = EMPTY_MSG_HEADER; launchMsg.type = CMS_MSG_APP_LAUNCHED; launchMsg.src = (eInfo->flags & EIF_MULTIPLE_INSTANCES) ? MAKE_SPECIFIC_EID(getpid(), eid) : eid; launchMsg.dst = EID_SMD; launchMsg.flags_event = 1; if ((ret = oalMsg_send(handle->commFd, &launchMsg)) != CMSRET_SUCCESS) { close(handle->commFd); cmsMem_free(handle); return CMSRET_INTERNAL_ERROR; } else { cmsLog_debug("sent LAUNCHED message to smd"); } } /* successful, set handle pointer */ *msgHandle = (void *) handle; return CMSRET_SUCCESS; }