| 
									
										
										
										
											2022-05-30 15:33:30 +08:00
										 |  |  | #include <dlfcn.h>
 | 
					
						
							| 
									
										
										
										
											2022-05-23 16:25:55 +08:00
										 |  |  | #include "my_application.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 12:20:33 +08:00
										 |  |  | #define RUSTDESK_LIB_PATH "librustdesk.so"
 | 
					
						
							| 
									
										
										
										
											2022-05-30 15:33:30 +08:00
										 |  |  | typedef bool (*RustDeskCoreMain)(); | 
					
						
							| 
									
										
										
										
											2022-11-27 16:56:02 +08:00
										 |  |  | bool gIsConnectionManager = false; | 
					
						
							| 
									
										
										
										
											2022-05-30 15:33:30 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-04 14:07:29 +08:00
										 |  |  | void print_help_install_pkg(const char* so); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-30 15:33:30 +08:00
										 |  |  | bool flutter_rustdesk_core_main() { | 
					
						
							|  |  |  |    void* librustdesk = dlopen(RUSTDESK_LIB_PATH, RTLD_LAZY); | 
					
						
							|  |  |  |    if (!librustdesk) { | 
					
						
							| 
									
										
										
										
											2024-05-04 14:07:29 +08:00
										 |  |  |       fprintf(stderr,"Failed to load \"librustdesk.so\"\n"); | 
					
						
							| 
									
										
										
										
											2024-04-29 18:00:34 +08:00
										 |  |  |       char* error; | 
					
						
							|  |  |  |       if ((error = dlerror()) != nullptr) { | 
					
						
							| 
									
										
										
										
											2024-05-04 14:07:29 +08:00
										 |  |  |         fprintf(stderr, "%s\n", error); | 
					
						
							|  |  |  |         char* libmissed = strstr(error, ": cannot open shared object file: No such file or directory"); | 
					
						
							|  |  |  |         if (libmissed != nullptr) { | 
					
						
							|  |  |  |           *libmissed = '\0'; | 
					
						
							|  |  |  |           char* so = strdup(error); | 
					
						
							|  |  |  |           print_help_install_pkg(so); | 
					
						
							|  |  |  |           free(so); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-04-29 18:00:34 +08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2024-05-04 14:07:29 +08:00
										 |  |  |      return false; | 
					
						
							| 
									
										
										
										
											2022-05-30 15:33:30 +08:00
										 |  |  |    } | 
					
						
							|  |  |  |    auto core_main = (RustDeskCoreMain) dlsym(librustdesk,"rustdesk_core_main"); | 
					
						
							|  |  |  |    char* error; | 
					
						
							|  |  |  |    if ((error = dlerror()) != nullptr) { | 
					
						
							| 
									
										
										
										
											2024-05-04 14:07:29 +08:00
										 |  |  |        fprintf(stderr, "Program entry \"rustdesk_core_main\" is not found: %s\n", error); | 
					
						
							|  |  |  |        return false; | 
					
						
							| 
									
										
										
										
											2022-05-30 15:33:30 +08:00
										 |  |  |    } | 
					
						
							|  |  |  |    return core_main(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-23 16:25:55 +08:00
										 |  |  | int main(int argc, char** argv) { | 
					
						
							| 
									
										
										
										
											2022-05-30 15:33:30 +08:00
										 |  |  |   if (!flutter_rustdesk_core_main()) { | 
					
						
							|  |  |  |       return 0; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-11-27 16:56:02 +08:00
										 |  |  |   for (int i = 0; i < argc; i++) { | 
					
						
							|  |  |  |     if (strcmp(argv[i], "--cm") == 0) { | 
					
						
							|  |  |  |       gIsConnectionManager = true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-05-23 16:25:55 +08:00
										 |  |  |   g_autoptr(MyApplication) app = my_application_new(); | 
					
						
							|  |  |  |   return g_application_run(G_APPLICATION(app), argc, argv); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-05-04 14:07:29 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | typedef struct { | 
					
						
							|  |  |  |   const char* mgr; | 
					
						
							|  |  |  |   const char* search; | 
					
						
							|  |  |  | } PkgMgrSearch; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const PkgMgrSearch g_mgrs[] = { | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     "apt", | 
					
						
							|  |  |  |     "apt-file search", | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     "dnf", | 
					
						
							|  |  |  |     "dnf provides", | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     "yum", | 
					
						
							|  |  |  |     "yum provides", | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     "zypper", | 
					
						
							|  |  |  |     "zypper wp", | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     "pacman", | 
					
						
							|  |  |  |     "pacman -Qo", | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int is_command_exists(const char* command) { | 
					
						
							|  |  |  |     char* path = getenv("PATH"); | 
					
						
							|  |  |  |     char* path_copy = strdup(path); | 
					
						
							|  |  |  |     char* dir = strtok(path_copy, ":"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while (dir != NULL) { | 
					
						
							|  |  |  |         char command_path[256]; | 
					
						
							|  |  |  |         snprintf(command_path, sizeof(command_path), "%s/%s", dir, command); | 
					
						
							|  |  |  |         if (access(command_path, X_OK) == 0) { | 
					
						
							|  |  |  |             free(path_copy); | 
					
						
							|  |  |  |             return 1; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         dir = strtok(NULL, ":"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     free(path_copy); | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // We do not automatically search pkg 
 | 
					
						
							|  |  |  | // as the search process can be time consuming and update may be required.
 | 
					
						
							|  |  |  | void print_help_install_pkg(const char* so) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   if (strcmp(so, "libnsl.so.1") == 0) { | 
					
						
							|  |  |  |     const char* mgr[] = {"yum", "dnf", NULL}; | 
					
						
							|  |  |  |     const char** m = mgr; | 
					
						
							|  |  |  |     while (*m != NULL) { | 
					
						
							|  |  |  |       if (is_command_exists(*m)) { | 
					
						
							|  |  |  |         fprintf(stderr, "Please run \"%s install libnsl\" to install the required package.\n", *m); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       m++; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const PkgMgrSearch *mgr_search = g_mgrs; | 
					
						
							|  |  |  |   while (mgr_search->mgr != NULL) { | 
					
						
							|  |  |  |       if (is_command_exists(mgr_search->mgr) == 1) { | 
					
						
							|  |  |  |         fprintf(stderr, "Please run \"%s %s\" to search and install the pkg.\n", mgr_search->search, so); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       mgr_search++; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |