bool TransformationCalculator::get_moving_joints_transforms(std::vector<base::samples::RigidBodyState>& transforms, bool keep_content) { if(!keep_content) transforms.clear(); std::vector<base::samples::RigidBodyState> v = extract_values(static_joints_transforms_); transforms.insert(transforms.end(), v.begin(), v.end()); return true; }
int main() { char new_url[140]; scanf("%s",&new_url); init_url(new_url); filter_url(); extract_parameters(); extract_values(); print(); return 0; }
ColorEntity::ColorEntity( const char* name, const ParamArray& params) : Entity(g_class_uid, params) , impl(new Impl()) { set_name(name); extract_parameters(); extract_values(); check_validity(); }
static int extract_interrupt_other(char *buffer, int ncolumns, int nlines) { char *name, *end, *values; int resize = (nlines >= other_count); name = extract_interrupt_name(buffer, &values); if (resize && !extend_interrupts(&interrupt_other, &other_count)) return 0; end = extract_values(values, interrupt_other[nlines].values, ncolumns); if (resize) initialise_interrupt(&interrupt_other[nlines], nlines, name, end); return 1; }
static int extract_interrupt_lines(char *buffer, int ncolumns, int nlines) { unsigned long id; char *name, *end, *values; int resize = (nlines >= lines_count); name = extract_interrupt_name(buffer, &values); id = strtoul(name, &end, 10); if (*end != '\0') return 0; if (resize && !extend_interrupts(&interrupt_lines, &lines_count)) return 0; end = extract_values(values, interrupt_lines[nlines].values, ncolumns); if (resize) initialise_interrupt(&interrupt_lines[nlines], id, name, end); return 1; }
/****************************************************************************** * * ******************************************************************************/ static int get_entry(FILE *f, NML_Entry *entry, char *name) { char *r = trim_buf_name(name); entry->name = strdup(name); entry->type = 0; entry->seen = 0; entry->count = 0; entry->data = NULL; do { extract_values(entry, r); if ( (r = readline(f, buf) ) ) { if ( strcmp(buf, "/") == 0 ) return 1; } else return -1; } while ( strchr(buf, '=') == NULL ); return 0; }
/* Parse/validate 'run as user' commands */ static int validate_run_as_user_commands(int argc, char **argv, int *operation) { /* We need at least the following arguments in order to proceed further : <user>, <yarn-user> <command> - i.e at argc should be at least 4 */ if (argc < 4) { display_usage(stdout); return INVALID_ARGUMENT_NUMBER; } cmd_input.run_as_user_name = argv[optind++]; cmd_input.yarn_user_name = argv[optind++]; int command = atoi(argv[optind++]); fprintf(LOGFILE, "main : command provided %d\n", command); fprintf(LOGFILE, "main : run as user is %s\n", cmd_input.run_as_user_name); fprintf(LOGFILE, "main : requested yarn user is %s\n", cmd_input.yarn_user_name); fflush(LOGFILE); char * resources = NULL;// key,value pair describing resources char * resources_key = NULL; char * resources_value = NULL; switch (command) { case INITIALIZE_CONTAINER: if (argc < 9) { fprintf(ERRORFILE, "Too few arguments (%d vs 9) for initialize container\n", argc); fflush(ERRORFILE); return INVALID_ARGUMENT_NUMBER; } cmd_input.app_id = argv[optind++]; cmd_input.cred_file = argv[optind++]; cmd_input.local_dirs = argv[optind++];// good local dirs as a comma separated list cmd_input.log_dirs = argv[optind++];// good log dirs as a comma separated list *operation = RUN_AS_USER_INITIALIZE_CONTAINER; return 0; case LAUNCH_DOCKER_CONTAINER: //kill me now. if (!(argc == 14 || argc == 15)) { fprintf(ERRORFILE, "Wrong number of arguments (%d vs 14 or 15) for launch docker container\n", argc); fflush(ERRORFILE); return INVALID_ARGUMENT_NUMBER; } cmd_input.app_id = argv[optind++]; cmd_input.container_id = argv[optind++]; cmd_input.current_dir = argv[optind++]; cmd_input.script_file = argv[optind++]; cmd_input.cred_file = argv[optind++]; cmd_input.pid_file = argv[optind++]; cmd_input.local_dirs = argv[optind++];// good local dirs as a comma separated list cmd_input.log_dirs = argv[optind++];// good log dirs as a comma separated list cmd_input.docker_command_file = argv[optind++]; resources = argv[optind++];// key,value pair describing resources resources_key = malloc(strlen(resources)); resources_value = malloc(strlen(resources)); if (get_kv_key(resources, resources_key, strlen(resources)) < 0 || get_kv_value(resources, resources_value, strlen(resources)) < 0) { fprintf(ERRORFILE, "Invalid arguments for cgroups resources: %s", resources); fflush(ERRORFILE); free(resources_key); free(resources_value); return INVALID_ARGUMENT_NUMBER; } //network isolation through tc if (argc == 15) { cmd_input.traffic_control_command_file = argv[optind++]; } cmd_input.resources_key = resources_key; cmd_input.resources_value = resources_value; cmd_input.resources_values = extract_values(resources_value); *operation = RUN_AS_USER_LAUNCH_DOCKER_CONTAINER; return 0; case LAUNCH_CONTAINER: //kill me now. if (!(argc == 13 || argc == 14)) { fprintf(ERRORFILE, "Wrong number of arguments (%d vs 13 or 14) for launch container\n", argc); fflush(ERRORFILE); return INVALID_ARGUMENT_NUMBER; } cmd_input.app_id = argv[optind++]; cmd_input.container_id = argv[optind++]; cmd_input.current_dir = argv[optind++]; cmd_input.script_file = argv[optind++]; cmd_input.cred_file = argv[optind++]; cmd_input.pid_file = argv[optind++]; cmd_input.local_dirs = argv[optind++];// good local dirs as a comma separated list cmd_input.log_dirs = argv[optind++];// good log dirs as a comma separated list resources = argv[optind++];// key,value pair describing resources resources_key = malloc(strlen(resources)); resources_value = malloc(strlen(resources)); if (get_kv_key(resources, resources_key, strlen(resources)) < 0 || get_kv_value(resources, resources_value, strlen(resources)) < 0) { fprintf(ERRORFILE, "Invalid arguments for cgroups resources: %s", resources); fflush(ERRORFILE); free(resources_key); free(resources_value); return INVALID_ARGUMENT_NUMBER; } //network isolation through tc if (argc == 14) { cmd_input.traffic_control_command_file = argv[optind++]; } cmd_input.resources_key = resources_key; cmd_input.resources_value = resources_value; cmd_input.resources_values = extract_values(resources_value); *operation = RUN_AS_USER_LAUNCH_CONTAINER; return 0; case SIGNAL_CONTAINER: if (argc != 6) { fprintf(ERRORFILE, "Wrong number of arguments (%d vs 6) for " \ "signal container\n", argc); fflush(ERRORFILE); return INVALID_ARGUMENT_NUMBER; } char* end_ptr = NULL; char* option = argv[optind++]; cmd_input.container_pid = strtol(option, &end_ptr, 10); if (option == end_ptr || *end_ptr != '\0') { fprintf(ERRORFILE, "Illegal argument for container pid %s\n", option); fflush(ERRORFILE); return INVALID_ARGUMENT_NUMBER; } option = argv[optind++]; cmd_input.signal = strtol(option, &end_ptr, 10); if (option == end_ptr || *end_ptr != '\0') { fprintf(ERRORFILE, "Illegal argument for signal %s\n", option); fflush(ERRORFILE); return INVALID_ARGUMENT_NUMBER; } *operation = RUN_AS_USER_SIGNAL_CONTAINER; return 0; case DELETE_AS_USER: cmd_input.dir_to_be_deleted = argv[optind++]; *operation = RUN_AS_USER_DELETE; return 0; default: fprintf(ERRORFILE, "Invalid command %d not supported.",command); fflush(ERRORFILE); return INVALID_COMMAND_PROVIDED; } }
int main(int argc, char **argv) { int invalid_args = 0; int do_check_setup = 0; int do_mount_cgroups = 0; LOGFILE = stdout; ERRORFILE = stderr; if (argc > 1) { if (strcmp("--mount-cgroups", argv[1]) == 0) { do_mount_cgroups = 1; } } // Minimum number of arguments required to run // the std. container-executor commands is 4 // 4 args not needed for checksetup option if (argc < 4 && !do_mount_cgroups) { invalid_args = 1; if (argc == 2) { const char *arg1 = argv[1]; if (strcmp("--checksetup", arg1) == 0) { invalid_args = 0; do_check_setup = 1; } } } if (invalid_args != 0) { display_usage(stdout); return INVALID_ARGUMENT_NUMBER; } int command; const char * app_id = NULL; const char * container_id = NULL; const char * cred_file = NULL; const char * script_file = NULL; const char * current_dir = NULL; const char * pid_file = NULL; int exit_code = 0; char * dir_to_be_deleted = NULL; char *executable_file = get_executable(); char *orig_conf_file = HADOOP_CONF_DIR "/" CONF_FILENAME; char *conf_file = resolve_config_path(orig_conf_file, argv[0]); char *local_dirs, *log_dirs; char *resources, *resources_key, *resources_value; if (conf_file == NULL) { fprintf(ERRORFILE, "Configuration file %s not found.\n", orig_conf_file); exit(INVALID_CONFIG_FILE); } if (check_configuration_permissions(conf_file) != 0) { exit(INVALID_CONFIG_FILE); } read_config(conf_file); free(conf_file); // look up the node manager group in the config file char *nm_group = get_value(NM_GROUP_KEY); if (nm_group == NULL) { fprintf(ERRORFILE, "Can't get configured value for %s.\n", NM_GROUP_KEY); exit(INVALID_CONFIG_FILE); } struct group *group_info = getgrnam(nm_group); if (group_info == NULL) { fprintf(ERRORFILE, "Can't get group information for %s - %s.\n", nm_group, strerror(errno)); fflush(LOGFILE); exit(INVALID_CONFIG_FILE); } set_nm_uid(getuid(), group_info->gr_gid); // if we are running from a setuid executable, make the real uid root setuid(0); // set the real and effective group id to the node manager group setgid(group_info->gr_gid); if (check_executor_permissions(executable_file) != 0) { fprintf(ERRORFILE, "Invalid permissions on container-executor binary.\n"); return INVALID_CONTAINER_EXEC_PERMISSIONS; } if (do_check_setup != 0) { // basic setup checks done // verified configs available and valid // verified executor permissions return 0; } if (do_mount_cgroups) { optind++; char *hierarchy = argv[optind++]; int result = 0; while (optind < argc && result == 0) { result = mount_cgroup(argv[optind++], hierarchy); } return result; } //checks done for user name if (argv[optind] == NULL) { fprintf(ERRORFILE, "Invalid user name.\n"); return INVALID_USER_NAME; } int ret = set_user(argv[optind]); if (ret != 0) { return ret; } // this string is used for building pathnames, the // process management is done based on the 'user_detail' // global, which was set by 'set_user()' above optind = optind + 1; char *yarn_user_name = argv[optind]; if (yarn_user_name == NULL) { fprintf(ERRORFILE, "Invalid yarn user name.\n"); return INVALID_USER_NAME; } optind = optind + 1; command = atoi(argv[optind++]); fprintf(LOGFILE, "main : command provided %d\n",command); fprintf(LOGFILE, "main : user is %s\n", user_detail->pw_name); fprintf(LOGFILE, "main : requested yarn user is %s\n", yarn_user_name); fflush(LOGFILE); switch (command) { case INITIALIZE_CONTAINER: if (argc < 9) { fprintf(ERRORFILE, "Too few arguments (%d vs 9) for initialize container\n", argc); fflush(ERRORFILE); return INVALID_ARGUMENT_NUMBER; } app_id = argv[optind++]; cred_file = argv[optind++]; local_dirs = argv[optind++];// good local dirs as a comma separated list log_dirs = argv[optind++];// good log dirs as a comma separated list exit_code = initialize_app(yarn_user_name, app_id, cred_file, extract_values(local_dirs), extract_values(log_dirs), argv + optind); break; case LAUNCH_CONTAINER: if (argc != 13) { fprintf(ERRORFILE, "Wrong number of arguments (%d vs 13) for launch container\n", argc); fflush(ERRORFILE); return INVALID_ARGUMENT_NUMBER; } app_id = argv[optind++]; container_id = argv[optind++]; current_dir = argv[optind++]; script_file = argv[optind++]; cred_file = argv[optind++]; pid_file = argv[optind++]; local_dirs = argv[optind++];// good local dirs as a comma separated list log_dirs = argv[optind++];// good log dirs as a comma separated list resources = argv[optind++];// key,value pair describing resources char *resources_key = malloc(strlen(resources)); char *resources_value = malloc(strlen(resources)); if (get_kv_key(resources, resources_key, strlen(resources)) < 0 || get_kv_value(resources, resources_value, strlen(resources)) < 0) { fprintf(ERRORFILE, "Invalid arguments for cgroups resources: %s", resources); fflush(ERRORFILE); free(resources_key); free(resources_value); return INVALID_ARGUMENT_NUMBER; } char** resources_values = extract_values(resources_value); exit_code = launch_container_as_user(yarn_user_name, app_id, container_id, current_dir, script_file, cred_file, pid_file, extract_values(local_dirs), extract_values(log_dirs), resources_key, resources_values); free(resources_key); free(resources_value); break; case SIGNAL_CONTAINER: if (argc != 6) { fprintf(ERRORFILE, "Wrong number of arguments (%d vs 6) for " \ "signal container\n", argc); fflush(ERRORFILE); return INVALID_ARGUMENT_NUMBER; } else { char* end_ptr = NULL; char* option = argv[optind++]; int container_pid = strtol(option, &end_ptr, 10); if (option == end_ptr || *end_ptr != '\0') { fprintf(ERRORFILE, "Illegal argument for container pid %s\n", option); fflush(ERRORFILE); return INVALID_ARGUMENT_NUMBER; } option = argv[optind++]; int signal = strtol(option, &end_ptr, 10); if (option == end_ptr || *end_ptr != '\0') { fprintf(ERRORFILE, "Illegal argument for signal %s\n", option); fflush(ERRORFILE); return INVALID_ARGUMENT_NUMBER; } exit_code = signal_container_as_user(yarn_user_name, container_pid, signal); } break; case DELETE_AS_USER: dir_to_be_deleted = argv[optind++]; exit_code= delete_as_user(yarn_user_name, dir_to_be_deleted, argv + optind); break; default: fprintf(ERRORFILE, "Invalid command %d not supported.",command); fflush(ERRORFILE); exit_code = INVALID_COMMAND_PROVIDED; } fclose(LOGFILE); fclose(ERRORFILE); return exit_code; }
// This test is expected to be executed either by a regular // user or by root. If executed by a regular user it doesn't // test all the functions that would depend on changing the // effective user id. If executed by a super-user everything // gets tested. Here are different ways of execing the test binary: // 1. regular user assuming user == yarn user // $ test-container-executor // 2. regular user with a given yarn user // $ test-container-executor yarn_user // 3. super user with a given user and assuming user == yarn user // # test-container-executor user // 4. super user with a given user and a given yarn user // # test-container-executor user yarn_user int main(int argc, char **argv) { LOGFILE = stdout; ERRORFILE = stderr; // clean up any junk from previous run if (system("chmod -R u=rwx " TEST_ROOT "; rm -fr " TEST_ROOT)) { exit(1); } if (mkdirs(TEST_ROOT "/logs/userlogs", 0755) != 0) { exit(1); } if (write_config_file(TEST_ROOT "/test.cfg", 1) != 0) { exit(1); } read_config(TEST_ROOT "/test.cfg"); local_dirs = extract_values(strdup(NM_LOCAL_DIRS)); log_dirs = extract_values(strdup(NM_LOG_DIRS)); create_nm_roots(local_dirs); // See the description above of various ways this test // can be executed in order to understand the following logic char* current_username = strdup(getpwuid(getuid())->pw_name); if (getuid() == 0 && (argc == 2 || argc == 3)) { username = argv[1]; yarn_username = (argc == 3) ? argv[2] : argv[1]; } else { username = current_username; yarn_username = (argc == 2) ? argv[1] : current_username; } set_nm_uid(geteuid(), getegid()); if (set_user(username)) { exit(1); } printf("\nStarting tests\n"); printf("\nTesting resolve_config_path()\n"); test_resolve_config_path(); printf("\nTesting get_user_directory()\n"); test_get_user_directory(); printf("\nTesting get_app_directory()\n"); test_get_app_directory(); printf("\nTesting get_container_directory()\n"); test_get_container_directory(); printf("\nTesting get_container_launcher_file()\n"); test_get_container_launcher_file(); printf("\nTesting get_app_log_dir()\n"); test_get_app_log_dir(); test_check_configuration_permissions(); printf("\nTesting delete_container()\n"); test_delete_container(); printf("\nTesting delete_app()\n"); test_delete_app(); test_check_user(0); // the tests that change user need to be run in a subshell, so that // when they change user they don't give up our privs run_test_in_child("test_signal_container", test_signal_container); run_test_in_child("test_signal_container_group", test_signal_container_group); // init app and run container can't be run if you aren't testing as root if (getuid() == 0) { // these tests do internal forks so that the change_owner and execs // don't mess up our process. test_init_app(); test_run_container(); } seteuid(0); // test_delete_user must run as root since that's how we use the delete_as_user test_delete_user(); free_configurations(); printf("\nTrying banned default user()\n"); if (write_config_file(TEST_ROOT "/test.cfg", 0) != 0) { exit(1); } read_config(TEST_ROOT "/test.cfg"); username = "******"; test_check_user(1); username = "******"; test_check_user(1); run("rm -fr " TEST_ROOT); printf("\nFinished tests\n"); free(current_username); free_configurations(); return 0; }
void test_init_app() { printf("\nTesting init app\n"); if (seteuid(0) != 0) { printf("FAIL: seteuid to root failed - %s\n", strerror(errno)); exit(1); } FILE* creds = fopen(TEST_ROOT "/creds.txt", "w"); if (creds == NULL) { printf("FAIL: failed to create credentials file - %s\n", strerror(errno)); exit(1); } if (fprintf(creds, "secret key\n") < 0) { printf("FAIL: fprintf failed - %s\n", strerror(errno)); exit(1); } if (fclose(creds) != 0) { printf("FAIL: fclose failed - %s\n", strerror(errno)); exit(1); } FILE* job_xml = fopen(TEST_ROOT "/job.xml", "w"); if (job_xml == NULL) { printf("FAIL: failed to create job file - %s\n", strerror(errno)); exit(1); } if (fprintf(job_xml, "<jobconf/>\n") < 0) { printf("FAIL: fprintf failed - %s\n", strerror(errno)); exit(1); } if (fclose(job_xml) != 0) { printf("FAIL: fclose failed - %s\n", strerror(errno)); exit(1); } if (seteuid(user_detail->pw_uid) != 0) { printf("FAIL: failed to seteuid back to user - %s\n", strerror(errno)); exit(1); } fflush(stdout); fflush(stderr); pid_t child = fork(); if (child == -1) { printf("FAIL: failed to fork process for init_app - %s\n", strerror(errno)); exit(1); } else if (child == 0) { char *final_pgm[] = {"touch", "my-touch-file", 0}; if (initialize_app(username, "app_4", TEST_ROOT "/creds.txt", final_pgm, extract_values(local_dirs), extract_values(log_dirs)) != 0) { printf("FAIL: failed in child\n"); exit(42); } // should never return exit(1); } int status = 0; if (waitpid(child, &status, 0) <= 0) { printf("FAIL: failed waiting for process %d - %s\n", child, strerror(errno)); exit(1); } if (access(TEST_ROOT "/logs/userlogs/app_4", R_OK) != 0) { printf("FAIL: failed to create app log directory\n"); exit(1); } char* app_dir = get_app_directory(TEST_ROOT "/local-1", username, "app_4"); if (access(app_dir, R_OK) != 0) { printf("FAIL: failed to create app directory %s\n", app_dir); exit(1); } char buffer[100000]; sprintf(buffer, "%s/jobToken", app_dir); if (access(buffer, R_OK) != 0) { printf("FAIL: failed to create credentials %s\n", buffer); exit(1); } sprintf(buffer, "%s/my-touch-file", app_dir); if (access(buffer, R_OK) != 0) { printf("FAIL: failed to create touch file %s\n", buffer); exit(1); } free(app_dir); app_dir = get_app_log_directory("logs","app_4"); if (access(app_dir, R_OK) != 0) { printf("FAIL: failed to create app log directory %s\n", app_dir); exit(1); } free(app_dir); }
void add_entry (char *key, char *value) { char *value1=0, *value2=0, *value3=0; /* Background and border */ if (strcmp (key, "rounded") == 0) { // 'rounded' is the first parameter => alloc a new background Background bg; bg.border.rounded = atoi(value); g_array_append_val(backgrounds, bg); } else if (strcmp (key, "border_width") == 0) { g_array_index(backgrounds, Background, backgrounds->len-1).border.width = atoi(value); } else if (strcmp (key, "background_color") == 0) { Background* bg = &g_array_index(backgrounds, Background, backgrounds->len-1); extract_values(value, &value1, &value2, &value3); get_color (value1, bg->back.color); if (value2) bg->back.alpha = (atoi (value2) / 100.0); else bg->back.alpha = 0.5; } else if (strcmp (key, "border_color") == 0) { Background* bg = &g_array_index(backgrounds, Background, backgrounds->len-1); extract_values(value, &value1, &value2, &value3); get_color (value1, bg->border.color); if (value2) bg->border.alpha = (atoi (value2) / 100.0); else bg->border.alpha = 0.5; } /* Panel */ else if (strcmp (key, "panel_monitor") == 0) { panel_config.monitor = config_get_monitor(value); } else if (strcmp (key, "panel_size") == 0) { extract_values(value, &value1, &value2, &value3); char *b; if ((b = strchr (value1, '%'))) { b[0] = '\0'; panel_config.pourcentx = 1; } panel_config.area.width = atoi(value1); if (panel_config.area.width == 0) { // full width mode panel_config.area.width = 100; panel_config.pourcentx = 1; } if (value2) { if ((b = strchr (value2, '%'))) { b[0] = '\0'; panel_config.pourcenty = 1; } panel_config.area.height = atoi(value2); } } else if (strcmp (key, "panel_margin") == 0) { extract_values(value, &value1, &value2, &value3); panel_config.marginx = atoi (value1); if (value2) panel_config.marginy = atoi (value2); } else if (strcmp (key, "panel_padding") == 0) { extract_values(value, &value1, &value2, &value3); panel_config.area.paddingxlr = panel_config.area.paddingx = atoi (value1); if (value2) panel_config.area.paddingy = atoi (value2); if (value3) panel_config.area.paddingx = atoi (value3); } else if (strcmp (key, "panel_position") == 0) { extract_values(value, &value1, &value2, &value3); if (strcmp (value1, "top") == 0) panel_position = TOP; else { if (strcmp (value1, "bottom") == 0) panel_position = BOTTOM; else panel_position = CENTER; } if (!value2) panel_position |= CENTER; else { if (strcmp (value2, "left") == 0) panel_position |= LEFT; else { if (strcmp (value2, "right") == 0) panel_position |= RIGHT; else panel_position |= CENTER; } } if (!value3) panel_horizontal = 1; else { if (strcmp (value3, "vertical") == 0) panel_horizontal = 0; else panel_horizontal = 1; } } else if (strcmp (key, "font_shadow") == 0) panel_config.g_task.font_shadow = atoi (value); else if (strcmp (key, "panel_background_id") == 0) { int id = atoi (value); id = (id < backgrounds->len && id >= 0) ? id : 0; panel_config.area.bg = &g_array_index(backgrounds, Background, id); } else if (strcmp (key, "wm_menu") == 0) wm_menu = atoi (value); else if (strcmp (key, "panel_dock") == 0) panel_dock = atoi (value); else if (strcmp (key, "urgent_nb_of_blink") == 0) max_tick_urgent = (atoi (value) * 2) + 1; else if (strcmp (key, "panel_layer") == 0) { if (strcmp(value, "bottom") == 0) panel_layer = BOTTOM_LAYER; else if (strcmp(value, "normal") == 0) panel_layer = NORMAL_LAYER; else if (strcmp(value, "top") == 0) panel_layer = TOP_LAYER; } /* Battery */ else if (strcmp (key, "battery") == 0) { #ifdef ENABLE_BATTERY if(atoi(value) == 1) battery_enabled = 1; #else if(atoi(value) == 1) fprintf(stderr, "tint2 is build without battery support\n"); #endif } else if (strcmp (key, "battery_low_status") == 0) { #ifdef ENABLE_BATTERY battery_low_status = atoi(value); if(battery_low_status < 0 || battery_low_status > 100) battery_low_status = 0; #endif } else if (strcmp (key, "battery_low_cmd") == 0) { #ifdef ENABLE_BATTERY if (strlen(value) > 0) battery_low_cmd = strdup (value); #endif } else if (strcmp (key, "bat1_font") == 0) { #ifdef ENABLE_BATTERY bat1_font_desc = pango_font_description_from_string (value); #endif } else if (strcmp (key, "bat2_font") == 0) { #ifdef ENABLE_BATTERY bat2_font_desc = pango_font_description_from_string (value); #endif } else if (strcmp (key, "battery_font_color") == 0) { #ifdef ENABLE_BATTERY extract_values(value, &value1, &value2, &value3); get_color (value1, panel_config.battery.font.color); if (value2) panel_config.battery.font.alpha = (atoi (value2) / 100.0); else panel_config.battery.font.alpha = 0.5; #endif } else if (strcmp (key, "battery_padding") == 0) { #ifdef ENABLE_BATTERY extract_values(value, &value1, &value2, &value3); panel_config.battery.area.paddingxlr = panel_config.battery.area.paddingx = atoi (value1); if (value2) panel_config.battery.area.paddingy = atoi (value2); if (value3) panel_config.battery.area.paddingx = atoi (value3); #endif } else if (strcmp (key, "battery_background_id") == 0) { #ifdef ENABLE_BATTERY int id = atoi (value); id = (id < backgrounds->len && id >= 0) ? id : 0; panel_config.battery.area.bg = &g_array_index(backgrounds, Background, id); #endif } else if (strcmp (key, "battery_hide") == 0) { #ifdef ENABLE_BATTERY percentage_hide = atoi (value); if (percentage_hide == 0) percentage_hide = 101; #endif } /* Applets */ else if (strcmp (key, "applets") == 0) { #ifdef ENABLE_APPLETS if(atoi(value) == 1) applets_enabled = 1; else applets_enabled = 0; #else if(atoi(value) == 1) fprintf(stderr, "tint2 is build without applets support\n"); #endif } else if (strcmp (key, "applets_background_id") == 0) { #ifdef ENABLE_APPLETS int id = atoi (value); id = (id < backgrounds->len && id >= 0) ? id : 0; panel_config.applets.area.bg = &g_array_index(backgrounds, Background, id); #endif } /* Clock */ else if (strcmp (key, "time1_format") == 0) { if (strlen(value) > 0) { time1_format = strdup (value); clock_enabled = 1; } } else if (strcmp (key, "time2_format") == 0) { if (strlen(value) > 0) time2_format = strdup (value); } else if (strcmp (key, "time1_font") == 0) { time1_font_desc = pango_font_description_from_string (value); } else if (strcmp(key, "time1_timezone") == 0) { if (strlen(value) > 0) time1_timezone = strdup(value); } else if (strcmp(key, "time2_timezone") == 0) { if (strlen(value) > 0) time2_timezone = strdup(value); } else if (strcmp (key, "time2_font") == 0) { time2_font_desc = pango_font_description_from_string (value); } else if (strcmp (key, "clock_font_color") == 0) { extract_values(value, &value1, &value2, &value3); get_color (value1, panel_config.clock.font.color); if (value2) panel_config.clock.font.alpha = (atoi (value2) / 100.0); else panel_config.clock.font.alpha = 0.5; } else if (strcmp (key, "clock_padding") == 0) { extract_values(value, &value1, &value2, &value3); panel_config.clock.area.paddingxlr = panel_config.clock.area.paddingx = atoi (value1); if (value2) panel_config.clock.area.paddingy = atoi (value2); if (value3) panel_config.clock.area.paddingx = atoi (value3); } else if (strcmp (key, "clock_background_id") == 0) { int id = atoi (value); id = (id < backgrounds->len && id >= 0) ? id : 0; panel_config.clock.area.bg = &g_array_index(backgrounds, Background, id); } else if (strcmp(key, "clock_tooltip") == 0) { if (strlen(value) > 0) time_tooltip_format = strdup (value); } else if (strcmp(key, "clock_tooltip_timezone") == 0) { if (strlen(value) > 0) time_tooltip_timezone = strdup(value); } else if (strcmp(key, "clock_lclick_command") == 0) { if (strlen(value) > 0) clock_lclick_command = strdup(value); } else if (strcmp(key, "clock_rclick_command") == 0) { if (strlen(value) > 0) clock_rclick_command = strdup(value); } /* Taskbar */ else if (strcmp (key, "taskbar_mode") == 0) { if (strcmp (value, "multi_desktop") == 0) panel_mode = MULTI_DESKTOP; else panel_mode = SINGLE_DESKTOP; } else if (strcmp (key, "taskbar_padding") == 0) { extract_values(value, &value1, &value2, &value3); panel_config.g_taskbar.area.paddingxlr = panel_config.g_taskbar.area.paddingx = atoi (value1); if (value2) panel_config.g_taskbar.area.paddingy = atoi (value2); if (value3) panel_config.g_taskbar.area.paddingx = atoi (value3); } else if (strcmp (key, "taskbar_background_id") == 0) { int id = atoi (value); id = (id < backgrounds->len && id >= 0) ? id : 0; panel_config.g_taskbar.bg = &g_array_index(backgrounds, Background, id); panel_config.g_taskbar.area.bg = panel_config.g_taskbar.bg; } else if (strcmp (key, "taskbar_active_background_id") == 0) { int id = atoi (value); id = (id < backgrounds->len && id >= 0) ? id : 0; panel_config.g_taskbar.bg_active = &g_array_index(backgrounds, Background, id); panel_config.g_taskbar.use_active = 1; } /* Task */ else if (strcmp (key, "task_text") == 0) panel_config.g_task.text = atoi (value); else if (strcmp (key, "task_icon") == 0) panel_config.g_task.icon = atoi (value); else if (strcmp (key, "task_centered") == 0) panel_config.g_task.centered = atoi (value); else if (strcmp (key, "task_width") == 0) { // old parameter : just for backward compatibility panel_config.g_task.maximum_width = atoi (value); panel_config.g_task.maximum_height = 30; } else if (strcmp (key, "task_maximum_size") == 0) { extract_values(value, &value1, &value2, &value3); panel_config.g_task.maximum_width = atoi (value1); panel_config.g_task.maximum_height = 30; if (value2) panel_config.g_task.maximum_height = atoi (value2); } else if (strcmp (key, "task_padding") == 0) { extract_values(value, &value1, &value2, &value3); panel_config.g_task.area.paddingxlr = panel_config.g_task.area.paddingx = atoi (value1); if (value2) panel_config.g_task.area.paddingy = atoi (value2); if (value3) panel_config.g_task.area.paddingx = atoi (value3); } else if (strcmp (key, "task_font") == 0) { panel_config.g_task.font_desc = pango_font_description_from_string (value); } else if (g_regex_match_simple("task.*_font_color", key, 0, 0)) { gchar** split = g_regex_split_simple("_", key, 0, 0); int status = get_task_status(split[1]); g_strfreev(split); extract_values(value, &value1, &value2, &value3); float alpha = 1; if (value2) alpha = (atoi (value2) / 100.0); get_color (value1, panel_config.g_task.font[status].color); panel_config.g_task.font[status].alpha = alpha; panel_config.g_task.config_font_mask |= (1<<status); } else if (g_regex_match_simple("task.*_icon_asb", key, 0, 0)) { gchar** split = g_regex_split_simple("_", key, 0, 0); int status = get_task_status(split[1]); g_strfreev(split); extract_values(value, &value1, &value2, &value3); panel_config.g_task.alpha[status] = atoi(value1); panel_config.g_task.saturation[status] = atoi(value2); panel_config.g_task.brightness[status] = atoi(value3); panel_config.g_task.config_asb_mask |= (1<<status); } else if (g_regex_match_simple("task.*_background_id", key, 0, 0)) { gchar** split = g_regex_split_simple("_", key, 0, 0); int status = get_task_status(split[1]); g_strfreev(split); int id = atoi (value); id = (id < backgrounds->len && id >= 0) ? id : 0; panel_config.g_task.background[status] = &g_array_index(backgrounds, Background, id); panel_config.g_task.config_background_mask |= (1<<status); if (status == TASK_NORMAL) panel_config.g_task.area.bg = panel_config.g_task.background[TASK_NORMAL]; } /* Systray */ // systray disabled in snapshot mode else if (strcmp (key, "systray") == 0 && snapshot_path == 0) { systray_enabled = atoi(value); // systray is latest option added. files without 'systray' are old. old_config_file = 0; } else if (strcmp (key, "systray_padding") == 0 && snapshot_path == 0) { if (old_config_file) systray_enabled = 1; extract_values(value, &value1, &value2, &value3); systray.area.paddingxlr = systray.area.paddingx = atoi (value1); if (value2) systray.area.paddingy = atoi (value2); if (value3) systray.area.paddingx = atoi (value3); } else if (strcmp (key, "systray_background_id") == 0) { int id = atoi (value); id = (id < backgrounds->len && id >= 0) ? id : 0; systray.area.bg = &g_array_index(backgrounds, Background, id); } else if (strcmp(key, "systray_sort") == 0) { if (strcmp(value, "descending") == 0) systray.sort = -1; else if (strcmp(value, "ascending") == 0) systray.sort = 1; else if (strcmp(value, "left2right") == 0) systray.sort = 2; else if (strcmp(value, "right2left") == 0) systray.sort = 3; } else if (strcmp(key, "systray_icon_size") == 0) { systray_max_icon_size = atoi(value); } else if (strcmp(key, "systray_icon_asb") == 0) { extract_values(value, &value1, &value2, &value3); systray.alpha = atoi(value1); systray.saturation = atoi(value2); systray.brightness = atoi(value3); } /* Tooltip */ else if (strcmp (key, "tooltip") == 0) g_tooltip.enabled = atoi(value); else if (strcmp (key, "tooltip_show_timeout") == 0) { int timeout_msec = 1000*atof(value); g_tooltip.show_timeout_msec = timeout_msec; } else if (strcmp (key, "tooltip_hide_timeout") == 0) { int timeout_msec = 1000*atof(value); g_tooltip.hide_timeout_msec = timeout_msec; } else if (strcmp (key, "tooltip_padding") == 0) { extract_values(value, &value1, &value2, &value3); if (value1) g_tooltip.paddingx = atoi(value1); if (value2) g_tooltip.paddingy = atoi(value2); } else if (strcmp (key, "tooltip_background_id") == 0) { int id = atoi (value); id = (id < backgrounds->len && id >= 0) ? id : 0; g_tooltip.bg = &g_array_index(backgrounds, Background, id); } else if (strcmp (key, "tooltip_font_color") == 0) { extract_values(value, &value1, &value2, &value3); get_color(value1, g_tooltip.font_color.color); if (value2) g_tooltip.font_color.alpha = (atoi (value2) / 100.0); else g_tooltip.font_color.alpha = 0.1; } else if (strcmp (key, "tooltip_font") == 0) { g_tooltip.font_desc = pango_font_description_from_string(value); } /* Mouse actions */ else if (strcmp (key, "mouse_middle") == 0) get_action (value, &mouse_middle); else if (strcmp (key, "mouse_right") == 0) get_action (value, &mouse_right); else if (strcmp (key, "mouse_scroll_up") == 0) get_action (value, &mouse_scroll_up); else if (strcmp (key, "mouse_scroll_down") == 0) get_action (value, &mouse_scroll_down); /* autohide options */ else if (strcmp(key, "autohide") == 0) panel_autohide = atoi(value); else if (strcmp(key, "autohide_show_timeout") == 0) panel_autohide_show_timeout = 1000*atof(value); else if (strcmp(key, "autohide_hide_timeout") == 0) panel_autohide_hide_timeout = 1000*atof(value); else if (strcmp(key, "strut_policy") == 0) { if (strcmp(value, "follow_size") == 0) panel_strut_policy = STRUT_FOLLOW_SIZE; else if (strcmp(value, "none") == 0) panel_strut_policy = STRUT_NONE; else panel_strut_policy = STRUT_MINIMUM; } else if (strcmp(key, "autohide_height") == 0) { panel_autohide_height = atoi(value); if (panel_autohide_height == 0) { // autohide need height > 0 panel_autohide_height = 1; } } else fprintf(stderr, "tint2 : invalid option \"%s\",\n upgrade tint2 or correct your config file\n", key); if (value1) free (value1); if (value2) free (value2); if (value3) free (value3); }
void add_entry (char *key, char *value) { char *value1=0, *value2=0, *value3=0; /* Background and border */ if (strcmp (key, "rounded") == 0) { // 'rounded' is the first parameter => alloc a new background Background bg; bg.border.rounded = atoi(value); g_array_append_val(backgrounds, bg); } else if (strcmp (key, "border_width") == 0) { g_array_index(backgrounds, Background, backgrounds->len-1).border.width = atoi(value); } else if (strcmp (key, "background_color") == 0) { Background* bg = &g_array_index(backgrounds, Background, backgrounds->len-1); extract_values(value, &value1, &value2, &value3); get_color (value1, bg->back.color); if (value2) bg->back.alpha = (atoi (value2) / 100.0); else bg->back.alpha = 0.5; } else if (strcmp (key, "border_color") == 0) { Background* bg = &g_array_index(backgrounds, Background, backgrounds->len-1); extract_values(value, &value1, &value2, &value3); get_color (value1, bg->border.color); if (value2) bg->border.alpha = (atoi (value2) / 100.0); else bg->border.alpha = 0.5; } /* Panel */ else if (strcmp (key, "panel_monitor") == 0) { panel_config.monitor = config_get_monitor(value); } else if (strcmp (key, "panel_size") == 0) { extract_values(value, &value1, &value2, &value3); char *b; if ((b = strchr (value1, '%'))) { b[0] = '\0'; panel_config.pourcentx = 1; } panel_config.area.width = atoi(value1); if (panel_config.area.width == 0) { // full width mode panel_config.area.width = 100; panel_config.pourcentx = 1; } if (value2) { if ((b = strchr (value2, '%'))) { b[0] = '\0'; panel_config.pourcenty = 1; } panel_config.area.height = atoi(value2); } } else if (strcmp (key, "panel_items") == 0) { new_config_file = 1; panel_items_order = strdup(value); int j; for (j=0 ; j < strlen(panel_items_order) ; j++) { if (panel_items_order[j] == 'L') launcher_enabled = 1; if (panel_items_order[j] == 'T') taskbar_enabled = 1; if (panel_items_order[j] == 'B') { #ifdef ENABLE_BATTERY battery_enabled = 1; #else fprintf(stderr, "tint2 is build without battery support\n"); #endif } if (panel_items_order[j] == 'S') { // systray disabled in snapshot mode if (snapshot_path == 0) systray_enabled = 1; } if (panel_items_order[j] == 'C') clock_enabled = 1; } } else if (strcmp (key, "panel_margin") == 0) { extract_values(value, &value1, &value2, &value3); panel_config.marginx = atoi (value1); if (value2) panel_config.marginy = atoi (value2); } else if (strcmp (key, "panel_padding") == 0) { extract_values(value, &value1, &value2, &value3); panel_config.area.paddingxlr = panel_config.area.paddingx = atoi (value1); if (value2) panel_config.area.paddingy = atoi (value2); if (value3) panel_config.area.paddingx = atoi (value3); } else if (strcmp (key, "panel_position") == 0) { extract_values(value, &value1, &value2, &value3); if (strcmp (value1, "top") == 0) panel_position = TOP; else { if (strcmp (value1, "bottom") == 0) panel_position = BOTTOM; else panel_position = CENTER; } if (!value2) panel_position |= CENTER; else { if (strcmp (value2, "left") == 0) panel_position |= LEFT; else { if (strcmp (value2, "right") == 0) panel_position |= RIGHT; else panel_position |= CENTER; } } if (!value3) panel_horizontal = 1; else { if (strcmp (value3, "vertical") == 0) panel_horizontal = 0; else panel_horizontal = 1; } } else if (strcmp (key, "font_shadow") == 0) panel_config.g_task.font_shadow = atoi (value); else if (strcmp (key, "panel_background_id") == 0) { int id = atoi (value); id = (id < backgrounds->len && id >= 0) ? id : 0; panel_config.area.bg = &g_array_index(backgrounds, Background, id); } else if (strcmp (key, "wm_menu") == 0) wm_menu = atoi (value); else if (strcmp (key, "panel_dock") == 0) panel_dock = atoi (value); else if (strcmp (key, "urgent_nb_of_blink") == 0) max_tick_urgent = atoi (value); else if (strcmp (key, "panel_layer") == 0) { if (strcmp(value, "bottom") == 0) panel_layer = BOTTOM_LAYER; else if (strcmp(value, "top") == 0) panel_layer = TOP_LAYER; else panel_layer = NORMAL_LAYER; } /* Battery */ else if (strcmp (key, "battery_low_status") == 0) { #ifdef ENABLE_BATTERY battery_low_status = atoi(value); if(battery_low_status < 0 || battery_low_status > 100) battery_low_status = 0; #endif } else if (strcmp (key, "battery_low_cmd") == 0) { #ifdef ENABLE_BATTERY if (strlen(value) > 0) battery_low_cmd = strdup (value); #endif } else if (strcmp (key, "bat1_font") == 0) { #ifdef ENABLE_BATTERY bat1_font_desc = pango_font_description_from_string (value); #endif } else if (strcmp (key, "bat2_font") == 0) { #ifdef ENABLE_BATTERY bat2_font_desc = pango_font_description_from_string (value); #endif } else if (strcmp (key, "battery_font_color") == 0) { #ifdef ENABLE_BATTERY extract_values(value, &value1, &value2, &value3); get_color (value1, panel_config.battery.font.color); if (value2) panel_config.battery.font.alpha = (atoi (value2) / 100.0); else panel_config.battery.font.alpha = 0.5; #endif } else if (strcmp (key, "battery_padding") == 0) { #ifdef ENABLE_BATTERY extract_values(value, &value1, &value2, &value3); panel_config.battery.area.paddingxlr = panel_config.battery.area.paddingx = atoi (value1); if (value2) panel_config.battery.area.paddingy = atoi (value2); if (value3) panel_config.battery.area.paddingx = atoi (value3); #endif } else if (strcmp (key, "battery_background_id") == 0) { #ifdef ENABLE_BATTERY int id = atoi (value); id = (id < backgrounds->len && id >= 0) ? id : 0; panel_config.battery.area.bg = &g_array_index(backgrounds, Background, id); #endif } else if (strcmp (key, "battery_hide") == 0) { #ifdef ENABLE_BATTERY percentage_hide = atoi (value); if (percentage_hide == 0) percentage_hide = 101; #endif } /* Clock */ else if (strcmp (key, "time1_format") == 0) { if (new_config_file == 0) { clock_enabled = 1; if (panel_items_order) { char* tmp = g_strconcat(panel_items_order, "C", NULL); g_free( panel_items_order ); panel_items_order = tmp; } else panel_items_order = g_strdup("C"); } if (strlen(value) > 0) { time1_format = strdup (value); clock_enabled = 1; } } else if (strcmp (key, "time2_format") == 0) { if (strlen(value) > 0) time2_format = strdup (value); } else if (strcmp (key, "time1_font") == 0) { time1_font_desc = pango_font_description_from_string (value); } else if (strcmp(key, "time1_timezone") == 0) { if (strlen(value) > 0) time1_timezone = strdup(value); } else if (strcmp(key, "time2_timezone") == 0) { if (strlen(value) > 0) time2_timezone = strdup(value); } else if (strcmp (key, "time2_font") == 0) { time2_font_desc = pango_font_description_from_string (value); } else if (strcmp (key, "clock_font_color") == 0) { extract_values(value, &value1, &value2, &value3); get_color (value1, panel_config.clock.font.color); if (value2) panel_config.clock.font.alpha = (atoi (value2) / 100.0); else panel_config.clock.font.alpha = 0.5; } else if (strcmp (key, "clock_padding") == 0) { extract_values(value, &value1, &value2, &value3); panel_config.clock.area.paddingxlr = panel_config.clock.area.paddingx = atoi (value1); if (value2) panel_config.clock.area.paddingy = atoi (value2); if (value3) panel_config.clock.area.paddingx = atoi (value3); } else if (strcmp (key, "clock_background_id") == 0) { int id = atoi (value); id = (id < backgrounds->len && id >= 0) ? id : 0; panel_config.clock.area.bg = &g_array_index(backgrounds, Background, id); } else if (strcmp(key, "clock_tooltip") == 0) { if (strlen(value) > 0) time_tooltip_format = strdup (value); } else if (strcmp(key, "clock_tooltip_timezone") == 0) { if (strlen(value) > 0) time_tooltip_timezone = strdup(value); } else if (strcmp(key, "clock_lclick_command") == 0) { if (strlen(value) > 0) clock_lclick_command = strdup(value); } else if (strcmp(key, "clock_rclick_command") == 0) { if (strlen(value) > 0) clock_rclick_command = strdup(value); } /* Taskbar */ else if (strcmp (key, "taskbar_mode") == 0) { if (strcmp (value, "multi_desktop") == 0) panel_mode = MULTI_DESKTOP; else panel_mode = SINGLE_DESKTOP; } else if (strcmp (key, "taskbar_padding") == 0) { extract_values(value, &value1, &value2, &value3); panel_config.g_taskbar.area.paddingxlr = panel_config.g_taskbar.area.paddingx = atoi (value1); if (value2) panel_config.g_taskbar.area.paddingy = atoi (value2); if (value3) panel_config.g_taskbar.area.paddingx = atoi (value3); } else if (strcmp (key, "taskbar_background_id") == 0) { int id = atoi (value); id = (id < backgrounds->len && id >= 0) ? id : 0; panel_config.g_taskbar.background[TASKBAR_NORMAL] = &g_array_index(backgrounds, Background, id); if (panel_config.g_taskbar.background[TASKBAR_ACTIVE] == 0) panel_config.g_taskbar.background[TASKBAR_ACTIVE] = panel_config.g_taskbar.background[TASKBAR_NORMAL]; } else if (strcmp (key, "taskbar_active_background_id") == 0) { int id = atoi (value); id = (id < backgrounds->len && id >= 0) ? id : 0; panel_config.g_taskbar.background[TASKBAR_ACTIVE] = &g_array_index(backgrounds, Background, id); } else if (strcmp (key, "taskbar_name") == 0) { taskbarname_enabled = atoi (value); } else if (strcmp (key, "taskbar_name_padding") == 0) { extract_values(value, &value1, &value2, &value3); panel_config.g_taskbar.area_name.paddingxlr = panel_config.g_taskbar.area_name.paddingx = atoi (value1); } else if (strcmp (key, "taskbar_name_background_id") == 0) { int id = atoi (value); id = (id < backgrounds->len && id >= 0) ? id : 0; panel_config.g_taskbar.background_name[TASKBAR_NORMAL] = &g_array_index(backgrounds, Background, id); if (panel_config.g_taskbar.background_name[TASKBAR_ACTIVE] == 0) panel_config.g_taskbar.background_name[TASKBAR_ACTIVE] = panel_config.g_taskbar.background_name[TASKBAR_NORMAL]; } else if (strcmp (key, "taskbar_name_active_background_id") == 0) { int id = atoi (value); id = (id < backgrounds->len && id >= 0) ? id : 0; panel_config.g_taskbar.background_name[TASKBAR_ACTIVE] = &g_array_index(backgrounds, Background, id); } else if (strcmp (key, "taskbar_name_font") == 0) { taskbarname_font_desc = pango_font_description_from_string (value); } else if (strcmp (key, "taskbar_name_font_color") == 0) { extract_values(value, &value1, &value2, &value3); get_color (value1, taskbarname_font.color); if (value2) taskbarname_font.alpha = (atoi (value2) / 100.0); else taskbarname_font.alpha = 0.5; } else if (strcmp (key, "taskbar_name_active_font_color") == 0) { extract_values(value, &value1, &value2, &value3); get_color (value1, taskbarname_active_font.color); if (value2) taskbarname_active_font.alpha = (atoi (value2) / 100.0); else taskbarname_active_font.alpha = 0.5; } /* Task */ else if (strcmp (key, "task_text") == 0) panel_config.g_task.text = atoi (value); else if (strcmp (key, "task_icon") == 0) panel_config.g_task.icon = atoi (value); else if (strcmp (key, "task_centered") == 0) panel_config.g_task.centered = atoi (value); else if (strcmp (key, "task_width") == 0) { // old parameter : just for backward compatibility panel_config.g_task.maximum_width = atoi (value); panel_config.g_task.maximum_height = 30; } else if (strcmp (key, "task_maximum_size") == 0) { extract_values(value, &value1, &value2, &value3); panel_config.g_task.maximum_width = atoi (value1); panel_config.g_task.maximum_height = 30; if (value2) panel_config.g_task.maximum_height = atoi (value2); } else if (strcmp (key, "task_padding") == 0) { extract_values(value, &value1, &value2, &value3); panel_config.g_task.area.paddingxlr = panel_config.g_task.area.paddingx = atoi (value1); if (value2) panel_config.g_task.area.paddingy = atoi (value2); if (value3) panel_config.g_task.area.paddingx = atoi (value3); } else if (strcmp (key, "task_align") == 0) { extract_values(value, &value1, &value2, &value3); printf("task_align: %s\n", value1); if (strcmp (value1, "left") == 0) panel_config.g_task.align = ALIGN_LEFT; else if (strcmp (value1, "center") == 0) panel_config.g_task.align = ALIGN_CENTER; else if (strcmp (value1, "right") == 0) panel_config.g_task.align = ALIGN_RIGHT; else fprintf(stderr, "Unknown value for task_align: %s\n", value1); } else if (strcmp (key, "task_font") == 0) { panel_config.g_task.font_desc = pango_font_description_from_string (value); } else if (g_regex_match_simple("task.*_font_color", key, 0, 0)) { gchar** split = g_regex_split_simple("_", key, 0, 0); int status = get_task_status(split[1]); g_strfreev(split); extract_values(value, &value1, &value2, &value3); float alpha = 1; if (value2) alpha = (atoi (value2) / 100.0); get_color (value1, panel_config.g_task.font[status].color); panel_config.g_task.font[status].alpha = alpha; panel_config.g_task.config_font_mask |= (1<<status); } else if (g_regex_match_simple("task.*_icon_asb", key, 0, 0)) { gchar** split = g_regex_split_simple("_", key, 0, 0); int status = get_task_status(split[1]); g_strfreev(split); extract_values(value, &value1, &value2, &value3); panel_config.g_task.alpha[status] = atoi(value1); panel_config.g_task.saturation[status] = atoi(value2); panel_config.g_task.brightness[status] = atoi(value3); panel_config.g_task.config_asb_mask |= (1<<status); } else if (g_regex_match_simple("task.*_background_id", key, 0, 0)) { gchar** split = g_regex_split_simple("_", key, 0, 0); int status = get_task_status(split[1]); g_strfreev(split); int id = atoi (value); id = (id < backgrounds->len && id >= 0) ? id : 0; panel_config.g_task.background[status] = &g_array_index(backgrounds, Background, id); panel_config.g_task.config_background_mask |= (1<<status); if (status == TASK_NORMAL) panel_config.g_task.area.bg = panel_config.g_task.background[TASK_NORMAL]; } // "tooltip" is deprecated but here for backwards compatibility else if (strcmp (key, "task_tooltip") == 0 || strcmp(key, "tooltip") == 0) panel_config.g_task.tooltip_enabled = atoi(value); /* Systray */ else if (strcmp (key, "systray_padding") == 0) { if (new_config_file == 0 && systray_enabled == 0) { systray_enabled = 1; if (panel_items_order) { char* tmp = g_strconcat(panel_items_order, "S", NULL); g_free( panel_items_order ); panel_items_order = tmp; } else panel_items_order = g_strdup("S"); } extract_values(value, &value1, &value2, &value3); systray.area.paddingxlr = systray.area.paddingx = atoi (value1); if (value2) systray.area.paddingy = atoi (value2); if (value3) systray.area.paddingx = atoi (value3); } else if (strcmp (key, "systray_background_id") == 0) { int id = atoi (value); id = (id < backgrounds->len && id >= 0) ? id : 0; systray.area.bg = &g_array_index(backgrounds, Background, id); } else if (strcmp(key, "systray_sort") == 0) { if (strcmp(value, "descending") == 0) systray.sort = -1; else if (strcmp(value, "ascending") == 0) systray.sort = 1; else if (strcmp(value, "left2right") == 0) systray.sort = 2; else if (strcmp(value, "right2left") == 0) systray.sort = 3; } else if (strcmp(key, "systray_icon_size") == 0) { systray_max_icon_size = atoi(value); } else if (strcmp(key, "systray_icon_asb") == 0) { extract_values(value, &value1, &value2, &value3); systray.alpha = atoi(value1); systray.saturation = atoi(value2); systray.brightness = atoi(value3); } /* Launcher */ else if (strcmp (key, "launcher_padding") == 0) { extract_values(value, &value1, &value2, &value3); panel_config.launcher.area.paddingxlr = panel_config.launcher.area.paddingx = atoi (value1); if (value2) panel_config.launcher.area.paddingy = atoi (value2); if (value3) panel_config.launcher.area.paddingx = atoi (value3); } else if (strcmp (key, "launcher_background_id") == 0) { int id = atoi (value); id = (id < backgrounds->len && id >= 0) ? id : 0; panel_config.launcher.area.bg = &g_array_index(backgrounds, Background, id); } else if (strcmp(key, "launcher_icon_size") == 0) { launcher_max_icon_size = atoi(value); } else if (strcmp(key, "launcher_item_app") == 0) { char *app = strdup(value); panel_config.launcher.list_apps = g_slist_append(panel_config.launcher.list_apps, app); } else if (strcmp(key, "launcher_apps_dir") == 0) { GList *list = dir_scan_alpha(value, "*.desktop"); for (list = g_list_first(list); list; list = g_list_next(list)) { fprintf(stderr, "Add launcher app: %s\n", (const char *)list->data); panel_config.launcher.list_apps = g_slist_append(panel_config.launcher.list_apps, (char *)strdup((const char *)list->data)); } // Cleanup g_list_free_full(list, g_free); } else if (strcmp(key, "launcher_icon_theme") == 0) { // if XSETTINGS manager running, tint2 use it. if (!icon_theme_name) icon_theme_name = strdup(value); } else if (strcmp(key, "launcher_icon_asb") == 0) { extract_values(value, &value1, &value2, &value3); launcher_alpha = atoi(value1); launcher_saturation = atoi(value2); launcher_brightness = atoi(value3); } else if (strcmp(key, "launcher_tooltip") == 0) { launcher_tooltip_enabled = atoi(value); } /* Tooltip */ else if (strcmp (key, "tooltip_show_timeout") == 0) { int timeout_msec = 1000*atof(value); g_tooltip.show_timeout_msec = timeout_msec; } else if (strcmp (key, "tooltip_hide_timeout") == 0) { int timeout_msec = 1000*atof(value); g_tooltip.hide_timeout_msec = timeout_msec; } else if (strcmp (key, "tooltip_padding") == 0) { extract_values(value, &value1, &value2, &value3); if (value1) g_tooltip.paddingx = atoi(value1); if (value2) g_tooltip.paddingy = atoi(value2); } else if (strcmp (key, "tooltip_background_id") == 0) { int id = atoi (value); id = (id < backgrounds->len && id >= 0) ? id : 0; g_tooltip.bg = &g_array_index(backgrounds, Background, id); } else if (strcmp (key, "tooltip_font_color") == 0) { extract_values(value, &value1, &value2, &value3); get_color(value1, g_tooltip.font_color.color); if (value2) g_tooltip.font_color.alpha = (atoi (value2) / 100.0); else g_tooltip.font_color.alpha = 0.1; } else if (strcmp (key, "tooltip_font") == 0) { g_tooltip.font_desc = pango_font_description_from_string(value); } /* Mouse actions */ else if (strcmp (key, "mouse_middle") == 0) get_action (value, &mouse_middle); else if (strcmp (key, "mouse_right") == 0) get_action (value, &mouse_right); else if (strcmp (key, "mouse_scroll_up") == 0) get_action (value, &mouse_scroll_up); else if (strcmp (key, "mouse_scroll_down") == 0) get_action (value, &mouse_scroll_down); /* autohide options */ else if (strcmp(key, "autohide") == 0) panel_autohide = atoi(value); else if (strcmp(key, "autohide_show_timeout") == 0) panel_autohide_show_timeout = 1000*atof(value); else if (strcmp(key, "autohide_hide_timeout") == 0) panel_autohide_hide_timeout = 1000*atof(value); else if (strcmp(key, "strut_policy") == 0) { if (strcmp(value, "follow_size") == 0) panel_strut_policy = STRUT_FOLLOW_SIZE; else if (strcmp(value, "none") == 0) panel_strut_policy = STRUT_NONE; else panel_strut_policy = STRUT_MINIMUM; } else if (strcmp(key, "autohide_height") == 0) { panel_autohide_height = atoi(value); if (panel_autohide_height == 0) { // autohide need height > 0 panel_autohide_height = 1; } } // old config option else if (strcmp(key, "systray") == 0) { if (new_config_file == 0) { systray_enabled = atoi(value); if (systray_enabled) { if (panel_items_order) { char* tmp = g_strconcat(panel_items_order, "S", NULL); g_free( panel_items_order ); panel_items_order = tmp; } else panel_items_order = g_strdup("S"); } } } #ifdef ENABLE_BATTERY else if (strcmp(key, "battery") == 0) { if (new_config_file == 0) { battery_enabled = atoi(value); if (battery_enabled) { if (panel_items_order) { char* tmp = g_strconcat(panel_items_order, "B", NULL); g_free( panel_items_order ); panel_items_order = tmp; } else panel_items_order = g_strdup("B"); } } } #endif else fprintf(stderr, "tint2 : invalid option \"%s\",\n upgrade tint2 or correct your config file\n", key); if (value1) free (value1); if (value2) free (value2); if (value3) free (value3); }
int main(int argc, char **argv) { LOGFILE = stdout; ERRORFILE = stderr; int my_username = 0; // clean up any junk from previous run system("chmod -R u=rwx " TEST_ROOT "; rm -fr " TEST_ROOT); if (mkdirs(TEST_ROOT "/logs/userlogs", 0755) != 0) { exit(1); } if (write_config_file(TEST_ROOT "/test.cfg") != 0) { exit(1); } read_config(TEST_ROOT "/test.cfg"); local_dirs = (char *) malloc (sizeof(char) * ARRAY_SIZE); strcpy(local_dirs, NM_LOCAL_DIRS); log_dirs = (char *) malloc (sizeof(char) * ARRAY_SIZE); strcpy(log_dirs, NM_LOG_DIRS); create_nm_roots(extract_values(local_dirs)); if (getuid() == 0 && argc == 2) { username = argv[1]; } else { username = strdup(getpwuid(getuid())->pw_name); my_username = 1; } set_nm_uid(geteuid(), getegid()); if (set_user(username)) { exit(1); } printf("\nStarting tests\n"); printf("\nTesting get_user_directory()\n"); test_get_user_directory(); printf("\nTesting get_app_directory()\n"); test_get_app_directory(); printf("\nTesting get_container_directory()\n"); test_get_container_directory(); printf("\nTesting get_container_launcher_file()\n"); test_get_container_launcher_file(); printf("\nTesting get_app_log_dir()\n"); test_get_app_log_dir(); test_check_configuration_permissions(); printf("\nTesting delete_container()\n"); test_delete_container(); printf("\nTesting delete_app()\n"); test_delete_app(); test_delete_user(); test_check_user(); // the tests that change user need to be run in a subshell, so that // when they change user they don't give up our privs run_test_in_child("test_signal_container", test_signal_container); run_test_in_child("test_signal_container_group", test_signal_container_group); // init app and run container can't be run if you aren't testing as root if (getuid() == 0) { // these tests do internal forks so that the change_owner and execs // don't mess up our process. test_init_app(); test_run_container(); } seteuid(0); run("rm -fr " TEST_ROOT); printf("\nFinished tests\n"); if (my_username) { free(username); } free_configurations(); return 0; }
void test_run_container() { printf("\nTesting run container\n"); if (seteuid(0) != 0) { printf("FAIL: seteuid to root failed - %s\n", strerror(errno)); exit(1); } FILE* creds = fopen(TEST_ROOT "/creds.txt", "w"); if (creds == NULL) { printf("FAIL: failed to create credentials file - %s\n", strerror(errno)); exit(1); } if (fprintf(creds, "secret key\n") < 0) { printf("FAIL: fprintf failed - %s\n", strerror(errno)); exit(1); } if (fclose(creds) != 0) { printf("FAIL: fclose failed - %s\n", strerror(errno)); exit(1); } const char* script_name = TEST_ROOT "/container-script"; FILE* script = fopen(script_name, "w"); if (script == NULL) { printf("FAIL: failed to create script file - %s\n", strerror(errno)); exit(1); } if (seteuid(user_detail->pw_uid) != 0) { printf("FAIL: failed to seteuid back to user - %s\n", strerror(errno)); exit(1); } if (fprintf(script, "#!/bin/bash\n" "touch foobar\n" "exit 0") < 0) { printf("FAIL: fprintf failed - %s\n", strerror(errno)); exit(1); } if (fclose(script) != 0) { printf("FAIL: fclose failed - %s\n", strerror(errno)); exit(1); } fflush(stdout); fflush(stderr); char* container_dir = get_container_work_directory(TEST_ROOT "/local-1", username, "app_4", "container_1"); const char * pid_file = TEST_ROOT "/pid.txt"; pid_t child = fork(); if (child == -1) { printf("FAIL: failed to fork process for init_app - %s\n", strerror(errno)); exit(1); } else if (child == 0) { if (launch_container_as_user(username, "app_4", "container_1", container_dir, script_name, TEST_ROOT "/creds.txt", pid_file, extract_values(local_dirs), extract_values(log_dirs)) != 0) { printf("FAIL: failed in child\n"); exit(42); } // should never return exit(1); } int status = 0; if (waitpid(child, &status, 0) <= 0) { printf("FAIL: failed waiting for process %d - %s\n", child, strerror(errno)); exit(1); } if (access(TEST_ROOT "/logs/userlogs/app_4/container_1", R_OK) != 0) { printf("FAIL: failed to create container log directory\n"); exit(1); } if (access(container_dir, R_OK) != 0) { printf("FAIL: failed to create container directory %s\n", container_dir); exit(1); } char buffer[100000]; sprintf(buffer, "%s/foobar", container_dir); if (access(buffer, R_OK) != 0) { printf("FAIL: failed to create touch file %s\n", buffer); exit(1); } free(container_dir); container_dir = get_app_log_directory("logs", "app_4/container_1"); if (access(container_dir, R_OK) != 0) { printf("FAIL: failed to create app log directory %s\n", container_dir); exit(1); } free(container_dir); if(access(pid_file, R_OK) != 0) { printf("FAIL: failed to create pid file %s\n", pid_file); exit(1); } int pidfd = open(pid_file, O_RDONLY); if (pidfd == -1) { printf("FAIL: failed to open pid file %s - %s\n", pid_file, strerror(errno)); exit(1); } char pidBuf[100]; ssize_t bytes = read(pidfd, pidBuf, 100); if (bytes == -1) { printf("FAIL: failed to read from pid file %s - %s\n", pid_file, strerror(errno)); exit(1); } pid_t mypid = child; char myPidBuf[33]; snprintf(myPidBuf, 33, "%d", mypid); if (strncmp(pidBuf, myPidBuf, strlen(myPidBuf)) != 0) { printf("FAIL: failed to find matching pid in pid file\n"); printf("FAIL: Expected pid %d : Got %.*s", mypid, (int)bytes, pidBuf); exit(1); } }
int main(int argc, char **argv) { open_log_files(); assert_valid_setup(argv[0]); int operation; int ret = validate_arguments(argc, argv, &operation); if (ret != 0) { flush_and_close_log_files(); return ret; } int exit_code = 0; switch (operation) { case CHECK_SETUP: //we already did this exit_code = 0; break; case MOUNT_CGROUPS: exit_code = 0; while (optind < argc && exit_code == 0) { exit_code = mount_cgroup(argv[optind++], cmd_input.cgroups_hierarchy); } break; case TRAFFIC_CONTROL_MODIFY_STATE: exit_code = traffic_control_modify_state(cmd_input.traffic_control_command_file); break; case TRAFFIC_CONTROL_READ_STATE: exit_code = traffic_control_read_state(cmd_input.traffic_control_command_file); break; case TRAFFIC_CONTROL_READ_STATS: exit_code = traffic_control_read_stats(cmd_input.traffic_control_command_file); break; case RUN_DOCKER: exit_code = run_docker(cmd_input.docker_command_file); break; case RUN_AS_USER_INITIALIZE_CONTAINER: exit_code = set_user(cmd_input.run_as_user_name); if (exit_code != 0) { break; } exit_code = initialize_app(cmd_input.yarn_user_name, cmd_input.app_id, cmd_input.cred_file, extract_values(cmd_input.local_dirs), extract_values(cmd_input.log_dirs), argv + optind); break; case RUN_AS_USER_LAUNCH_DOCKER_CONTAINER: if (cmd_input.traffic_control_command_file != NULL) { //apply tc rules before switching users and launching the container exit_code = traffic_control_modify_state(cmd_input.traffic_control_command_file); if( exit_code != 0) { //failed to apply tc rules - break out before launching the container break; } } exit_code = set_user(cmd_input.run_as_user_name); if (exit_code != 0) { break; } exit_code = launch_docker_container_as_user(cmd_input.yarn_user_name, cmd_input.app_id, cmd_input.container_id, cmd_input.current_dir, cmd_input.script_file, cmd_input.cred_file, cmd_input.pid_file, extract_values(cmd_input.local_dirs), extract_values(cmd_input.log_dirs), cmd_input.docker_command_file, cmd_input.resources_key, cmd_input.resources_values); break; case RUN_AS_USER_LAUNCH_CONTAINER: if (cmd_input.traffic_control_command_file != NULL) { //apply tc rules before switching users and launching the container exit_code = traffic_control_modify_state(cmd_input.traffic_control_command_file); if( exit_code != 0) { //failed to apply tc rules - break out before launching the container break; } } exit_code = set_user(cmd_input.run_as_user_name); if (exit_code != 0) { break; } exit_code = launch_container_as_user(cmd_input.yarn_user_name, cmd_input.app_id, cmd_input.container_id, cmd_input.current_dir, cmd_input.script_file, cmd_input.cred_file, cmd_input.pid_file, extract_values(cmd_input.local_dirs), extract_values(cmd_input.log_dirs), cmd_input.resources_key, cmd_input.resources_values); free(cmd_input.resources_key); free(cmd_input.resources_value); free(cmd_input.resources_values); break; case RUN_AS_USER_SIGNAL_CONTAINER: exit_code = set_user(cmd_input.run_as_user_name); if (exit_code != 0) { break; } exit_code = signal_container_as_user(cmd_input.yarn_user_name, cmd_input.container_pid, cmd_input.signal); break; case RUN_AS_USER_DELETE: exit_code = set_user(cmd_input.run_as_user_name); if (exit_code != 0) { break; } exit_code = delete_as_user(cmd_input.yarn_user_name, cmd_input.dir_to_be_deleted, argv + optind); break; } flush_and_close_log_files(); return exit_code; }
bool First_scr::load_experimental_variograms() { QString filename = filechooser_->fileName(); QFile file( filename ); if ( !file.open( IO_ReadOnly ) ) { GsTLcerr << "Can't open file " << filename.ascii() << "\n" << gstlIO::end; return false; } QTextStream stream( &file ); QString qstr = stream.read(); QDomDocument doc; bool parsed = doc.setContent( qstr ); if( !parsed ) { GsTLcerr << "File " << filename.ascii() << " is not a valid XML file\n" << gstlIO::end; return false; } experimental_variograms_.clear(); parameters_list_.clear(); directions_.clear(); pairs_.clear(); QDomElement root_element = doc.documentElement(); QDomNodeList variogram_nodes = root_element.elementsByTagName( "variogram" ); for( int id = 0; id < variogram_nodes.count() ; id++ ) { QDomNode varg_node = variogram_nodes.item( id ); appli_assert( varg_node.isElement() ); QDomElement varg_element = varg_node.toElement(); // get the title parameters_list_ += extract_title( varg_element, id ); // get the direction GsTLVector<double> dir; if( !extract_direction( dir, varg_element, id ) ) return false; directions_.push_back( dir ); // get the variogram values Discrete_function experim_variog; std::vector<double> x; std::vector<double> y; if( !extract_values( x, "x", varg_element, id ) ) return false; if( !extract_values( y, "y", varg_element, id ) ) return false; if( x.size() != y.size() ) { GsTLcerr << "Error reading variogram " << id << ":\n" << "x and y must have the same length" << gstlIO::end; return false; } experim_variog.set_x_values( x ); experim_variog.set_y_values( y ); experimental_variograms_.push_back( experim_variog ); // get the pairs std::vector<double> pairs_d; if( !extract_values( pairs_d, "pairs", varg_element, id ) ) return false; if( x.size() != pairs_d.size() ) { GsTLcerr << "Error reading variogram " << id << ":\n" << "pair count is missing for some lags" << gstlIO::end; return false; } // cast into int's std::vector<int> pairs; std::vector<double>::iterator it = pairs_d.begin(); for( ; it != pairs_d.end(); ++it ) { pairs.push_back( static_cast<int>(*it) ); } pairs_.push_back( pairs ); } return true; }
void test_delete_container() { if (initialize_user(username, extract_values(local_dirs))) { printf("FAIL: failed to initialize user %s\n", username); exit(1); } char* app_dir = get_app_directory(TEST_ROOT "/local-2", username, "app_1"); char* dont_touch = get_app_directory(TEST_ROOT "/local-2", username, DONT_TOUCH_FILE); char* container_dir = get_container_work_directory(TEST_ROOT "/local-2", username, "app_1", "container_1"); char buffer[100000]; sprintf(buffer, "mkdir -p %s/who/let/the/dogs/out/who/who", container_dir); run(buffer); sprintf(buffer, "touch %s", dont_touch); run(buffer); // soft link to the canary file from the container directory sprintf(buffer, "ln -s %s %s/who/softlink", dont_touch, container_dir); run(buffer); // hard link to the canary file from the container directory sprintf(buffer, "ln %s %s/who/hardlink", dont_touch, container_dir); run(buffer); // create a dot file in the container directory sprintf(buffer, "touch %s/who/let/.dotfile", container_dir); run(buffer); // create a no permission file sprintf(buffer, "touch %s/who/let/protect", container_dir); run(buffer); sprintf(buffer, "chmod 000 %s/who/let/protect", container_dir); run(buffer); // create a no permission directory sprintf(buffer, "chmod 000 %s/who/let", container_dir); run(buffer); // delete container directory char * dirs[] = {app_dir, 0}; int ret = delete_as_user(username, "container_1" , dirs); if (ret != 0) { printf("FAIL: return code from delete_as_user is %d\n", ret); exit(1); } // check to make sure the container directory is gone if (access(container_dir, R_OK) == 0) { printf("FAIL: failed to delete the directory - %s\n", container_dir); exit(1); } // check to make sure the app directory is not gone if (access(app_dir, R_OK) != 0) { printf("FAIL: accidently deleted the directory - %s\n", app_dir); exit(1); } // but that the canary is not gone if (access(dont_touch, R_OK) != 0) { printf("FAIL: accidently deleted file %s\n", dont_touch); exit(1); } sprintf(buffer, "chmod -R 700 %s", app_dir); run(buffer); sprintf(buffer, "rm -fr %s", app_dir); run(buffer); free(app_dir); free(container_dir); free(dont_touch); }