cron allowed to interact with desktop ?
Igor Pechtchanski
pechtcha@cs.nyu.edu
Fri May 9 13:58:00 GMT 2003
On Fri, 9 May 2003, Corinna Vinschen wrote:
> On Thu, May 08, 2003 at 04:48:29PM -0400, Igor Pechtchanski wrote:
> > Also, please thoughtfully consider the attached patch for cygrunsrv... ;-)
> > Igor
>
> I do. Thanks for the patch, it looks good. However, I can't apply it
> cleanly to the current version from CVS, even with patch'es -l option.
>
> Would you mind to create a new patch relative to current CVS?
>
> Thanks,
> Corinna
Corinna,
Yeah, I was still working off the 0.95-1 sources... Thanks for prompting
me to get off my lazy ass and get the CVS version checked out.
FWIW, the previous patch failed because of a new flag (-Q) in CVS.
New patch attached. Same ChangeLog.
Igor
--
http://cs.nyu.edu/~pechtcha/
|\ _,,,---,,_ pechtcha@cs.nyu.edu
ZZZzz /,`.-'`' -. ;-;;,_ igor@watson.ibm.com
|,4- ) )-,_. ,\ ( `'-' Igor Pechtchanski
'---''(_/--' `-'\_) fL a.k.a JaguaR-R-R-r-r-r-.-.-. Meow!
Knowledge is an unending adventure at the edge of uncertainty.
-- Leto II
-------------- next part --------------
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 <file> Optional output file used for stderr redirection.");
uprint (" Default is /var/log/<svc_name>.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,
-------------- next part --------------
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Problem reports: http://cygwin.com/problems.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
More information about the Cygwin
mailing list