static int Lwm2mClient_Start(Options * options) { FILE * logFile = NULL; uint8_t * loadedClientCert = NULL; int result = 0; uint8_t * key = NULL; if (options->Daemonise) { Daemonise(options->Verbose); } else { signal(SIGINT, Lwm2m_CtrlCSignalHandler); } signal(SIGTERM, Lwm2m_CtrlCSignalHandler); 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; } srandom((int)time(NULL)*getpid()); if (options->CoapPort == 0) { options->CoapPort = 6000 + (rand() % 32768); } Lwm2m_SetLogLevel((options->Verbose) ? DebugLevel_Debug : DebugLevel_Info); Lwm2m_PrintBanner(); if (options->Verbose) { PrintOptions(options); } Lwm2m_Info("Awa LWM2M Client, version %s\n", version); Lwm2m_Info(" Process ID : %d\n", getpid()); Lwm2m_Info(" Endpoint name : \'%s\'\n", options->EndPointName); 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(" IPC port : %d\n", options->IpcPort); Lwm2m_Info(" Address family : IPv%d\n", options->AddressFamily == AF_INET ? 4 : 6); Lwm2mCore_SetDefaultContentType(options->DefaultContentType); CoapInfo * coap = coap_Init((options->AddressFamily == AF_INET) ? "0.0.0.0" : "::", options->CoapPort, false /* not a server */, (options->Verbose) ? DebugLevel_Debug : DebugLevel_Info); if (coap == NULL) { Lwm2m_Error("Failed to initialise CoAP on port %d\n", options->CoapPort); result = 1; goto error_close_log; } // always set key if (options->CertificateFile) { loadedClientCert = LoadCertificateFile(options->CertificateFile); } else coap_SetCertificate(clientCert, sizeof(clientCert), AwaCertificateFormat_PEM); if (options->PskIdentity && options->PskKey) { int hexKeyLength = strlen(options->PskKey); int keyLength = hexKeyLength / 2; key = (uint8_t *)malloc(keyLength); if (key) { char * value = options->PskKey; int index; for (index = 0; index < keyLength; index++) { key[index] = HexToByte(value); value += 2; } coap_SetPSK(options->PskIdentity, key, keyLength); } else coap_SetPSK(pskIdentity, pskKey, sizeof(pskKey)); } else coap_SetPSK(pskIdentity, pskKey, sizeof(pskKey)); // if required read the bootstrap information from a file const BootstrapInfo * factoryBootstrapInfo; if (options->FactoryBootstrapFile != NULL) { factoryBootstrapInfo = BootstrapInformation_ReadConfigFile(options->FactoryBootstrapFile); if (factoryBootstrapInfo == NULL) { Lwm2m_Error("Factory Bootstrap configuration file load failed\n"); result = 1; goto error_coap; } else { Lwm2m_Info("Factory Bootstrap:\n"); Lwm2m_Info("Server Configuration\n"); Lwm2m_Info("====================\n"); BootstrapInformation_Dump(factoryBootstrapInfo); } } else { factoryBootstrapInfo = NULL; } Lwm2mContextType * context = Lwm2mCore_Init(coap, options->EndPointName); // Must happen after coap_Init(). RegisterObjects(context, options); if (factoryBootstrapInfo != NULL) { Lwm2mCore_SetFactoryBootstrap(context, factoryBootstrapInfo); } // bootstrap information has been loaded, no need to hang onto this anymore BootstrapInformation_DeleteBootstrapInfo(factoryBootstrapInfo); // load any specified objDef files if (LoadObjectDefinitionsFromFiles(context, options->ObjDefsFiles, options->NumObjDefsFiles) != 0) { goto error_core; } // Listen for UDP packets on IPC port int xmlFd = xmlif_init(context, options->IpcPort); if (xmlFd < 0) { Lwm2m_Error("Failed to initialise XML interface on port %d\n", options->IpcPort); result = 1; goto error_core; } 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"); xmlif_DestroyExecuteHandlers(); xmlif_destroy(xmlFd); error_core: Lwm2mCore_Destroy(context); error_coap: coap_Destroy(); error_close_log: free(loadedClientCert); free(key); Lwm2m_Info("Client exiting\n"); if (logFile) { fclose(logFile); } return result; }
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; }