ga_install_service(): nest error paths more idiomatically
Acked-by: Michael Roth <mdroth@linux.vnet.ibm.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Laszlo Ersek <lersek@redhat.com> Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
This commit is contained in:
		
							parent
							
								
									af0bbf8eb8
								
							
						
					
					
						commit
						bb31546dfa
					
				| 
						 | 
					@ -38,10 +38,12 @@ static int printf_win_error(const char *text)
 | 
				
			||||||
int ga_install_service(const char *path, const char *logfile,
 | 
					int ga_install_service(const char *path, const char *logfile,
 | 
				
			||||||
                       const char *state_dir)
 | 
					                       const char *state_dir)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    int ret = EXIT_FAILURE;
 | 
				
			||||||
    SC_HANDLE manager;
 | 
					    SC_HANDLE manager;
 | 
				
			||||||
    SC_HANDLE service;
 | 
					    SC_HANDLE service;
 | 
				
			||||||
    TCHAR module_fname[MAX_PATH];
 | 
					    TCHAR module_fname[MAX_PATH];
 | 
				
			||||||
    GString *cmdline;
 | 
					    GString *cmdline;
 | 
				
			||||||
 | 
					    SERVICE_DESCRIPTION desc = { (char *)QGA_SERVICE_DESCRIPTION };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (GetModuleFileName(NULL, module_fname, MAX_PATH) == 0) {
 | 
					    if (GetModuleFileName(NULL, module_fname, MAX_PATH) == 0) {
 | 
				
			||||||
        printf_win_error("No full path to service's executable");
 | 
					        printf_win_error("No full path to service's executable");
 | 
				
			||||||
| 
						 | 
					@ -66,28 +68,28 @@ int ga_install_service(const char *path, const char *logfile,
 | 
				
			||||||
    manager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
 | 
					    manager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
 | 
				
			||||||
    if (manager == NULL) {
 | 
					    if (manager == NULL) {
 | 
				
			||||||
        printf_win_error("No handle to service control manager");
 | 
					        printf_win_error("No handle to service control manager");
 | 
				
			||||||
        g_string_free(cmdline, TRUE);
 | 
					        goto out_strings;
 | 
				
			||||||
        return EXIT_FAILURE;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    service = CreateService(manager, QGA_SERVICE_NAME, QGA_SERVICE_DISPLAY_NAME,
 | 
					    service = CreateService(manager, QGA_SERVICE_NAME, QGA_SERVICE_DISPLAY_NAME,
 | 
				
			||||||
        SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START,
 | 
					        SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START,
 | 
				
			||||||
        SERVICE_ERROR_NORMAL, cmdline->str, NULL, NULL, NULL, NULL, NULL);
 | 
					        SERVICE_ERROR_NORMAL, cmdline->str, NULL, NULL, NULL, NULL, NULL);
 | 
				
			||||||
 | 
					    if (service == NULL) {
 | 
				
			||||||
    if (service) {
 | 
					 | 
				
			||||||
        SERVICE_DESCRIPTION desc = { (char *)QGA_SERVICE_DESCRIPTION };
 | 
					 | 
				
			||||||
        ChangeServiceConfig2(service, SERVICE_CONFIG_DESCRIPTION, &desc);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        fprintf(stderr, "Service was installed successfully.\n");
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        printf_win_error("Failed to install service");
 | 
					        printf_win_error("Failed to install service");
 | 
				
			||||||
 | 
					        goto out_manager;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ChangeServiceConfig2(service, SERVICE_CONFIG_DESCRIPTION, &desc);
 | 
				
			||||||
 | 
					    fprintf(stderr, "Service was installed successfully.\n");
 | 
				
			||||||
 | 
					    ret = EXIT_SUCCESS;
 | 
				
			||||||
    CloseServiceHandle(service);
 | 
					    CloseServiceHandle(service);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					out_manager:
 | 
				
			||||||
    CloseServiceHandle(manager);
 | 
					    CloseServiceHandle(manager);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					out_strings:
 | 
				
			||||||
    g_string_free(cmdline, TRUE);
 | 
					    g_string_free(cmdline, TRUE);
 | 
				
			||||||
    return (service == NULL);
 | 
					    return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int ga_uninstall_service(void)
 | 
					int ga_uninstall_service(void)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue