Index: crit.cc =================================================================== RCS file: /cvs/cygwin-apps/cygrunsrv/crit.cc,v retrieving revision 1.2 diff -u -p -r1.2 crit.cc --- crit.cc 23 Jun 2001 00:10:54 -0000 1.2 +++ crit.cc 9 May 2003 13:51:42 -0000 @@ -70,7 +70,7 @@ set_service_status (DWORD state, DWORD c } void -set_service_controls_accepted (bool accept_shutdown) +set_service_controls_accepted (bool accept_shutdown, bool interactive_process) { EnterCriticalSection (&ssc); if (ssh) @@ -78,6 +78,8 @@ set_service_controls_accepted (bool acce ss.dwControlsAccepted = SERVICE_ACCEPT_STOP; if (accept_shutdown) ss.dwControlsAccepted |= SERVICE_ACCEPT_SHUTDOWN; + if (interactive_process) + ss.dwServiceType |= SERVICE_INTERACTIVE_PROCESS; SetServiceStatus(ssh, &ss); } LeaveCriticalSection (&ssc); Index: crit.h =================================================================== RCS file: /cvs/cygwin-apps/cygrunsrv/crit.h,v retrieving revision 1.2 diff -u -p -r1.2 crit.h --- crit.h 23 Jun 2001 00:10:54 -0000 1.2 +++ crit.h 9 May 2003 13:51:42 -0000 @@ -29,6 +29,6 @@ extern void set_service_status (DWORD st DWORD check_point = 0, DWORD wait_hint = 0, DWORD exit_code = NO_ERROR); -extern void set_service_controls_accepted(bool shutdown); +extern void set_service_controls_accepted(bool shutdown, bool interactive); #endif /* _CRIT_H */ Index: cygrunsrv.README =================================================================== RCS file: /cvs/cygwin-apps/cygrunsrv/cygrunsrv.README,v retrieving revision 1.6 diff -u -p -r1.6 cygrunsrv.README --- cygrunsrv.README 11 Mar 2002 11:56:42 -0000 1.6 +++ cygrunsrv.README 9 May 2003 13:51:42 -0000 @@ -243,6 +243,13 @@ application a short time to clean up and each Cygwin process also sends SIGHUP to itself (implicitly) during system shutdown. +------------------------------- +-i, --interactive + + Optional flag that allows cygrunsrv to interact with the desktop. +When in effect, cygrunsrv can open windows and pop up message boxes. +Equivalent to the "Allow service to interact with desktop" box. + ********************************************** General Notes: Index: cygrunsrv.cc =================================================================== RCS file: /cvs/cygwin-apps/cygrunsrv/cygrunsrv.cc,v retrieving revision 1.13 diff -u -p -r1.13 cygrunsrv.cc --- cygrunsrv.cc 24 Apr 2003 08:36:05 -0000 1.13 +++ cygrunsrv.cc 9 May 2003 13:51:43 -0000 @@ -66,17 +66,19 @@ struct option longopts[] = { { "stdout", required_argument, NULL, '1' }, { "stderr", required_argument, NULL, '2' }, { "shutdown", no_argument, NULL, 'o' }, + { "interactive", no_argument, NULL, 'i' }, { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'v' }, { 0, no_argument, NULL, 0 } }; -char *opts = "I:R:S:Q:E:p:a:c:e:d:f:ou:w:t:s:y:0:1:2:hv"; +char *opts = "I:R:S:Q:E:p:a:c:e:d:f:ou:w:t:s:y:0:1:2:ihv"; char *appname; char *svcname; DWORD termsig; DWORD shutdown; +DWORD interactive; enum action_t { Undefined, @@ -129,7 +131,7 @@ int install_registry_keys (const char *name, const char *desc, const char *path, char *args, char *dir, env_t *env, DWORD termsig, const char *in_stdin, const char *in_stdout, - const char *in_stderr, DWORD shutdown) + const char *in_stderr, DWORD shutdown, DWORD interactive) { HKEY srv_key = NULL; HKEY env_key = NULL; @@ -204,6 +206,11 @@ install_registry_keys (const char *name, (const BYTE *) &shutdown, sizeof(DWORD)) != ERROR_SUCCESS) err_out (RegSetValueEx); + if (interactive) + if (RegSetValueEx (srv_key, PARAM_INTERACT, 0, REG_DWORD, + (const BYTE *) &interactive, + sizeof(DWORD)) != ERROR_SUCCESS) + err_out (RegSetValueEx); RegFlushKey (srv_key); out: @@ -274,7 +281,7 @@ int get_reg_entries (const char *name, char *&path, char *&args, char *&dir, env_t *&env, DWORD *termsig_p, char *&stdin_path, char *&stdout_path, char *&stderr_path, - DWORD *shutdown_p) + DWORD *shutdown_p, DWORD *interactive_p) { HKEY srv_key = NULL; HKEY env_key = NULL; @@ -314,6 +321,11 @@ get_reg_entries (const char *name, char (BYTE *) shutdown_p, (size = sizeof(*shutdown_p), &size)) != ERROR_SUCCESS) *shutdown_p = 0; // the default + /* Get (optional) interactive flag. */ + if (RegQueryValueEx (srv_key, PARAM_INTERACT, 0, &type, + (BYTE *) interactive_p, + (size = sizeof(*interactive_p), &size)) != ERROR_SUCCESS) + *interactive_p = 0; // the default /* Get (optional) stdin/stdout/stderr redirection files. */ if ((ret = get_opt_string_entry (srv_key, PARAM_STDIN, stdin_path))) goto out; @@ -476,7 +488,7 @@ eval_arglist (const char *path, char *ar /* Installs cygrunsrv as service `name' with display name `disp'. */ int install_service (const char *name, const char *disp, type_t type, - char *user, char *pass, char **deps) + char *user, char *pass, char **deps, int interactive) { char mypath[MAX_PATH]; SC_HANDLE sm = (SC_HANDLE) 0; @@ -584,7 +596,8 @@ install_service (const char *name, const } /* Try to create service. */ if (!(sh = CreateService (sm, name, disp, SERVICE_ALL_ACCESS, - SERVICE_WIN32_OWN_PROCESS, + SERVICE_WIN32_OWN_PROCESS | + (interactive ? SERVICE_INTERACTIVE_PROCESS : 0), type == Auto ? SERVICE_AUTO_START : SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, mypath, NULL, NULL, @@ -1043,14 +1056,14 @@ service_main (DWORD argc, LPSTR *argv) char *stderr_path = NULL; if (err = get_reg_entries (svcname, path, args, dir, env, &termsig, stdin_path, stdout_path, stderr_path, - &shutdown)) + &shutdown, &interactive)) { syslog_starterr ("get_reg_entries", err); set_service_status (SERVICE_STOPPED, 0, 0, err); return; } - set_service_controls_accepted ( shutdown ); + set_service_controls_accepted ( shutdown, interactive ); report_service_status (); /* Step 2: Further preparations: @@ -1177,6 +1190,7 @@ main (int argc, char **argv) char *in_stdout = NULL; char *in_stderr = NULL; int in_shutdown = 0; + int in_interactive = 0; appname = argv[0]; @@ -1278,6 +1292,13 @@ main (int argc, char **argv) return error (OnlyOneShutdown); in_shutdown = 1; break; + case 'i': + if (action != Install) + return error (InteractiveNotAllowed); + if (in_interactive) + return error (OnlyOneInteractive); + in_interactive = 1; + break; case 's': if (action != Install) return error (SigNotAllowed); @@ -1366,12 +1387,12 @@ main (int argc, char **argv) in_type = Auto; if (!is_executable (in_path)) return error (InvalidPath); - if (ret = install_service (in_name, in_disp, in_type, in_user, in_pass, in_deps)) + if (ret = install_service (in_name, in_disp, in_type, in_user, in_pass, in_deps, in_interactive)) return ret; if (ret = install_registry_keys (in_name, in_desc, in_path, in_args, in_dir, in_env, in_termsig, in_stdin, in_stdout, in_stderr, - in_shutdown)) + in_shutdown, in_interactive)) remove_service (in_name); return ret; break; Index: cygrunsrv.h =================================================================== RCS file: /cvs/cygwin-apps/cygrunsrv/cygrunsrv.h,v retrieving revision 1.8 diff -u -p -r1.8 cygrunsrv.h --- cygrunsrv.h 26 Feb 2002 11:22:29 -0000 1.8 +++ cygrunsrv.h 9 May 2003 13:51:43 -0000 @@ -33,6 +33,7 @@ #define PARAM_ENVIRON "Environment" #define PARAM_TERMSIG "TermSig" #define PARAM_SHUTDOWN "Shutdown" +#define PARAM_INTERACT "Interactive" #define DEF_STDIN_PATH "/dev/null" #define DEF_LOG_PATH "/var/log/" Index: utils.cc =================================================================== RCS file: /cvs/cygwin-apps/cygrunsrv/utils.cc,v retrieving revision 1.10 diff -u -p -r1.10 utils.cc --- utils.cc 24 Apr 2003 08:36:05 -0000 1.10 +++ utils.cc 9 May 2003 13:51:43 -0000 @@ -61,6 +61,8 @@ char *reason_list[] = { "Each of --std{in,out,err} is allowed only once", "--shutdown is only allowed with --install", "Only one --shutdown is allowed", + "--interactive is only allowed with --install", + "Only one --interactive is allowed", "Trailing commandline arguments not allowed", "You must specify one of the `-IRSE' options", "Error installing a service", @@ -167,6 +169,7 @@ usage () uprint (" -2, --stderr Optional output file used for stderr redirection."); uprint (" Default is /var/log/.log."); uprint (" -o, --shutdown Stop service application during system shutdown."); + uprint (" -i, --interactive Allow service to interact with the desktop."); uprint ("\nInformative output:"); uprint (" -h, --help print this help, then exit."); uprint (" -v, --version print cygrunsrv program version number, then exit."); Index: utils.h =================================================================== RCS file: /cvs/cygwin-apps/cygrunsrv/utils.h,v retrieving revision 1.8 diff -u -p -r1.8 utils.h --- utils.h 11 Mar 2002 11:56:42 -0000 1.8 +++ utils.h 9 May 2003 13:51:43 -0000 @@ -52,6 +52,8 @@ enum reason_t { OnlyOneIO, ShutdownNotAllowed, OnlyOneShutdown, + InteractiveNotAllowed, + OnlyOneInteractive, TrailingArgs, StartAsSvcErr, InstallErr,