|
|
|
@ -20,8 +20,8 @@ Contributors:
|
|
|
|
|
|
|
|
|
|
#include "config.h"
|
|
|
|
|
|
|
|
|
|
#include "mosquitto_broker_internal.h"
|
|
|
|
|
#include <windows.h>
|
|
|
|
|
|
|
|
|
|
#include "memory_mosq.h"
|
|
|
|
|
|
|
|
|
|
extern int g_run;
|
|
|
|
@ -29,6 +29,21 @@ SERVICE_STATUS_HANDLE service_handle = 0;
|
|
|
|
|
static SERVICE_STATUS service_status;
|
|
|
|
|
int main(int argc, char *argv[]);
|
|
|
|
|
|
|
|
|
|
static char* fix_name(char* name)
|
|
|
|
|
{
|
|
|
|
|
size_t len;
|
|
|
|
|
|
|
|
|
|
if (strrchr(name, '\\')) {
|
|
|
|
|
name = strrchr(name, '\\') + 1;
|
|
|
|
|
}
|
|
|
|
|
len = strlen(name);
|
|
|
|
|
if(!strcasecmp(&name[len-4], ".exe")){
|
|
|
|
|
name[len-4] = '\0';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return name;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void print_error(void)
|
|
|
|
|
{
|
|
|
|
|
char *buf = NULL;
|
|
|
|
@ -69,23 +84,39 @@ void __stdcall service_main(DWORD dwArgc, LPTSTR *lpszArgv)
|
|
|
|
|
int argc = 1;
|
|
|
|
|
char conf_path[MAX_PATH + 20];
|
|
|
|
|
int rc;
|
|
|
|
|
char *name;
|
|
|
|
|
char env_name[MAX_PATH];
|
|
|
|
|
|
|
|
|
|
UNUSED(dwArgc);
|
|
|
|
|
UNUSED(lpszArgv);
|
|
|
|
|
|
|
|
|
|
service_handle = RegisterServiceCtrlHandler("mosquitto", service_handler);
|
|
|
|
|
name = fix_name(lpszArgv[0]);
|
|
|
|
|
snprintf(env_name, sizeof(env_name), "%s_DIR", name);
|
|
|
|
|
for(int i=0; i<strlen(env_name); i++) {
|
|
|
|
|
if(env_name[i]>='A' && env_name[i]<='Z') {
|
|
|
|
|
/* Keep upper case letter */
|
|
|
|
|
}else if(env_name[i]>='0' && env_name[i]<='9'){
|
|
|
|
|
/* Keep number */
|
|
|
|
|
}else if(env_name[i]>='a' && env_name[i]<='z'){
|
|
|
|
|
/* Convert lower case to upper case */
|
|
|
|
|
env_name[i] -= 32;
|
|
|
|
|
}else{
|
|
|
|
|
env_name[i] = '_';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
service_handle = RegisterServiceCtrlHandler(name, service_handler);
|
|
|
|
|
if(service_handle){
|
|
|
|
|
memset(conf_path, 0, sizeof(conf_path));
|
|
|
|
|
rc = GetEnvironmentVariable("MOSQUITTO_DIR", conf_path, MAX_PATH);
|
|
|
|
|
rc = GetEnvironmentVariable(env_name, conf_path, MAX_PATH);
|
|
|
|
|
if(!rc || rc == MAX_PATH){
|
|
|
|
|
service_status.dwCurrentState = SERVICE_STOPPED;
|
|
|
|
|
SetServiceStatus(service_handle, &service_status);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
strcat(conf_path, "/mosquitto.conf");
|
|
|
|
|
strcat(conf_path, "\\mosquitto.conf");
|
|
|
|
|
|
|
|
|
|
argv = mosquitto__malloc(sizeof(char *)*3);
|
|
|
|
|
argv[0] = "mosquitto";
|
|
|
|
|
argv[0] = name;
|
|
|
|
|
argv[1] = "-c";
|
|
|
|
|
argv[2] = conf_path;
|
|
|
|
|
argc = 3;
|
|
|
|
@ -105,11 +136,12 @@ void __stdcall service_main(DWORD dwArgc, LPTSTR *lpszArgv)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void service_install(void)
|
|
|
|
|
void service_install(char* name)
|
|
|
|
|
{
|
|
|
|
|
SC_HANDLE sc_manager, svc_handle;
|
|
|
|
|
char service_string[MAX_PATH + 20];
|
|
|
|
|
char exe_path[MAX_PATH + 1];
|
|
|
|
|
char display_name[MAX_PATH+1];
|
|
|
|
|
SERVICE_DESCRIPTION svc_desc;
|
|
|
|
|
|
|
|
|
|
memset(exe_path, 0, sizeof(exe_path));
|
|
|
|
@ -119,14 +151,23 @@ void service_install(void)
|
|
|
|
|
}
|
|
|
|
|
snprintf(service_string, sizeof(service_string), "\"%s\" run", exe_path);
|
|
|
|
|
|
|
|
|
|
name = fix_name(name);
|
|
|
|
|
|
|
|
|
|
sc_manager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
|
|
|
|
|
if(sc_manager){
|
|
|
|
|
svc_handle = CreateService(sc_manager, "mosquitto", "Mosquitto Broker",
|
|
|
|
|
if (!strcmp(name, "mosquitto")) {
|
|
|
|
|
snprintf(display_name, sizeof(display_name), "Mosquitto Broker");
|
|
|
|
|
}else{
|
|
|
|
|
snprintf(display_name, sizeof(display_name), "Mosquitto Broker (%s.exe)", name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
svc_handle = CreateService(sc_manager, name, display_name,
|
|
|
|
|
SERVICE_START | SERVICE_STOP | SERVICE_CHANGE_CONFIG,
|
|
|
|
|
SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
|
|
|
|
|
service_string, NULL, NULL, NULL, NULL, NULL);
|
|
|
|
|
|
|
|
|
|
if(svc_handle){
|
|
|
|
|
memset(&svc_desc, 0, sizeof(svc_desc));
|
|
|
|
|
svc_desc.lpDescription = "Eclipse Mosquitto MQTT v5/v3.1.1 broker";
|
|
|
|
|
ChangeServiceConfig2(svc_handle, SERVICE_CONFIG_DESCRIPTION, &svc_desc);
|
|
|
|
|
CloseServiceHandle(svc_handle);
|
|
|
|
@ -139,14 +180,16 @@ void service_install(void)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void service_uninstall(void)
|
|
|
|
|
void service_uninstall(char *name)
|
|
|
|
|
{
|
|
|
|
|
SC_HANDLE sc_manager, svc_handle;
|
|
|
|
|
SERVICE_STATUS status;
|
|
|
|
|
|
|
|
|
|
name = fix_name(name);
|
|
|
|
|
|
|
|
|
|
sc_manager = OpenSCManager(NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_CONNECT);
|
|
|
|
|
if(sc_manager){
|
|
|
|
|
svc_handle = OpenService(sc_manager, "mosquitto", SERVICE_QUERY_STATUS | DELETE);
|
|
|
|
|
svc_handle = OpenService(sc_manager, name, SERVICE_QUERY_STATUS | DELETE);
|
|
|
|
|
if(svc_handle){
|
|
|
|
|
if(QueryServiceStatus(svc_handle, &status)){
|
|
|
|
|
if(status.dwCurrentState == SERVICE_STOPPED){
|
|
|
|
@ -163,14 +206,15 @@ void service_uninstall(void)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void service_run(void)
|
|
|
|
|
void service_run(char *name)
|
|
|
|
|
{
|
|
|
|
|
SERVICE_TABLE_ENTRY ste[] = {
|
|
|
|
|
{ "mosquitto", service_main },
|
|
|
|
|
{ name, service_main },
|
|
|
|
|
{ NULL, NULL }
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
name = fix_name(name);
|
|
|
|
|
ste[0].lpServiceName = name;
|
|
|
|
|
StartServiceCtrlDispatcher(ste);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|