125 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include <dlfcn.h>
 | |
| #include "my_application.h"
 | |
| 
 | |
| #define RUSTDESK_LIB_PATH "librustdesk.so"
 | |
| typedef bool (*RustDeskCoreMain)();
 | |
| bool gIsConnectionManager = false;
 | |
| 
 | |
| void print_help_install_pkg(const char* so);
 | |
| 
 | |
| bool flutter_rustdesk_core_main() {
 | |
|    void* librustdesk = dlopen(RUSTDESK_LIB_PATH, RTLD_LAZY);
 | |
|    if (!librustdesk) {
 | |
|       fprintf(stderr,"Failed to load \"librustdesk.so\"\n");
 | |
|       char* error;
 | |
|       if ((error = dlerror()) != nullptr) {
 | |
|         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);
 | |
|         }
 | |
|       }
 | |
|      return false;
 | |
|    }
 | |
|    auto core_main = (RustDeskCoreMain) dlsym(librustdesk,"rustdesk_core_main");
 | |
|    char* error;
 | |
|    if ((error = dlerror()) != nullptr) {
 | |
|        fprintf(stderr, "Program entry \"rustdesk_core_main\" is not found: %s\n", error);
 | |
|        return false;
 | |
|    }
 | |
|    return core_main();
 | |
| }
 | |
| 
 | |
| int main(int argc, char** argv) {
 | |
|   if (!flutter_rustdesk_core_main()) {
 | |
|       return 0;
 | |
|   }
 | |
|   for (int i = 0; i < argc; i++) {
 | |
|     if (strcmp(argv[i], "--cm") == 0) {
 | |
|       gIsConnectionManager = true;
 | |
|     }
 | |
|   }
 | |
|   g_autoptr(MyApplication) app = my_application_new();
 | |
|   return g_application_run(G_APPLICATION(app), argc, argv);
 | |
| }
 | |
| 
 | |
| 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++;
 | |
|   }
 | |
| }
 |