X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Flibvlc.c;h=7a2bce9a272f83a8a23629116f5ba5378d0e94d1;hb=65113f55d63c9995b9ec781e75d531a9bd20d848;hp=07937d6c99505d28e3c928ec540a501188a4e07d;hpb=a27a45508085160f814823a2792234d9b16a30b1;p=vlc diff --git a/src/libvlc.c b/src/libvlc.c index 07937d6c99..7a2bce9a27 100644 --- a/src/libvlc.c +++ b/src/libvlc.c @@ -43,7 +43,6 @@ #include "modules/modules.h" #include "config/configuration.h" -#include /* ENOMEM */ #include /* sprintf() */ #include #include /* free() */ @@ -277,7 +276,6 @@ libvlc_int_t * libvlc_InternalCreate( void ) /* Initialize mutexes */ vlc_mutex_init( &priv->timer_lock ); - vlc_cond_init( &priv->exiting ); return p_libvlc; } @@ -329,7 +327,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, return VLC_EGENERIC; } - priv->i_verbose = config_GetInt( p_libvlc, "verbose" ); + priv->i_verbose = var_InheritInteger( p_libvlc, "verbose" ); /* Announce who we are - Do it only for first instance ? */ msg_Dbg( p_libvlc, "%s", COPYRIGHT_MESSAGE ); msg_Dbg( p_libvlc, "libvlc was configured with %s", CONFIGURE_LINE ); @@ -337,14 +335,14 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, msg_Dbg( p_libvlc, "translation test: code is \"%s\"", _("C") ); /* Check for short help option */ - if( config_GetInt( p_libvlc, "help" ) > 0 ) + if( var_InheritBool( p_libvlc, "help" ) ) { Help( p_libvlc, "help" ); b_exit = true; i_ret = VLC_EEXITSUCCESS; } /* Check for version option */ - else if( config_GetInt( p_libvlc, "version" ) > 0 ) + else if( var_InheritBool( p_libvlc, "version" ) ) { Version(); b_exit = true; @@ -352,11 +350,11 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, } /* Check for plugins cache options */ - bool b_cache_delete = config_GetInt( p_libvlc, "reset-plugins-cache" ) > 0; + bool b_cache_delete = var_InheritBool( p_libvlc, "reset-plugins-cache" ); /* Check for daemon mode */ #ifndef WIN32 - if( config_GetInt( p_libvlc, "daemon" ) > 0 ) + if( var_InheritBool( p_libvlc, "daemon" ) ) { #ifdef HAVE_DAEMON char *psz_pidfile = NULL; @@ -432,10 +430,10 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, /* This ain't really nice to have to reload the config here but it seems * the only way to do it. */ - if( !config_GetInt( p_libvlc, "ignore-config" ) ) + if( !var_InheritBool( p_libvlc, "ignore-config" ) ) config_LoadConfigFile( p_libvlc, "main" ); config_LoadCmdLine( p_libvlc, &i_argc, ppsz_argv, true ); - priv->i_verbose = config_GetInt( p_libvlc, "verbose" ); + priv->i_verbose = var_InheritInteger( p_libvlc, "verbose" ); /* Check if the user specified a custom language */ psz_language = var_CreateGetNonEmptyString( p_libvlc, "language" ); @@ -449,10 +447,10 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, module_EndBank( p_libvlc, false ); module_InitBank( p_libvlc ); - if( !config_GetInt( p_libvlc, "ignore-config" ) ) + if( !var_InheritBool( p_libvlc, "ignore-config" ) ) config_LoadConfigFile( p_libvlc, "main" ); config_LoadCmdLine( p_libvlc, &i_argc, ppsz_argv, true ); - priv->i_verbose = config_GetInt( p_libvlc, "verbose" ); + priv->i_verbose = var_InheritInteger( p_libvlc, "verbose" ); } free( psz_language ); # endif @@ -475,14 +473,8 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, module_list_free( list ); msg_Dbg( p_libvlc, "module bank initialized (%zu modules)", module_count ); - if( module_count <= 1) - { - msg_Err( p_libvlc, "No modules were found, refusing to start. Check " - "that you properly gave a module path with --plugin-path."); - abort(); - } /* Check for help on modules */ - if( (p_tmp = var_CreateGetNonEmptyString( p_libvlc, "module" )) ) + if( (p_tmp = var_InheritString( p_libvlc, "module" )) ) { Help( p_libvlc, p_tmp ); free( p_tmp ); @@ -490,7 +482,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, i_ret = VLC_EEXITSUCCESS; } /* Check for full help option */ - else if( config_GetInt( p_libvlc, "full-help" ) > 0 ) + else if( var_InheritBool( p_libvlc, "full-help" ) ) { config_PutInt( p_libvlc, "advanced", 1); config_PutInt( p_libvlc, "help-verbose", 1); @@ -499,20 +491,20 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, i_ret = VLC_EEXITSUCCESS; } /* Check for long help option */ - else if( config_GetInt( p_libvlc, "longhelp" ) > 0 ) + else if( var_InheritBool( p_libvlc, "longhelp" ) ) { Help( p_libvlc, "longhelp" ); b_exit = true; i_ret = VLC_EEXITSUCCESS; } /* Check for module list option */ - else if( config_GetInt( p_libvlc, "list" ) > 0 ) + else if( var_InheritBool( p_libvlc, "list" ) ) { ListModules( p_libvlc, false ); b_exit = true; i_ret = VLC_EEXITSUCCESS; } - else if( config_GetInt( p_libvlc, "list-verbose" ) > 0 ) + else if( var_InheritBool( p_libvlc, "list-verbose" ) ) { ListModules( p_libvlc, true ); b_exit = true; @@ -520,20 +512,22 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, } /* Check for config file options */ - if( !config_GetInt( p_libvlc, "ignore-config" ) ) + if( !var_InheritBool( p_libvlc, "ignore-config" ) ) { - if( config_GetInt( p_libvlc, "reset-config" ) > 0 ) + if( var_InheritBool( p_libvlc, "reset-config" ) ) { config_ResetAll( p_libvlc ); config_LoadCmdLine( p_libvlc, &i_argc, ppsz_argv, true ); config_SaveConfigFile( p_libvlc, NULL ); } - if( config_GetInt( p_libvlc, "save-config" ) > 0 ) - { - config_LoadConfigFile( p_libvlc, NULL ); - config_LoadCmdLine( p_libvlc, &i_argc, ppsz_argv, true ); - config_SaveConfigFile( p_libvlc, NULL ); - } + } + + if( module_count <= 1) + { + msg_Err( p_libvlc, "No modules were found, refusing to start. Check " + "that you properly gave a module path with --plugin-path."); + b_exit = true; + i_ret = VLC_ENOITEM; } if( b_exit ) @@ -545,7 +539,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, /* * Override default configuration with config file settings */ - if( !config_GetInt( p_libvlc, "ignore-config" ) ) + if( !var_InheritBool( p_libvlc, "ignore-config" ) ) config_LoadConfigFile( p_libvlc, NULL ); /* @@ -563,7 +557,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, module_EndBank( p_libvlc, true ); return VLC_EGENERIC; } - priv->i_verbose = config_GetInt( p_libvlc, "verbose" ); + priv->i_verbose = var_InheritInteger( p_libvlc, "verbose" ); /* * System specific configuration @@ -574,9 +568,9 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, #ifdef HAVE_DBUS dbus_threads_init_default(); - if( config_GetInt( p_libvlc, "one-instance" ) > 0 - || ( config_GetInt( p_libvlc, "one-instance-when-started-from-file" ) - && config_GetInt( p_libvlc, "started-from-file" ) ) ) + if( var_InheritBool( p_libvlc, "one-instance" ) + || ( var_InheritBool( p_libvlc, "one-instance-when-started-from-file" ) + && var_InheritBool( p_libvlc, "started-from-file" ) ) ) { /* Initialise D-Bus interface, check for other instances */ DBusConnection *p_conn = NULL; @@ -649,7 +643,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, exit( 1 ); } b_play = TRUE; - if( config_GetInt( p_libvlc, "playlist-enqueue" ) > 0 ) + if( var_InheritBool( p_libvlc, "playlist-enqueue" ) ) b_play = FALSE; if ( !dbus_message_iter_append_basic( &dbus_args, DBUS_TYPE_BOOLEAN, &b_play ) ) @@ -723,7 +717,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, /* Last chance to set the verbosity. Once we start interfaces and other * threads, verbosity becomes read-only. */ var_Create( p_libvlc, "verbose", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); - if( config_GetInt( p_libvlc, "quiet" ) > 0 ) + if( var_InheritBool( p_libvlc, "quiet" ) ) { var_SetInteger( p_libvlc, "verbose", -1 ); priv->i_verbose = -1; @@ -731,7 +725,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, vlc_threads_setup( p_libvlc ); if( priv->b_color ) - priv->b_color = config_GetInt( p_libvlc, "color" ) > 0; + priv->b_color = var_InheritBool( p_libvlc, "color" ); char p_capabilities[200]; #define PRINT_CAPABILITY( capability, string ) \ @@ -744,23 +738,23 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, p_capabilities[0] = '\0'; #if defined( __i386__ ) || defined( __x86_64__ ) - if( !config_GetInt( p_libvlc, "mmx" ) ) + if( !var_InheritBool( p_libvlc, "mmx" ) ) cpu_flags &= ~CPU_CAPABILITY_MMX; - if( !config_GetInt( p_libvlc, "3dn" ) ) + if( !var_InheritBool( p_libvlc, "3dn" ) ) cpu_flags &= ~CPU_CAPABILITY_3DNOW; - if( !config_GetInt( p_libvlc, "mmxext" ) ) + if( !var_InheritBool( p_libvlc, "mmxext" ) ) cpu_flags &= ~CPU_CAPABILITY_MMXEXT; - if( !config_GetInt( p_libvlc, "sse" ) ) + if( !var_InheritBool( p_libvlc, "sse" ) ) cpu_flags &= ~CPU_CAPABILITY_SSE; - if( !config_GetInt( p_libvlc, "sse2" ) ) + if( !var_InheritBool( p_libvlc, "sse2" ) ) cpu_flags &= ~CPU_CAPABILITY_SSE2; - if( !config_GetInt( p_libvlc, "sse3" ) ) + if( !var_InheritBool( p_libvlc, "sse3" ) ) cpu_flags &= ~CPU_CAPABILITY_SSE3; - if( !config_GetInt( p_libvlc, "ssse3" ) ) + if( !var_InheritBool( p_libvlc, "ssse3" ) ) cpu_flags &= ~CPU_CAPABILITY_SSSE3; - if( !config_GetInt( p_libvlc, "sse41" ) ) + if( !var_InheritBool( p_libvlc, "sse41" ) ) cpu_flags &= ~CPU_CAPABILITY_SSE4_1; - if( !config_GetInt( p_libvlc, "sse42" ) ) + if( !var_InheritBool( p_libvlc, "sse42" ) ) cpu_flags &= ~CPU_CAPABILITY_SSE4_2; PRINT_CAPABILITY( CPU_CAPABILITY_MMX, "MMX" ); @@ -769,13 +763,13 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, PRINT_CAPABILITY( CPU_CAPABILITY_SSE, "SSE" ); PRINT_CAPABILITY( CPU_CAPABILITY_SSE2, "SSE2" ); PRINT_CAPABILITY( CPU_CAPABILITY_SSE3, "SSE3" ); - PRINT_CAPABILITY( CPU_CAPABILITY_SSE3, "SSSE3" ); + PRINT_CAPABILITY( CPU_CAPABILITY_SSSE3, "SSSE3" ); PRINT_CAPABILITY( CPU_CAPABILITY_SSE4_1, "SSE4.1" ); PRINT_CAPABILITY( CPU_CAPABILITY_SSE4_2, "SSE4.2" ); PRINT_CAPABILITY( CPU_CAPABILITY_SSE4A, "SSE4A" ); #elif defined( __powerpc__ ) || defined( __ppc__ ) || defined( __ppc64__ ) - if( !config_GetInt( p_libvlc, "altivec" ) ) + if( !var_InheritBool( p_libvlc, "altivec" ) ) cpu_flags &= ~CPU_CAPABILITY_ALTIVEC; PRINT_CAPABILITY( CPU_CAPABILITY_ALTIVEC, "AltiVec" ); @@ -791,7 +785,8 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, p_capabilities[sizeof(p_capabilities) - 1] = '\0'; #endif - msg_Dbg( p_libvlc, "CPU has capabilities %s", p_capabilities ); + if (p_capabilities[0]) + msg_Dbg( p_libvlc, "CPU has capabilities %s", p_capabilities ); /* * Choose the best memcpy module @@ -800,7 +795,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, /* Avoid being called "memcpy":*/ vlc_object_set_name( p_libvlc, "main" ); - priv->b_stats = config_GetInt( p_libvlc, "stats" ) > 0; + priv->b_stats = var_InheritBool( p_libvlc, "stats" ); priv->i_timers = 0; priv->pp_timers = NULL; @@ -809,27 +804,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, /* * Initialize hotkey handling */ - var_Create( p_libvlc, "key-pressed", VLC_VAR_INTEGER ); - var_Create( p_libvlc, "key-action", VLC_VAR_INTEGER ); - { - struct hotkey *p_keys = - malloc( (libvlc_actions_count + 1) * sizeof (*p_keys) ); - - /* Initialize from configuration */ - for( size_t i = 0; i < libvlc_actions_count; i++ ) - { - p_keys[i].psz_action = libvlc_actions[i].name; - p_keys[i].i_key = config_GetInt( p_libvlc, - libvlc_actions[i].name ); - p_keys[i].i_action = libvlc_actions[i].value; - } - p_keys[libvlc_actions_count].psz_action = NULL; - p_keys[libvlc_actions_count].i_key = 0; - p_keys[libvlc_actions_count].i_action = 0; - p_libvlc->p_hotkeys = p_keys; - var_AddCallback( p_libvlc, "key-pressed", vlc_key_to_action, - p_keys ); - } + vlc_InitActions( p_libvlc ); /* variables for signalling creation of new files */ var_Create( p_libvlc, "snapshot-file", VLC_VAR_STRING ); @@ -877,7 +852,8 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, */ /* Create volume callback system. (this variable must be created before all interfaces as they can use it) */ - var_Create( p_libvlc, "volume-change", VLC_VAR_BOOL ); + var_Create( p_libvlc, "volume-change", VLC_VAR_VOID ); + var_Create( p_libvlc, "volume-muted", VLC_VAR_BOOL ); psz_modules = var_CreateGetNonEmptyString( p_libvlc, "extraintf" ); psz_control = var_CreateGetNonEmptyString( p_libvlc, "control" ); @@ -925,26 +901,26 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, #ifdef HAVE_DBUS /* loads dbus control interface if in one-instance mode * we do it only when playlist exists, because dbus module needs it */ - if( config_GetInt( p_libvlc, "one-instance" ) > 0 - || ( config_GetInt( p_libvlc, "one-instance-when-started-from-file" ) - && config_GetInt( p_libvlc, "started-from-file" ) ) ) + if( var_InheritBool( p_libvlc, "one-instance" ) + || ( var_InheritBool( p_libvlc, "one-instance-when-started-from-file" ) + && var_InheritBool( p_libvlc, "started-from-file" ) ) ) intf_Create( p_libvlc, "dbus,none" ); # if !defined (HAVE_MAEMO) /* Prevents the power management daemon from suspending the system * when VLC is active */ - if( config_GetInt( p_libvlc, "inhibit" ) > 0 ) + if( var_InheritBool( p_libvlc, "inhibit" ) > 0 ) intf_Create( p_libvlc, "inhibit,none" ); # endif #endif - if( (config_GetInt( p_libvlc, "file-logging" ) > 0) && - !config_GetInt( p_libvlc, "syslog" ) ) + if( var_InheritBool( p_libvlc, "file-logging" ) && + !var_InheritBool( p_libvlc, "syslog" ) ) { intf_Create( p_libvlc, "logger,none" ); } #ifdef HAVE_SYSLOG_H - if( config_GetInt( p_libvlc, "syslog" ) > 0 ) + if( var_InheritBool( p_libvlc, "syslog" ) ) { char *logmode = var_CreateGetNonEmptyString( p_libvlc, "logmode" ); var_SetString( p_libvlc, "logmode", "syslog" ); @@ -959,13 +935,13 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, } #endif - if( config_GetInt( p_libvlc, "network-synchronisation") > 0 ) + if( var_InheritBool( p_libvlc, "network-synchronisation") ) { intf_Create( p_libvlc, "netsync,none" ); } #ifdef WIN32 - if( config_GetInt( p_libvlc, "prefer-system-codecs") > 0 ) + if( var_InheritBool( p_libvlc, "prefer-system-codecs") ) { char *psz_codecs = var_CreateGetNonEmptyString( p_playlist, "codec" ); if( psz_codecs ) @@ -1008,8 +984,8 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, /* * Get --open argument */ - psz_val = var_CreateGetString( p_libvlc, "open" ); - if ( psz_val != NULL && *psz_val ) + psz_val = var_CreateGetNonEmptyString( p_libvlc, "open" ); + if ( psz_val != NULL ) { playlist_t *p_playlist = pl_Hold( p_libvlc ); playlist_AddExt( p_playlist, psz_val, NULL, PLAYLIST_INSERT, 0, @@ -1093,9 +1069,7 @@ void libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) /* Free module bank. It is refcounted, so we call this each time */ module_EndBank( p_libvlc, true ); - var_DelCallback( p_libvlc, "key-pressed", vlc_key_to_action, - (void *)p_libvlc->p_hotkeys ); - free( (void *)p_libvlc->p_hotkeys ); + vlc_DeinitActions( p_libvlc ); } /** @@ -1122,7 +1096,6 @@ void libvlc_InternalDestroy( libvlc_int_t *p_libvlc ) msg_Destroy( p_libvlc ); /* Destroy mutexes */ - vlc_cond_destroy( &priv->exiting ); vlc_mutex_destroy( &priv->timer_lock ); #ifndef NDEBUG /* Hack to dump leaked objects tree */ @@ -1160,6 +1133,7 @@ int libvlc_InternalAddIntf( libvlc_int_t *p_libvlc, char const *psz_module ) "Use 'cvlc' to use vlc without interface.") ); } free( psz_interface ); + var_Destroy( p_libvlc, "intf" ); } /* Try to create the interface */ @@ -1167,11 +1141,18 @@ int libvlc_InternalAddIntf( libvlc_int_t *p_libvlc, char const *psz_module ) if( ret ) msg_Err( p_libvlc, "interface \"%s\" initialization failed", psz_module ? psz_module : "default" ); - var_Destroy( p_libvlc, "intf" ); return ret; } +#ifndef WIN32 static vlc_mutex_t exit_lock = VLC_STATIC_MUTEX; +static vlc_cond_t exiting = VLC_STATIC_COND; +#else +extern vlc_mutex_t super_mutex; +extern vlc_cond_t super_variable; +# define exit_lock super_mutex +# define exiting super_variable +#endif /** * Waits until the LibVLC instance gets an exit signal. Normally, this happens @@ -1179,11 +1160,9 @@ static vlc_mutex_t exit_lock = VLC_STATIC_MUTEX; */ void libvlc_InternalWait( libvlc_int_t *p_libvlc ) { - libvlc_priv_t *priv = libvlc_priv( p_libvlc ); - vlc_mutex_lock( &exit_lock ); while( vlc_object_alive( p_libvlc ) ) - vlc_cond_wait( &priv->exiting, &exit_lock ); + vlc_cond_wait( &exiting, &exit_lock ); vlc_mutex_unlock( &exit_lock ); } @@ -1193,11 +1172,9 @@ void libvlc_InternalWait( libvlc_int_t *p_libvlc ) */ void libvlc_Quit( libvlc_int_t *p_libvlc ) { - libvlc_priv_t *priv = libvlc_priv( p_libvlc ); - vlc_mutex_lock( &exit_lock ); vlc_object_kill( p_libvlc ); - vlc_cond_signal( &priv->exiting ); + vlc_cond_broadcast( &exiting ); vlc_mutex_unlock( &exit_lock ); } @@ -1242,11 +1219,16 @@ static inline int LoadMessages (void) static const char psz_path[] = LOCALEDIR; #else char psz_path[1024]; - if (snprintf (psz_path, sizeof (psz_path), "%s" DIR_SEP "%s", - config_GetDataDir(), "locale") - >= (int)sizeof (psz_path)) - return -1; + char *datadir = config_GetDataDirDefault(); + int ret; + if (unlikely(datadir == NULL)) + return -1; + ret = snprintf (psz_path, sizeof (psz_path), "%s" DIR_SEP "locale", + datadir); + free (datadir); + if (ret >= (int)sizeof (psz_path)) + return -1; #endif if (bindtextdomain (PACKAGE_NAME, psz_path) == NULL) { @@ -1458,10 +1440,10 @@ static void Usage( libvlc_int_t *p_this, char const *psz_search ) char psz_short[4]; int i_width = ConsoleWidth() - (PADDING_SPACES+LINE_START+1); int i_width_description = i_width + PADDING_SPACES - 1; - bool b_advanced = config_GetInt( p_this, "advanced" ) > 0; - bool b_description = config_GetInt( p_this, "help-verbose" ) > 0; + bool b_advanced = var_InheritBool( p_this, "advanced" ); + bool b_description = var_InheritBool( p_this, "help-verbose" ); bool b_description_hack; - bool b_color = config_GetInt( p_this, "color" ) > 0; + bool b_color = var_InheritBool( p_this, "color" ); bool b_has_advanced = false; bool b_found = false; int i_only_advanced = 0; /* Number of modules ignored because they @@ -1914,10 +1896,14 @@ static void ListModules( libvlc_int_t *p_this, bool b_verbose ) { module_t *p_parser; - bool b_color = config_GetInt( p_this, "color" ) > 0; + bool b_color = var_InheritBool( p_this, "color" ); #ifdef WIN32 ShowConsole( true ); + b_color = false; // don't put color control codes in a .txt file +#else + if( !isatty( 1 ) ) + b_color = false; #endif /* List all modules */ @@ -1985,8 +1971,8 @@ static void Version( void ) utf8_fprintf( stdout, _("VLC version %s (%s)\n"), VLC_Version(), psz_vlc_changeset ); - utf8_fprintf( stdout, _("Compiled by %s@%s.%s\n"), - VLC_CompileBy(), VLC_CompileHost(), VLC_CompileDomain() ); + utf8_fprintf( stdout, _("Compiled by %s on %s (%s)\n"), + VLC_CompileBy(), VLC_CompileHost(), __DATE__" "__TIME__ ); utf8_fprintf( stdout, _("Compiler: %s\n"), VLC_Compiler() ); utf8_fprintf( stdout, "%s", LICENSE_MSG );