4 * Created on: Sep 16, 2010
14 #include "process_parser.h"
16 t_process_arg_list *parse_command_line_args(char *cmd_line_param) {
20 t_process_arg_list *ret_val;
23 if (cmd_line_param != NULL) {
24 ret_val = calloc(1, sizeof(t_process_arg_list));
25 line_pointer = cmd_line_param;
26 while(*line_pointer != '\0') {
27 while((*line_pointer == ' ') ||
28 (*line_pointer == '\t')) {
31 if (*line_pointer != '\0') {
32 if (ret_val->arg_arr == NULL) {
33 ret_val->arg_arr = calloc(1, sizeof(char *));
38 arg_arr = ret_val->arg_arr;
39 arg_arr = realloc(arg_arr, (ret_val->count + 1) * sizeof(char *));
40 ret_val->arg_arr = arg_arr;
44 while((*++line_pointer != '\0') &&
45 (*line_pointer != ' ') &&
46 (*line_pointer != '\t')) {
49 ret_val->arg_arr[ret_val->count] = strndup(start, len);
50 printf("ret_val[%d] = %s\n", ret_val->count, ret_val->arg_arr[ret_val->count]);
51 ret_val->count = ret_val->count + 1;
57 // terminate list with null
58 ret_val->arg_arr = realloc(ret_val->arg_arr, (ret_val->count + 1) * sizeof(char *));
59 ret_val->arg_arr[ret_val->count] = NULL;
60 ret_val->count = ret_val->count + 1;
65 t_process_info *parse_process_info(struct uci_option *option_param) {
66 t_process_info *ret_val;
69 if (option_param->type == UCI_TYPE_STRING) {
70 ret_val = calloc(1, sizeof(t_process_info));
71 ret_val->arg_list = parse_command_line_args(option_param->v.string);
76 int add_process_config(t_process_info_list *list_param, struct uci_option *option_param) {
78 t_process_info *new_item;
81 new_item = parse_process_info(option_param);
82 if (new_item != NULL) {
83 if (list_param->last_item != NULL) {
84 list_param->last_item->next = new_item;
85 list_param->last_item = new_item;
88 list_param->first_item = new_item;
89 list_param->last_item = new_item;
91 list_param->count = list_param->count + 1;
97 t_process_info_list *get_process_config_list() {
101 struct uci_context *ctx;
102 struct uci_package *pkg;
103 struct uci_section *section;
104 struct uci_option *option;
105 t_process_info_list *ret_val;
107 ret_val = calloc(1, sizeof(t_process_info_list));
108 ctx = uci_alloc_context();
110 uci_set_confdir(ctx, CONST_SERVICE_DIRECTORY_LOCATION);
112 err_flg = uci_list_configs(ctx, &config_list);
113 if ((err_flg == UCI_OK) &&
114 (config_list != NULL)) {
115 for (config_file = config_list; *config_file != NULL; config_file++) {
116 err_flg = uci_load(ctx, *config_file, &pkg);
117 if (err_flg == UCI_OK) {
118 section = uci_lookup_section(ctx, pkg, "service");
119 if (section != NULL) {
120 option = uci_lookup_option(ctx, section, "ExecStart");
121 switch (option->type) {
122 case UCI_TYPE_STRING:
123 printf("config file: %s name: %s, value: %s\n", *config_file, option->e.name, option->v.string);
124 add_process_config(ret_val, option);
130 //int num_sections = _uci_show_package(*config_file, result);
131 //printf("Queried package: %s -> %d\n", *config_file, num_sections);
133 uci_unload(ctx, pkg);
137 for (config_file = config_list; *config_file != NULL; config_file++) {
144 printf("Failed to read service configurations from directory: %s\n", CONST_SERVICE_DIRECTORY_LOCATION);
146 uci_free_context(ctx);
149 printf("Failed to read service configurations from directory: %s\n Memory allocation error.", CONST_SERVICE_DIRECTORY_LOCATION);
154 void release_process_config_arg_list(t_process_arg_list *arg_list_param) {
157 for (ii = 0; ii < arg_list_param->count; ii++) {
158 if (arg_list_param->arg_arr[ii] != NULL) {
159 free(arg_list_param->arg_arr[ii]);
160 arg_list_param->arg_arr[ii] = NULL;
163 free(arg_list_param->arg_arr);
164 arg_list_param->count = 0;
165 free(arg_list_param);
168 void release_process_config_list(t_process_info_list *list_param) {
169 t_process_info *item;
170 t_process_info *next;
172 if (list_param != NULL) {
173 item = list_param->first_item;
174 while (item != NULL) {
177 release_process_config_arg_list(item->arg_list);
178 item->arg_list = NULL;
182 list_param->first_item = NULL;
183 list_param->last_item = NULL;