DirectResult voodoo_config_set( const char *name, const char *value ) { if (strcmp (name, "player-name" ) == 0) { if (value) { direct_snputs( voodoo_config->play_info.name, value, VOODOO_PLAYER_NAME_LENGTH ); } else { D_ERROR( "Voodoo/Config '%s': No value specified!\n", name ); return DR_INVARG; } } else if (strcmp (name, "player-vendor" ) == 0) { if (value) { direct_snputs( voodoo_config->play_info.vendor, value, VOODOO_PLAYER_VENDOR_LENGTH ); } else { D_ERROR( "Voodoo/Config '%s': No value specified!\n", name ); return DR_INVARG; } } else if (strcmp (name, "player-model" ) == 0) { if (value) { direct_snputs( voodoo_config->play_info.model, value, VOODOO_PLAYER_MODEL_LENGTH ); } else { D_ERROR( "Voodoo/Config '%s': No value specified!\n", name ); return DR_INVARG; } } else if (strcmp (name, "player-uuid" ) == 0) { if (value) { sscanf( value, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", (unsigned int*)&voodoo_config->play_info.uuid[0], (unsigned int*)&voodoo_config->play_info.uuid[1], (unsigned int*)&voodoo_config->play_info.uuid[2], (unsigned int*)&voodoo_config->play_info.uuid[3], (unsigned int*)&voodoo_config->play_info.uuid[4], (unsigned int*)&voodoo_config->play_info.uuid[5], (unsigned int*)&voodoo_config->play_info.uuid[6], (unsigned int*)&voodoo_config->play_info.uuid[7], (unsigned int*)&voodoo_config->play_info.uuid[8], (unsigned int*)&voodoo_config->play_info.uuid[9], (unsigned int*)&voodoo_config->play_info.uuid[10], (unsigned int*)&voodoo_config->play_info.uuid[11], (unsigned int*)&voodoo_config->play_info.uuid[12], (unsigned int*)&voodoo_config->play_info.uuid[13], (unsigned int*)&voodoo_config->play_info.uuid[14], (unsigned int*)&voodoo_config->play_info.uuid[15] ); } else { D_ERROR( "Voodoo/Config '%s': No value specified!\n", name ); return DR_INVARG; } } else if (strcmp (name, "proxy-memory-max" ) == 0) { if (value) { unsigned int max; if (direct_sscanf( value, "%u", &max ) != 1) { D_ERROR( "Voodoo/Config '%s': Invalid value specified!\n", name ); return DR_INVARG; } voodoo_config->memory_max = max * 1024; } else { D_ERROR( "Voodoo/Config '%s': No value specified!\n", name ); return DR_INVARG; } } else if (strcmp (name, "proxy-surface-max" ) == 0) { if (value) { unsigned int max; if (direct_sscanf( value, "%u", &max ) != 1) { D_ERROR( "Voodoo/Config '%s': Invalid value specified!\n", name ); return DR_INVARG; } voodoo_config->surface_max = max * 1024; } else { D_ERROR( "Voodoo/Config '%s': No value specified!\n", name ); return DR_INVARG; } } else if (strcmp (name, "proxy-layer-mask" ) == 0) { if (value) { unsigned int mask; if (direct_sscanf( value, "%u", &mask ) != 1) { D_ERROR( "Voodoo/Config '%s': Invalid value specified!\n", name ); return DR_INVARG; } voodoo_config->layer_mask = mask; } else { D_ERROR( "Voodoo/Config '%s': No value specified!\n", name ); return DR_INVARG; } } else if (strcmp (name, "proxy-stacking-mask" ) == 0) { if (value) { unsigned int mask; if (direct_sscanf( value, "%u", &mask ) != 1) { D_ERROR( "Voodoo/Config '%s': Invalid value specified!\n", name ); return DR_INVARG; } voodoo_config->stacking_mask = mask; } else { D_ERROR( "Voodoo/Config '%s': No value specified!\n", name ); return DR_INVARG; } } else if (strcmp (name, "proxy-resource-id" ) == 0) { if (value) { unsigned int resource_id; if (direct_sscanf( value, "%u", &resource_id ) != 1) { D_ERROR( "Voodoo/Config '%s': Invalid value specified!\n", name ); return DR_INVARG; } voodoo_config->resource_id = resource_id; } else { D_ERROR( "Voodoo/Config '%s': No value specified!\n", name ); return DR_INVARG; } } else if (strcmp (name, "server-fork" ) == 0) { voodoo_config->server_fork = true; } else if (strcmp (name, "no-server-fork" ) == 0) { voodoo_config->server_fork = false; } else if (strcmp (name, "server-single" ) == 0) { if (value) { if (voodoo_config->server_single) D_FREE( voodoo_config->server_single ); voodoo_config->server_single = D_STRDUP( value ); if (!voodoo_config->server_single) D_OOM(); } else { D_ERROR( "Voodoo/Config '%s': No value specified!\n", name ); return DR_INVARG; } } else if (strcmp (name, "play-broadcast" ) == 0) { if (value) { if (voodoo_config->play_broadcast) D_FREE( voodoo_config->play_broadcast ); voodoo_config->play_broadcast = D_STRDUP( value ); if (!voodoo_config->play_broadcast) D_OOM(); } else { D_ERROR( "Voodoo/Config '%s': No value specified!\n", name ); return DR_INVARG; } } else if (strcmp (name, "compression-min" ) == 0) { if (value) { unsigned int min; if (direct_sscanf( value, "%u", &min ) != 1) { D_ERROR( "Voodoo/Config '%s': Invalid value specified!\n", name ); return DR_INVARG; } voodoo_config->compression_min = min; } else { D_ERROR( "Voodoo/Config '%s': No value specified!\n", name ); return DR_INVARG; } } else if (strcmp (name, "link-raw" ) == 0) { voodoo_config->link_raw = true; } else if (strcmp (name, "no-link-raw" ) == 0) { voodoo_config->link_raw = false; } else if (strcmp (name, "link-packet" ) == 0) { voodoo_config->link_packet = true; } else if (strcmp (name, "no-link-packet" ) == 0) { voodoo_config->link_packet = false; } else return DR_UNSUPPORTED; return DR_OK; }
DirectResult direct_config_set( const char *name, const char *value ) { if (direct_strcmp (name, "disable-module" ) == 0) { if (value) { int n = 0; while (direct_config->disable_module && direct_config->disable_module[n]) n++; direct_config->disable_module = (char**) D_REALLOC( direct_config->disable_module, sizeof(char*) * (n + 2) ); direct_config->disable_module[n] = D_STRDUP( value ); direct_config->disable_module[n+1] = NULL; } else { D_ERROR("Direct/Config '%s': No module name specified!\n", name); return DR_INVARG; } } else if (direct_strcmp (name, "module-dir" ) == 0) { if (value) { if (direct_config->module_dir) D_FREE( direct_config->module_dir ); direct_config->module_dir = D_STRDUP( value ); } else { D_ERROR("Direct/Config 'module-dir': No directory name specified!\n"); return DR_INVARG; } } else if (direct_strcmp (name, "memcpy" ) == 0) { if (value) { if (direct_config->memcpy) D_FREE( direct_config->memcpy ); direct_config->memcpy = D_STRDUP( value ); } else { D_ERROR("Direct/Config '%s': No method specified!\n", name); return DR_INVARG; } } else if (direct_strcmp (name, "quiet" ) == 0 || strcmp (name, "no-quiet" ) == 0) { /* Enable/disable all at once by default. */ DirectMessageType type = DMT_ALL; /* Find out the specific message type being configured. */ if (value) { if (!strcmp( value, "info" )) type = DMT_INFO; else if (!strcmp( value, "warning" )) type = DMT_WARNING; else if (!strcmp( value, "error" )) type = DMT_ERROR; else if (!strcmp( value, "once" )) type = DMT_ONCE; else if (!strcmp( value, "untested" )) type = DMT_UNTESTED; else if (!strcmp( value, "unimplemented" )) type = DMT_UNIMPLEMENTED; else { D_ERROR( "DirectFB/Config '%s': Unknown message type '%s'!\n", name, value ); return DR_INVARG; } } /* Set/clear the corresponding flag in the configuration. */ if (name[0] == 'q') D_FLAGS_SET( direct_config->quiet, type ); else D_FLAGS_CLEAR( direct_config->quiet, type ); } else if (direct_strcmp (name, "no-quiet" ) == 0) { direct_config->quiet = DMT_NONE; } else if (direct_strcmp (name, "debug" ) == 0) { if (value) { DirectLogDomainConfig config = {0}; if (value[0] && value[1] == ':') { config.level = value[0] - '0' + DIRECT_LOG_DEBUG_0; value += 2; } else config.level = DIRECT_LOG_DEBUG; direct_log_domain_configure( value, &config ); } else if (direct_config->log_level < DIRECT_LOG_DEBUG) direct_config->log_level = DIRECT_LOG_DEBUG; } else if (direct_strcmp (name, "no-debug" ) == 0) { if (value) { DirectLogDomainConfig config = {0}; config.level = DIRECT_LOG_DEBUG_0; direct_log_domain_configure( value, &config ); } else if (direct_config->log_level > DIRECT_LOG_DEBUG_0) direct_config->log_level = DIRECT_LOG_DEBUG_0; } else if (direct_strcmp (name, "log-all" ) == 0) { direct_config->log_all = true; } else if (direct_strcmp (name, "log-none" ) == 0) { direct_config->log_none = true; } else if (direct_strcmp (name, "debugmem" ) == 0) { direct_config->debugmem = true; } else if (direct_strcmp (name, "no-debugmem" ) == 0) { direct_config->debugmem = false; } else if (direct_strcmp (name, "trace" ) == 0) { direct_config->trace = true; } else if (direct_strcmp (name, "no-trace" ) == 0) { direct_config->trace = false; } else if (direct_strcmp (name, "log-file" ) == 0 || strcmp (name, "log-udp" ) == 0) { if (value) { DirectResult ret; DirectLog *log; ret = direct_log_create( strcmp(name,"log-udp") ? DLT_FILE : DLT_UDP, value, &log ); if (ret) return ret; if (direct_config->log) direct_log_destroy( direct_config->log ); direct_config->log = log; direct_log_set_default( log ); } else { if (direct_strcmp(name,"log-udp")) D_ERROR("Direct/Config '%s': No file name specified!\n", name); else D_ERROR("Direct/Config '%s': No host and port specified!\n", name); return DR_INVARG; } } else if (direct_strcmp (name, "fatal-level" ) == 0) { if (direct_strcasecmp (value, "none" ) == 0) { direct_config->fatal = DCFL_NONE; } else if (direct_strcasecmp (value, "assert" ) == 0) { direct_config->fatal = DCFL_ASSERT; } else if (direct_strcasecmp (value, "assume" ) == 0) { direct_config->fatal = DCFL_ASSUME; } else { D_ERROR("Direct/Config '%s': Unknown level specified (use 'none', 'assert', 'assume')!\n", name); return DR_INVARG; } } else if (direct_strcmp (name, "fatal-break" ) == 0) { direct_config->fatal_break = true; } else if (direct_strcmp (name, "no-fatal-break" ) == 0) { direct_config->fatal_break = false; } else if (direct_strcmp (name, "sighandler" ) == 0) { direct_config->sighandler = true; } else if (direct_strcmp (name, "no-sighandler" ) == 0) { direct_config->sighandler = false; } else if (direct_strcmp (name, "dont-catch" ) == 0) { if (value) { char *signals = D_STRDUP( value ); char *p = NULL, *r, *s = signals; while ((r = direct_strtok_r( s, ",", &p ))) { char *error; unsigned long signum; direct_trim( &r ); signum = direct_strtoul( r, &error, 10 ); if (*error) { D_ERROR( "Direct/Config '%s': Error in number at '%s'!\n", name, error ); D_FREE( signals ); return DR_INVARG; } sigaddset( &direct_config->dont_catch, signum ); s = NULL; } D_FREE( signals ); } else { D_ERROR("Direct/Config '%s': No signals specified!\n", name); return DR_INVARG; } } else if (direct_strcmp (name, "thread_block_signals") == 0) { direct_config->thread_block_signals = true; } else if (direct_strcmp (name, "no-thread_block_signals") == 0) { direct_config->thread_block_signals = false; } else if (direct_strcmp (name, "thread-priority-scale" ) == 0) { if (value) { int scale; if (direct_sscanf( value, "%d", &scale ) < 1) { D_ERROR("Direct/Config '%s': Could not parse value!\n", name); return DR_INVARG; } direct_config->thread_priority_scale = scale; } else { D_ERROR("Direct/Config '%s': No value specified!\n", name); return DR_INVARG; } } else if (direct_strcmp (name, "thread-priority" ) == 0) { /* Must be moved to lib/direct/conf.c in trunk! */ if (value) { int priority; if (direct_sscanf( value, "%d", &priority ) < 1) { D_ERROR("Direct/Config '%s': Could not parse value!\n", name); return DR_INVARG; } direct_config->thread_priority = priority; } else { D_ERROR("Direct/Config '%s': No value specified!\n", name); return DR_INVARG; } } else if (direct_strcmp (name, "thread-scheduler" ) == 0) { /* Must be moved to lib/direct/conf.c in trunk! */ if (value) { if (direct_strcmp( value, "other" ) == 0) { direct_config->thread_scheduler = DCTS_OTHER; } else if (direct_strcmp( value, "fifo" ) == 0) { direct_config->thread_scheduler = DCTS_FIFO; } else if (direct_strcmp( value, "rr" ) == 0) { direct_config->thread_scheduler = DCTS_RR; } else { D_ERROR( "Direct/Config '%s': Unknown scheduler '%s'!\n", name, value ); return DR_INVARG; } } else { D_ERROR( "Direct/Config '%s': No value specified!\n", name ); return DR_INVARG; } } else if (direct_strcmp (name, "thread-stacksize" ) == 0) { /* Must be moved to lib/direct/conf.c in trunk! */ if (value) { int size; if (direct_sscanf( value, "%d", &size ) < 1) { D_ERROR( "Direct/Config '%s': Could not parse value!\n", name ); return DR_INVARG; } direct_config->thread_stack_size = size; } else { D_ERROR( "Direct/Config '%s': No value specified!\n", name ); return DR_INVARG; } } else return DR_UNSUPPORTED; return DR_OK; }