2022-05-30 10:33:30 +03:00
# include <dlfcn.h>
2022-05-23 11:25:55 +03:00
# include "my_application.h"
2022-09-08 07:20:33 +03:00
# define RUSTDESK_LIB_PATH "librustdesk.so"
2022-05-30 10:33:30 +03:00
typedef bool ( * RustDeskCoreMain ) ( ) ;
2022-11-27 11:56:02 +03:00
bool gIsConnectionManager = false ;
2022-05-30 10:33:30 +03:00
2024-05-04 09:07:29 +03:00
void print_help_install_pkg ( const char * so ) ;
2022-05-30 10:33:30 +03:00
bool flutter_rustdesk_core_main ( ) {
void * librustdesk = dlopen ( RUSTDESK_LIB_PATH , RTLD_LAZY ) ;
if ( ! librustdesk ) {
2024-05-04 09:07:29 +03:00
fprintf ( stderr , " Failed to load \" librustdesk.so \" \n " ) ;
2024-04-29 13:00:34 +03:00
char * error ;
if ( ( error = dlerror ( ) ) ! = nullptr ) {
2024-05-04 09:07:29 +03: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 13:00:34 +03:00
}
2024-05-04 09:07:29 +03:00
return false ;
2022-05-30 10:33:30 +03:00
}
auto core_main = ( RustDeskCoreMain ) dlsym ( librustdesk , " rustdesk_core_main " ) ;
char * error ;
if ( ( error = dlerror ( ) ) ! = nullptr ) {
2024-05-04 09:07:29 +03:00
fprintf ( stderr , " Program entry \" rustdesk_core_main \" is not found: %s \n " , error ) ;
return false ;
2022-05-30 10:33:30 +03:00
}
return core_main ( ) ;
}
2022-05-23 11:25:55 +03:00
int main ( int argc , char * * argv ) {
2022-05-30 10:33:30 +03:00
if ( ! flutter_rustdesk_core_main ( ) ) {
return 0 ;
}
2022-11-27 11:56:02 +03:00
for ( int i = 0 ; i < argc ; i + + ) {
if ( strcmp ( argv [ i ] , " --cm " ) = = 0 ) {
gIsConnectionManager = true ;
}
}
2022-05-23 11:25:55 +03:00
g_autoptr ( MyApplication ) app = my_application_new ( ) ;
return g_application_run ( G_APPLICATION ( app ) , argc , argv ) ;
}
2024-05-04 09:07:29 +03: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 + + ;
}
}