static int Lwm2mServer_Start(Options * options) { int xmlFd; int result = 0; if (options->Daemonise) { Daemonise(options->Verbose); } else { signal(SIGINT, Lwm2m_CtrlCSignalHandler); } signal(SIGTERM, Lwm2m_CtrlCSignalHandler); // open log files here if (options->LogFile != NULL) { errno = 0; logFile = fopen(options->LogFile, "at"); if (logFile != NULL) { Lwm2m_SetOutput(logFile); // redirect stdout dup2(fileno(logFile), STDOUT_FILENO); } else { Lwm2m_Error("Failed to open log file %s: %s\n", options->LogFile, strerror(errno)); } } if (options->Version) { Lwm2m_Printf(0, "%s\n", version); goto error_close_log; } Lwm2m_SetLogLevel((options->Verbose) ? DebugLevel_Debug : DebugLevel_Info); Lwm2m_PrintBanner(); if (options->Verbose) { PrintOptions(options); } Lwm2m_Info("Awa LWM2M Server, version %s\n", version); Lwm2m_Info(" Process ID : %d\n", getpid()); Lwm2m_Info(" DTLS library : %s\n", DTLS_LibraryName); Lwm2m_Info(" CoAP library : %s\n", coap_LibraryName); Lwm2m_Info(" CoAP port : %d\n", options->CoapPort); Lwm2m_Info(" Secure : %s\n", options->Secure ? "true": "false"); Lwm2m_Info(" IPC port : %d\n", options->IpcPort); Lwm2m_Info(" Address family : IPv%d\n", options->AddressFamily == AF_INET ? 4 : 6); if (options->InterfaceName != NULL) { Lwm2m_Info("LWM2M server - Using interface %s [IPv%d]\n", options->InterfaceName, options->AddressFamily == AF_INET? 4 : 6); } else if (strcmp(DEFAULT_IP_ADDRESS, options->IPAddress) != 0) { Lwm2m_Info("LWM2M server - IP Address %s\n", options->IPAddress); } char ipAddress[NI_MAXHOST]; if (options->InterfaceName != NULL) { if (Lwm2mCore_GetIPAddressFromInterface(options->InterfaceName, options->AddressFamily, ipAddress, sizeof(ipAddress)) != 0) { result = 1; goto error_close_log; } Lwm2m_Info("LWM2M server - Interface Address %s\n", ipAddress); } else { strncpy(ipAddress, options->IPAddress, NI_MAXHOST); ipAddress[NI_MAXHOST - 1] = '\0'; // Defensive } CoapInfo * coap = coap_Init(ipAddress, options->CoapPort, options->Secure, (options->Verbose) ? DebugLevel_Debug : DebugLevel_Info); if (coap == NULL) { printf("Unable to map address to network interface\n"); result = 1; goto error_close_log; } if (options->Secure) { coap_SetCertificate(serverCert, sizeof(serverCert), CertificateFormat_PEM); coap_SetPSK(pskIdentity, pskKey, sizeof(pskKey)); } Lwm2mContextType * context = Lwm2mCore_Init(NULL, options->ContentType); // NULL, don't map coap with objectStore // must happen after coap_Init() Lwm2m_RegisterObjectTypes(context); // listen for UDP packets on port 12345 for now. xmlFd = xmlif_init(context, options->IpcPort); if (xmlFd < 0) { result = 1; goto error_destroy; } xmlif_RegisterHandlers(); // wait for messages on both the "IPC" and coap interfaces while (!quit) { int loop_result; struct pollfd fds[2]; int nfds = 2; int timeout; fds[0].fd = coap->fd; fds[0].events = POLLIN; fds[1].fd = xmlFd; fds[1].events = POLLIN; timeout = Lwm2mCore_Process(context); loop_result = poll(fds, nfds, timeout); if (loop_result < 0) { if (errno == EINTR) { continue; } perror("poll:"); break; } else if (loop_result > 0) { if (fds[0].revents == POLLIN) { coap_HandleMessage(); } if (fds[1].revents == POLLIN) { xmlif_process(fds[1].fd); } } coap_Process(); } Lwm2m_Debug("Exit triggered\n"); error_destroy: xmlif_destroy(xmlFd); Lwm2mCore_Destroy(context); coap_Destroy(); error_close_log: Lwm2m_Info("Server exiting\n"); if (logFile != NULL) { fclose(logFile); } return result; }
static int Bootstrap_Start(Options * options) { int result = 0; if (options->Daemonise) { Daemonise(options->Verbose); } else { signal(SIGINT, CtrlCSignalHandler); } signal(SIGTERM, CtrlCSignalHandler); // open log files here if (options->LogFile) { errno = 0; logFile = fopen(options->LogFile, "at"); if (logFile != NULL) { Lwm2m_SetOutput(logFile); // redirect stdout dup2(fileno(logFile), STDOUT_FILENO); } else { Lwm2m_Error("Failed to open log file %s: %s\n", options->LogFile, strerror(errno)); } } if (options->Version) { Lwm2m_Printf(0, "%s\n", version); goto error_close_log; } Lwm2m_SetLogLevel((options->Verbose) ? DebugLevel_Debug : DebugLevel_Info); Lwm2m_PrintBanner(); if (options->Verbose) { PrintOptions(options); } Lwm2m_Info("Awa LWM2M Bootstrap Server, version %s\n", version); Lwm2m_Info(" Process ID : %d\n", getpid()); Lwm2m_Info(" CoAP port : %d\n", options->Port); if (options->InterfaceName != NULL) { Lwm2m_Info(" Interface : %s [IPv%d]\n", options->InterfaceName, options->AddressFamily == AF_INET? 4 : 6); } else if (strcmp(DEFAULT_IP_ADDRESS, options->IPAddress) != 0) { Lwm2m_Info(" IP Address : %s\n", options->IPAddress); } char ipAddress[NI_MAXHOST]; if (options->InterfaceName != NULL) { if (Lwm2mCore_GetIPAddressFromInterface(options->InterfaceName, options->AddressFamily, ipAddress, sizeof(ipAddress)) != 0) { result = 1; goto error_close_log; } Lwm2m_Info(" Interface Addr : %s\n", ipAddress); } else { strncpy(ipAddress, options->IPAddress, NI_MAXHOST); ipAddress[NI_MAXHOST - 1] = '\0'; // Defensive } CoapInfo * coap = coap_Init(ipAddress, options->Port, (options->Verbose) ? DebugLevel_Debug : DebugLevel_Info); if (coap == NULL) { printf("Unable to map address to network interface\n"); result = 1; goto error_close_log; } Lwm2mContextType * context = Lwm2mCore_Init(coap); // must happen after coap_Init() Lwm2m_RegisterObjectTypes(context); if (!Lwm2mBootstrap_BootStrapInit(context, options->Config, options->ConfigCount)) { printf("Failed to initialise boostrap\n"); result = 1; goto error_destroy; } // wait for messages on both the "IPC" and coap interfaces while (!quit) { int loop_result; struct pollfd fds[1]; int nfds = 1; int timeout; fds[0].fd = coap->fd; fds[0].events = POLLIN; timeout = Lwm2mCore_Process(context); loop_result = poll(fds, nfds, timeout); if (loop_result < 0) { if (errno == EINTR) { continue; } perror("poll:"); break; } else if (loop_result > 0) { if (fds[0].revents == POLLIN) { coap_HandleMessage(); } } coap_Process(); } Lwm2m_Debug("Exit triggered\n"); error_destroy: Lwm2mBootstrap_Destroy(); Lwm2mCore_Destroy(context); coap_Destroy(); error_close_log: Lwm2m_Info("Bootstrap Server exiting\n"); if (logFile != NULL) { fclose(logFile); } return result; }