Project

General

Profile

« Previous | Next » 

Revision 39736270

Added by Hamish Coleman about 14 years ago

  • ID 39736270c860147751b68999fd4645ae1717815d

Pass the args to the main function and thus allow the init function to be optional.

View differences:

scm.h
int mode; /* set to SVC_CONSOLE by the *-scm.c code */
int argc; char **argv; /* original cmdline args */
int (*init)(int, char **); /* called before main */
int (*main)(int); /* called to run the service */
int (*stop)(int); /* called by scm to tell the service to stop */
int (*main)(int, char **); /* called to run the service */
int (*stop)(void *); /* called by scm to tell the service to stop */
};
int SCM_Start(struct SCM_def *, int argc, char **argv);
svctest.c
dprintf(1,"%s:%i(%s) %s\n",__FILE__,__LINE__,__FUNCTION__,s)
int svctest_init(int argc, char **argv);
int svctest_main(int param1);
int svctest_stop(int param1);
int svctest_main(int argc, char **argv);
int svctest_stop(void *);
struct SCM_def sd = {
.name = "svctest",
......
}
int run = 1;
int svctest_main(int param1) {
int svctest_main(int argc, char **argv) {
while(run) {
1;
/* FIXME - sleep */
......
return 0;
}
int svctest_stop(int param1) {
int svctest_stop(void *param1) {
run = 0;
trace("return 0");
return 0;
wconsd.c
struct cli_def *cli;
int wconsd_init(int argc, char **argv);
int wconsd_main(int param1);
int wconsd_stop(int param1);
int wconsd_main(int argc, char **argv);
int wconsd_stop(void *);
struct SCM_def sd = {
.name = "wconsd",
.desc = "wconsd - Telnet to Serial server",
......
return 0;
}
int wconsd_stop(int param1) {
int wconsd_stop(void *param1) {
SetEvent(stopEvent);
return 0;
}
......
return 0;
}
int wconsd_main(int param1)
int wconsd_main(int argc, char **argv)
{
HANDLE wait_array[2];
BOOL run=TRUE;
win-scm.c
if (opcode == SERVICE_CONTROL_STOP) {
svcStatus.dwCurrentState = SERVICE_STOP_PENDING;
SetServiceStatus( svcHandle, &svcStatus );
global_sd->stop(0);
global_sd->stop(NULL);
return;
}
SetServiceStatus( svcHandle, &svcStatus );
......
svcHandle = RegisterServiceCtrlHandler(sd->name,ServiceCtrlHandler);
if (!svcHandle) {
/* FIXME - use SvcReportEvent() */
printf("RegisterServiceCtrlHandler failed %d\n", GetLastError());
printf("RegisterServiceCtrlHandler failed %u\n",
(unsigned int)GetLastError());
return;
}
......
}
sd->mode=SVC_OK;
if ((err=sd->init(argc,argv))!=0) {
svcStatus.dwCurrentState = SERVICE_STOPPED;
svcStatus.dwWin32ExitCode = err;
SetServiceStatus( svcHandle, &svcStatus );
return;
if (sd->init) {
if ((err=sd->init(argc,argv))!=0) {
svcStatus.dwCurrentState = SERVICE_STOPPED;
svcStatus.dwWin32ExitCode = err;
SetServiceStatus( svcHandle, &svcStatus );
return;
}
}
svcStatus.dwCurrentState = SERVICE_RUNNING;
svcStatus.dwWin32ExitCode = NO_ERROR;
SetServiceStatus( svcHandle, &svcStatus );
err=sd->main(0);
err=sd->main(argc,argv);
svcStatus.dwCurrentState = SERVICE_STOPPED;
svcStatus.dwWin32ExitCode = NO_ERROR;
......
int SCM_Start_Console(struct SCM_def *sd) {
sd->mode=SVC_CONSOLE;
int err = sd->init(sd->argc,sd->argv);
if (err!=0) {
return SVC_FAIL;
int err;
if (sd->init) {
err = sd->init(sd->argc,sd->argv);
if (err!=0) {
return SVC_FAIL;
}
}
sd->main(0);
sd->main(sd->argc,sd->argv);
return SVC_OK;
}
......
*/
char buf[100];
if (getenv("USERNAME") && getenv("SESSIONNAME")
&& GetConsoleTitle(&buf,sizeof(buf))) {
&& GetConsoleTitle((LPTSTR)&buf,sizeof(buf))) {
return SCM_Start_Console(sd);
}
......
static char path[MAX_PATH];
if( !GetModuleFileName( NULL, path, MAX_PATH ) ) {
printf("GetModuleFileName failed %d\n", GetLastError());
printf("GetModuleFileName failed %u\n",
(unsigned int)GetLastError());
return NULL;
}

Also available in: Unified diff