"tincctl stop" now removes the tinc service on Windows.
This commit is contained in:
parent
c6c989cfa1
commit
25091454da
2 changed files with 41 additions and 30 deletions
|
@ -53,7 +53,7 @@ static SC_HANDLE service = NULL;
|
||||||
static SERVICE_STATUS status = {0};
|
static SERVICE_STATUS status = {0};
|
||||||
static SERVICE_STATUS_HANDLE statushandle = 0;
|
static SERVICE_STATUS_HANDLE statushandle = 0;
|
||||||
|
|
||||||
bool install_service(void) {
|
static bool install_service(void) {
|
||||||
char command[4096] = "\"";
|
char command[4096] = "\"";
|
||||||
char **argp;
|
char **argp;
|
||||||
bool space;
|
bool space;
|
||||||
|
@ -113,35 +113,6 @@ bool install_service(void) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool remove_service(void) {
|
|
||||||
manager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
|
|
||||||
if(!manager) {
|
|
||||||
logger(LOG_ERR, "Could not open service manager: %s", winerror(GetLastError()));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
service = OpenService(manager, identname, SERVICE_ALL_ACCESS);
|
|
||||||
|
|
||||||
if(!service) {
|
|
||||||
logger(LOG_ERR, "Could not open %s service: %s", identname, winerror(GetLastError()));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!ControlService(service, SERVICE_CONTROL_STOP, &status))
|
|
||||||
logger(LOG_ERR, "Could not stop %s service: %s", identname, winerror(GetLastError()));
|
|
||||||
else
|
|
||||||
logger(LOG_INFO, "%s service stopped", identname);
|
|
||||||
|
|
||||||
if(!DeleteService(service)) {
|
|
||||||
logger(LOG_ERR, "Could not remove %s service: %s", identname, winerror(GetLastError()));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
logger(LOG_INFO, "%s service removed", identname);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
DWORD WINAPI controlhandler(DWORD request, DWORD type, LPVOID boe, LPVOID bah) {
|
DWORD WINAPI controlhandler(DWORD request, DWORD type, LPVOID boe, LPVOID bah) {
|
||||||
switch(request) {
|
switch(request) {
|
||||||
case SERVICE_CONTROL_INTERROGATE:
|
case SERVICE_CONTROL_INTERROGATE:
|
||||||
|
|
|
@ -482,6 +482,41 @@ void pcap(int fd, FILE *out) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_MINGW
|
||||||
|
static bool remove_service(void) {
|
||||||
|
SC_HANDLE manager = NULL;
|
||||||
|
SC_HANDLE service = NULL;
|
||||||
|
SERVICE_STATUS status = {0};
|
||||||
|
|
||||||
|
manager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
|
||||||
|
if(!manager) {
|
||||||
|
fprintf(stderr, "Could not open service manager: %s\n", winerror(GetLastError()));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
service = OpenService(manager, identname, SERVICE_ALL_ACCESS);
|
||||||
|
|
||||||
|
if(!service) {
|
||||||
|
fprintf(stderr, "Could not open %s service: %s\n", identname, winerror(GetLastError()));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!ControlService(service, SERVICE_CONTROL_STOP, &status))
|
||||||
|
fprintf(stderr, "Could not stop %s service: %s\n", identname, winerror(GetLastError()));
|
||||||
|
else
|
||||||
|
fprintf(stderr, "%s service stopped", identname);
|
||||||
|
|
||||||
|
if(!DeleteService(service)) {
|
||||||
|
fprintf(stderr, "Could not remove %s service: %s\n", identname, winerror(GetLastError()));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "%s service removed\n", identname);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int main(int argc, char *argv[], char *envp[]) {
|
int main(int argc, char *argv[], char *envp[]) {
|
||||||
int fd;
|
int fd;
|
||||||
int result;
|
int result;
|
||||||
|
@ -622,11 +657,16 @@ int main(int argc, char *argv[], char *envp[]) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!strcasecmp(argv[optind], "stop")) {
|
if(!strcasecmp(argv[optind], "stop")) {
|
||||||
|
#ifndef HAVE_MINGW
|
||||||
sendline(fd, "%d %d", CONTROL, REQ_STOP);
|
sendline(fd, "%d %d", CONTROL, REQ_STOP);
|
||||||
if(!recvline(fd, line, sizeof line) || sscanf(line, "%d %d %d", &code, &req, &result) != 3 || code != CONTROL || req != REQ_STOP || result) {
|
if(!recvline(fd, line, sizeof line) || sscanf(line, "%d %d %d", &code, &req, &result) != 3 || code != CONTROL || req != REQ_STOP || result) {
|
||||||
fprintf(stderr, "Could not stop tinc daemon\n");
|
fprintf(stderr, "Could not stop tinc daemon\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
if(!remove_service())
|
||||||
|
return 1;
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue