/* * process_parser.c * * Created on: Sep 16, 2010 * Author: lamikr */ #include #include #include #include #include #include #include "common.h" #include "process_parser.h" t_process_arg_list *parse_command_line_args(char *cmd_line_param) { char *line_pointer; char *start; int len; t_process_arg_list *ret_val; ret_val = NULL; if (cmd_line_param != NULL) { ret_val = calloc(1, sizeof(t_process_arg_list)); line_pointer = cmd_line_param; while(*line_pointer != '\0') { while((*line_pointer == ' ') || (*line_pointer == '\t')) { line_pointer++; } if (*line_pointer != '\0') { if (ret_val->arg_arr == NULL) { ret_val->arg_arr = calloc(1, sizeof(char *)); } else { char **arg_arr; arg_arr = ret_val->arg_arr; arg_arr = realloc(arg_arr, (ret_val->count + 1) * sizeof(char *)); ret_val->arg_arr = arg_arr; } start = line_pointer; len = 1; while((*++line_pointer != '\0') && (*line_pointer != ' ') && (*line_pointer != '\t')) { len++; } ret_val->arg_arr[ret_val->count] = strndup(start, len); log_debug("ret_val[%d] = %s\n", ret_val->count, ret_val->arg_arr[ret_val->count]); ret_val->count = ret_val->count + 1; } else { break; } } // terminate list with null ret_val->arg_arr = realloc(ret_val->arg_arr, (ret_val->count + 1) * sizeof(char *)); ret_val->arg_arr[ret_val->count] = NULL; ret_val->count = ret_val->count + 1; } return ret_val; } t_process_info *parse_process_info(struct uci_option *option_param) { t_process_info *ret_val; ret_val = NULL; if (option_param->type == UCI_TYPE_STRING) { ret_val = calloc(1, sizeof(t_process_info)); ret_val->arg_list = parse_command_line_args(option_param->v.string); } return ret_val; } int add_process_config(t_process_info_list *list_param, struct uci_option *option_param) { int ret_val; t_process_info *new_item; ret_val = -1; new_item = parse_process_info(option_param); if (new_item != NULL) { if (list_param->last_item != NULL) { list_param->last_item->next = new_item; list_param->last_item = new_item; } else { list_param->first_item = new_item; list_param->last_item = new_item; } list_param->count = list_param->count + 1; ret_val = 0; } return ret_val; } t_process_info_list *get_process_config_list() { char **config_list; char **config_file; int err_flg; struct uci_context *ctx; struct uci_package *pkg; struct uci_section *section; struct uci_option *option; t_process_info_list *ret_val; ret_val = calloc(1, sizeof(t_process_info_list)); ctx = uci_alloc_context(); if (ctx != NULL) { uci_set_confdir(ctx, CONST_SERVICE_DIRECTORY_LOCATION); config_list = NULL; err_flg = uci_list_configs(ctx, &config_list); if ((err_flg == UCI_OK) && (config_list != NULL)) { for (config_file = config_list; *config_file != NULL; config_file++) { err_flg = uci_load(ctx, *config_file, &pkg); if (err_flg == UCI_OK) { section = uci_lookup_section(ctx, pkg, "service"); if (section != NULL) { option = uci_lookup_option(ctx, section, "ExecStart"); switch (option->type) { case UCI_TYPE_STRING: log_info("config file: %s name: %s, value: %s\n", *config_file, option->e.name, option->v.string); add_process_config(ret_val, option); break; default: log_error("config file: can not parse parameter value"); break; } } //int num_sections = _uci_show_package(*config_file, result); //printf("Queried package: %s -> %d\n", *config_file, num_sections); } uci_unload(ctx, pkg); } // free config_files /* for (config_file = config_list; *config_file != NULL; config_file++) { free(config_file); } */ free(config_list); } else { log_error("Failed to read service configurations from directory: %s\n", CONST_SERVICE_DIRECTORY_LOCATION); } uci_free_context(ctx); } else { log_error("Failed to read service configurations from directory: %s\n Memory allocation error.", CONST_SERVICE_DIRECTORY_LOCATION); } return ret_val; } void release_process_config_arg_list(t_process_arg_list *arg_list_param) { int ii; for (ii = 0; ii < arg_list_param->count; ii++) { if (arg_list_param->arg_arr[ii] != NULL) { free(arg_list_param->arg_arr[ii]); arg_list_param->arg_arr[ii] = NULL; } } free(arg_list_param->arg_arr); arg_list_param->count = 0; free(arg_list_param); } void release_process_config_list(t_process_info_list *list_param) { t_process_info *item; t_process_info *next; if (list_param != NULL) { item = list_param->first_item; while (item != NULL) { next = item->next; item->next = NULL; release_process_config_arg_list(item->arg_list); item->arg_list = NULL; free(item); item = next; } list_param->first_item = NULL; list_param->last_item = NULL; free(list_param); } }