00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifndef _WIN32
00036 #include "config.h"
00037 #else
00038 #include "winconfig.h"
00039 #endif
00040
00041 #include <stdio.h>
00042 #include <stdlib.h>
00043 #include <string.h>
00044 #include "include/agent_file_data.h"
00045 #include "include/agent_task.h"
00046 #include "include/mc_error.h"
00047 #include "mc_list/list.h"
00048
00049 agent_task_p
00050 agent_task_New(void)
00051 {
00052 agent_task_p task;
00053 task = (agent_task_p)malloc(sizeof(agent_task_t));
00054 if(task == NULL) {
00055 fprintf(stderr, "Memory Error. %s:%d\n", __FILE__, __LINE__);
00056 } else {
00057 memset(task, 0, sizeof(agent_task_t));
00058 }
00059 task->agent_variable_list = ListInitialize();
00060
00061 task->saved_variables = NULL;
00062 task->num_saved_variables = 0;
00063
00064 task->agent_file_list = ListInitialize();
00065
00066 return task;
00067 }
00068
00069 agent_task_p
00070 agent_task_Copy(agent_task_p task)
00071 {
00072 int i;
00073 interpreter_variable_data_t* interp_data;
00074 agent_task_p cp_task;
00075 cp_task = (agent_task_p)malloc(sizeof(agent_task_t));
00076
00077 cp_task->number_of_elements = task->number_of_elements;
00078 cp_task->size_of_element_array = task->size_of_element_array;
00079 cp_task->persistent = task->persistent;
00080 cp_task->init_agent_status = task->init_agent_status;
00081
00082 cp_task->var_name = (char*)malloc
00083 (
00084 sizeof(char) *
00085 (strlen(task->var_name) + 1)
00086 );
00087 strcpy(cp_task->var_name, task->var_name);
00088
00089 cp_task->server_name = (char*)malloc
00090 (
00091 sizeof(char) *
00092 (strlen(task->server_name) + 1)
00093 );
00094 strcpy(cp_task->server_name, task->server_name);
00095
00096 if (task->code_id != NULL) {
00097 cp_task->code_id = (char*)malloc
00098 (
00099 sizeof(char) *
00100 (strlen(task->code_id) + 1)
00101 );
00102 strcpy(cp_task->code_id, task->code_id);
00103 } else {
00104 cp_task->code_id = NULL;
00105 }
00106
00107 if(task->agent_return_data != NULL) {
00108 cp_task->agent_return_data = interpreter_variable_data_Copy(task->agent_return_data);
00109 }
00110
00111
00112 cp_task->agent_variable_list = ListInitialize();
00113 ListWRLock(task->agent_variable_list);
00114 for(i = 0; i < task->agent_variable_list->size; i++) {
00115 interp_data = (interpreter_variable_data_t*)ListSearch(
00116 (list_p)task->agent_variable_list,
00117 i );
00118 if (interp_data == NULL) { continue; }
00119 interp_data = interpreter_variable_data_Copy(interp_data);
00120 ListAdd(
00121 (list_p)cp_task->agent_variable_list,
00122 interp_data
00123 );
00124 }
00125 ListWRUnlock(task->agent_variable_list);
00126
00127 cp_task->saved_variables = (char**)malloc(sizeof(char*) * (task->num_saved_variables+1));
00128 for(i = 0; i < task->num_saved_variables; i++) {
00129 cp_task->saved_variables[i] = strdup(task->saved_variables[i]);
00130 }
00131 cp_task->saved_variables[i] = NULL;
00132 cp_task->num_saved_variables = task->num_saved_variables;
00133
00134 ListRDLock(task->agent_file_list);
00135 cp_task->agent_file_list =
00136 ListCopy(task->agent_file_list, (ListElemCopyFunc_t)agent_file_data_Copy);
00137 ListRDUnlock(task->agent_file_list);
00138
00139 return cp_task;
00140 }
00141
00142 int
00143 agent_task_Destroy( agent_task_p agent_task )
00144 {
00145 int i;
00146 if(agent_task == NULL) {
00147 return MC_SUCCESS;
00148 }
00149 if (agent_task->var_name != NULL) {
00150 free(agent_task->var_name);
00151 }
00152 if (agent_task->server_name != NULL) {
00153 free(agent_task->server_name);
00154 }
00155 if (agent_task->code_id != NULL) {
00156 free(agent_task->code_id);
00157 }
00158
00159 ListWRLock(agent_task->agent_variable_list);
00160 ListClearCB(agent_task->agent_variable_list,
00161 (ListElemDestroyFunc_t)interpreter_variable_data_Destroy);
00162 ListTerminate(agent_task->agent_variable_list);
00163 ListWRUnlock(agent_task->agent_variable_list);
00164
00165 if(agent_task->saved_variables != NULL) {
00166 for(i = 0; agent_task->saved_variables[i] != NULL; i++) {
00167 free(agent_task->saved_variables[i]);
00168 }
00169 free(agent_task->saved_variables);
00170 }
00171
00172 interpreter_variable_data_Destroy(agent_task->agent_return_data);
00173
00174 ListWRLock(agent_task->agent_file_list);
00175 ListClearCB(agent_task->agent_file_list,
00176 (ListElemDestroyFunc_t)agent_file_data_Destroy);
00177 ListTerminate(agent_task->agent_file_list);
00178 ListWRUnlock(agent_task->agent_file_list);
00179
00180 free(agent_task);
00181
00182 return MC_SUCCESS;
00183 }
00184