Only in cygrunsrv-1.0-1: config.cache Only in cygrunsrv-1.0-1: config.log Only in cygrunsrv-1.0-1: config.status Only in cygrunsrv-1.0-1: crit.o diff -cr cygrunsrv-1.0-1.orig/cygrunsrv.cc cygrunsrv-1.0-1/cygrunsrv.cc *** cygrunsrv-1.0-1.orig/cygrunsrv.cc 2004-04-18 13:10:08.000000000 +0200 --- cygrunsrv-1.0-1/cygrunsrv.cc 2004-09-29 17:41:12.000000000 +0200 *************** *** 69,74 **** --- 69,75 ---- { "shutdown", no_argument, NULL, 'o' }, { "interactive", no_argument, NULL, 'i' }, { "nohide", no_argument, NULL, 'j' }, + { "recovery", required_argument, NULL, 'r' }, { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'v' }, { 0, no_argument, NULL, 0 } *************** *** 97,102 **** --- 98,104 ---- "n" "i" "j" + "r" "h" "v"; *************** *** 126,131 **** --- 128,141 ---- Manual }; + enum recovery_t { + NoRecovery, + None, + Reboot, + Restart, + RunCommand + }; + struct env_t { char *name; *************** *** 159,165 **** /* Installs the subkeys of the service registry entry so that cygrunsrv can determine what application to start on service startup. */ 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 neverexits, --- 169,175 ---- /* Installs the subkeys of the service registry entry so that cygrunsrv can determine what application to start on service startup. */ int ! install_registry_keys (const char *name, 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 neverexits, *************** *** 167,189 **** { HKEY srv_key = NULL; HKEY env_key = NULL; - HKEY desc_key = NULL; DWORD disp; char reg_key[MAX_PATH]; char *err_func; DWORD err = 0; strcat (strcpy (reg_key, SRV_KEY), name); - if (desc) - { - if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, reg_key, 0, - KEY_ALL_ACCESS, &desc_key) != ERROR_SUCCESS) - err_out (RegOpenKeyEx); - if (RegSetValueEx (desc_key, DESC, 0, REG_SZ, - (const BYTE *) desc, strlen (desc) + 1) != ERROR_SUCCESS) - err_out (RegSetValueEx); - RegFlushKey (desc_key); - } strcat (reg_key, PARAM_KEY); if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, reg_key, 0, "", --- 177,188 ---- *************** *** 258,265 **** out: if (env_key) RegCloseKey (env_key); - if (desc_key) - RegCloseKey (desc_key); if (srv_key) RegCloseKey (srv_key); return err == 0 ? 0 : error (InstallErr, err_func, err); --- 257,262 ---- *************** *** 550,557 **** /* 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, int interactive) { char mypath[MAX_PATH]; SC_HANDLE sm = (SC_HANDLE) 0; --- 547,554 ---- /* Installs cygrunsrv as service `name' with display name `disp'. */ int ! install_service (const char *name, const char *disp, const char *desc, type_t type, ! char *user, char *pass, char **deps, int interactive, recovery_t recovery) { char mypath[MAX_PATH]; SC_HANDLE sm = (SC_HANDLE) 0; *************** *** 668,673 **** --- 665,713 ---- username, username ? pass ?: "" : NULL))) err_out (CreateService); + if (desc) + { + /* Enter service description */ + SERVICE_DESCRIPTION sd; + sd.lpDescription = (LPTSTR) desc; + if (!ChangeServiceConfig2 (sh, SERVICE_CONFIG_DESCRIPTION, &sd)) + err_out (ChangeServiceConfig2); + } + + if (recovery) + { + /* Add recovery action(s) */ + SERVICE_FAILURE_ACTIONS sfa; + SC_ACTION sca; + switch (recovery) + { + case Reboot: + sca.Type = SC_ACTION_REBOOT; + break; + case Restart: + sca.Type = SC_ACTION_RESTART; + break; + #if 0 + case RunCommand: + sca.Type = SC_ACTION_RUN_COMMAND; + break; + #else + case None: + default: + sca.Type = SC_ACTION_NONE; + break; + #endif + } + sca.Delay = 0; /* Time to wait before performing action, in milliseconds*/ + sfa.dwResetPeriod = 0; + sfa.lpRebootMsg = NULL; /* don't change reboot message */ + sfa.lpCommand = NULL; /* don't change command */ + sfa.cActions = 1; + sfa.lpsaActions = &sca; + if (!ChangeServiceConfig2 (sh, SERVICE_CONFIG_FAILURE_ACTIONS, &sfa)) + err_out (ChangeServiceConfig2); + } + out: if (pass == buf) while (*pass) *************** *** 1364,1369 **** --- 1404,1410 ---- int in_shutdown = 0; int in_interactive = 0; int in_showcons = 0; + recovery_t in_recovery = NoRecovery; appname = argv[0]; *************** *** 1556,1561 **** --- 1597,1620 ---- return error (OnlyOneIO); in_stderr = optarg; break; + case 'r': + if (action != Install) + return error (IONotAllowed); + if (in_recovery != NoRecovery) + return error (OnlyOneRecovery); + if (!strcasecmp (optarg, "n") || !strcasecmp (optarg, "none")) + in_recovery = None; + else if (!strcasecmp (optarg, "b") || !strcasecmp (optarg, "boot")) + in_recovery = Reboot; + else if (!strcasecmp (optarg, "r") || !strcasecmp (optarg, "restart")) + in_recovery = Restart; + #if 0 + else if (!strcasecmp (optarg, "c") || !strcasecmp (optarg, "command")) + in_recovery = RunCommand; + #endif + else + return error (InvalidRecovery); + break; case 'h': return usage (); case 'v': *************** *** 1576,1587 **** in_disp = in_name; if (in_type == NoType) 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, 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_neverexits, in_shutdown, --- 1635,1648 ---- in_disp = in_name; if (in_type == NoType) in_type = Auto; + if (in_recovery == NoRecovery) + in_recovery = None; if (!is_executable (in_path)) return error (InvalidPath); ! if (ret = install_service (in_name, in_disp, in_desc, in_type, in_user, in_pass, ! in_deps, in_interactive, in_recovery)) return ret; ! if (ret = install_registry_keys (in_name, in_path, in_args, in_dir, in_env, in_termsig, in_stdin, in_stdout, in_stderr, in_neverexits, in_shutdown, Only in cygrunsrv-1.0-1: cygrunsrv.exe Only in cygrunsrv-1.0-1: cygrunsrv.o Only in cygrunsrv-1.0-1: Makefile diff -cr cygrunsrv-1.0-1.orig/utils.cc cygrunsrv-1.0-1/utils.cc *** cygrunsrv-1.0-1.orig/utils.cc 2004-04-07 16:06:05.000000000 +0200 --- cygrunsrv-1.0-1/utils.cc 2004-09-29 17:23:05.000000000 +0200 *************** *** 53,58 **** --- 53,60 ---- "--type is only allowed with --install", "Only one --type is allowed", "Invalid type, only `a[uto]' or `m[anual]' are vaild.", + "Only one --recovery is allowed", + "Invalid recovery, only `n[none]' or `b[boot]' or `r[estart]' are vaild.", "--termsig is only allowed with --install", "Only one --termsig is allowed", "Invalid signal; must be number or name like INT, QUIT, TERM, etc.", *************** *** 153,158 **** --- 155,161 ---- uprint (" -f, --desc Optional string which contains the service"); uprint (" description."); uprint (" -t, --type [auto|manual] Optional start type of service. Defaults to `auto'."); + uprint (" -r, --recovery [none|boot|restart] Optional recovery type of service. Defaults to `none'."); uprint (" -u, --user Optional user name to start service as."); uprint (" Defaults to SYSTEM account."); uprint (" -w, --passwd Optional password for user. Only needed"); diff -cr cygrunsrv-1.0-1.orig/utils.h cygrunsrv-1.0-1/utils.h *** cygrunsrv-1.0-1.orig/utils.h 2004-04-07 16:06:05.000000000 +0200 --- cygrunsrv-1.0-1/utils.h 2004-09-29 16:23:45.000000000 +0200 *************** *** 44,49 **** --- 44,51 ---- TypeNotAllowed, OnlyOneType, InvalidType, + OnlyOneRecovery, + InvalidRecovery, SigNotAllowed, OnlyOneSig, InvalidSig, Only in cygrunsrv-1.0-1: utils.o