"tincctl stop" now removes the tinc service on Windows.

This commit is contained in:
Guus Sliepen 2011-07-17 19:23:52 +02:00
parent c6c989cfa1
commit 25091454da
2 changed files with 41 additions and 30 deletions

View file

@ -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:

View file

@ -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;
} }