Skip to content

File broker_admin_so.c

File List > broker > broker_admin_so.c

Go to the documentation of this file

/*
 * Copyright 2008 Search Solution Corporation
 * Copyright 2016 CUBRID Corporation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */


/*
 * broker_admin_so.c -
 */

#ident "$Id$"

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>

#if defined(WINDOWS)
#include <winsock2.h>
#include <windows.h>
#endif /* WINDOWS */

#include "porting.h"
#include "cas_common.h"
#include "broker_admin_so.h"
#include "broker_filename.h"

#include "broker_config.h"
#include "broker_util.h"
#include "broker_admin_pub.h"
#include "broker_shm.h"
#include "broker_process_size.h"
#include "broker_process_info.h"
#if defined(WINDOWS)
#include "broker_wsa_init.h"
#endif /* WINDOWS */

#define UC_CONF_PARAM_MASTER_SHM_ID     "MASTER_SHM_ID"
#define UC_CONF_PARAM_ADMIN_LOG_FILE        "ADMIN_LOG_FILE"

#define UC_CONF_PARAM_BROKER_NAME       "%"
#define UC_CONF_PARAM_SERVICE           "SERVICE"
#define UC_CONF_PARAM_APPL_SERVER       "APPL_SERVER"
#define UC_CONF_PARAM_BROKER_PORT       "BROKER_PORT"
#define UC_CONF_PARAM_MIN_NUM_APPL_SERVER   "MIN_NUM_APPL_SERVER"
#define UC_CONF_PARAM_MAX_NUM_APPL_SERVER   "MAX_NUM_APPL_SERVER"
#define UC_CONF_PARAM_AUTO_ADD_APPL_SERVER  "AUTO_ADD_APPL_SERVER"
#define UC_CONF_PARAM_APPL_SERVER_SHM_ID    "APPL_SERVER_SHM_ID"
#define UC_CONF_PARAM_APPL_SERVER_MAX_SIZE  "APPL_SERVER_MAX_SIZE"
#define UC_CONF_PARAM_APPL_SERVER_HARD_LIMIT    "APPL_SERVER_MAX_SIZE_HARD_LIMIT"
#define UC_CONF_PARAM_LOG_DIR           "LOG_DIR"
#define UC_CONF_PARAM_SLOW_LOG_DIR      "SLOW_LOG_DIR"
#define UC_CONF_PARAM_ERROR_LOG_DIR     "ERROR_LOG_DIR"
#define UC_CONF_PARAM_LOG_BACKUP        "LOG_BACKUP"
#define UC_CONF_PARAM_SOURCE_ENV        "SOURCE_ENV"
#define UC_CONF_PARAM_ACCESS_LOG        "ACCESS_LOG"
#define UC_CONF_PARAM_SQL_LOG           "SQL_LOG"
#define UC_CONF_PARAM_SLOW_LOG          "SLOW_LOG"
#define UC_CONF_PARAM_LONG_QUERY_TIME           "LONG_QUERY_TIME"
#define UC_CONF_PARAM_LONG_TRANSACTION_TIME     "LONG_TRANSACTION_TIME"
#define UC_CONF_PARAM_TIME_TO_KILL      "TIME_TO_KILL"
#define UC_CONF_PARAM_SESSION_TIMEOUT       "SESSION_TIMEOUT"
#define UC_CONF_PARAM_JOB_QUEUE_SIZE        "JOB_QUEUE_SIZE"
#define UC_CONF_PARAM_ACCESS_LIST       "ACCESS_LIST"
#define UC_CONF_PARAM_SQL_LOG2          "SQL_LOG2"
#define UC_CONF_PARAM_MAX_STRING_LENGTH     "MAX_STRING_LENGTH"
#define UC_CONF_PARAM_STRIPPED_COLUMN_NAME  "STRIPPED_COLUMN_NAME"
#define UC_CONF_PARAM_KEEP_CONNECTION       "KEEP_CONNECTION"
#define UC_CONF_PARAM_SQL_LOG_MAX_SIZE      "SQL_LOG_MAX_SIZE"

#define MAX_NUM_CONF    35

#define SET_CONF_ITEM(CONF_ITEM, IDX, NAME, VALUE)  \
    do {                        \
      (CONF_ITEM)[IDX].name = NAME;         \
      (CONF_ITEM)[IDX].value = VALUE;       \
      (IDX)++;                  \
    } while (0)

#define SET_CONF_ITEM_ONOFF(CONF_ITEM, IDX, NAME, VALUE)    \
    do {                            \
      if ((VALUE) == ON)                    \
        SET_CONF_ITEM(CONF_ITEM, IDX, NAME, strdup("ON"));  \
      else                          \
        SET_CONF_ITEM(CONF_ITEM, IDX, NAME, strdup("OFF")); \
    } while (0)

#define SET_CONF_ITEM_SQL_LOG_MODE(CONF_ITEM, IDX, NAME, VALUE) \
        do {                                                    \
          const char *_macro_tmp_ptr;                           \
          if ((VALUE) & SQL_LOG_MODE_ALL)                        \
            _macro_tmp_ptr = "ALL";                              \
          else if ((VALUE) & SQL_LOG_MODE_ERROR)                \
            _macro_tmp_ptr = "ERROR";                           \
          else /*((VALUE) == SQL_LOG_MODE_NONE)*/                \
            _macro_tmp_ptr = "NONE";                             \
          SET_CONF_ITEM(CONF_ITEM, IDX, NAME, strdup(_macro_tmp_ptr));  \
        } while (0)

#define SET_CONF_ITEM_KEEP_CON(CONF_ITEM, IDX, NAME, VALUE)             \
        do {                                \
          const char *_macro_tmp_ptr;                       \
          if ((VALUE) == KEEP_CON_AUTO)                 \
            _macro_tmp_ptr = "AUTO";                    \
          else                              \
            _macro_tmp_ptr = "ON";                  \
      SET_CONF_ITEM(CONF_ITEM, IDX, NAME, strdup(_macro_tmp_ptr));  \
        } while (0)

#define FMT_D "%d"
#define FMT_X "%X"
#define SET_CONF_ITEM_INT(CONF_ITEM, IDX, NAME, VALUE, FMT) \
    do {                        \
      char  _macro_tmp_buf[32];         \
      sprintf(_macro_tmp_buf, FMT, (VALUE));    \
      SET_CONF_ITEM(CONF_ITEM, IDX, NAME, strdup(_macro_tmp_buf));  \
    } while (0)

#define SET_CONF_ITEM_STR(CONF_ITEM, IDX, NAME, VALUE)      \
    do {                            \
      SET_CONF_ITEM(CONF_ITEM, IDX, NAME, strdup(VALUE));   \
    } while (0)

#define SET_FLAG(ONOFF)     ((ONOFF) == ON ? FLAG_ON : FLAG_OFF)

#define CP_ADMIN_ERR_MSG(BUF)   sprintf(BUF, "Error: %s", admin_err_msg)

static void admin_log_write (const char *log_file, const char *msg);
static int admin_common (T_BROKER_INFO * br_info, int *num_broker, int *master_shm_id, char *admin_log_file,
             char *err_msg, char admin_flag, bool * acl_flag, char *acl_file, bool * acl_default_policy);
static int copy_job_info (T_JOB_INFO ** job_info, T_MAX_HEAP_NODE * job_q);
static int conf_copy_header (T_UC_CONF * unicas_conf, int master_shm_id, char *admin_log_file, char *err_msg);
static int conf_copy_broker (T_UC_CONF * unicas_conf, T_BROKER_INFO * br_conf, int num_br, char *err_msg);
static void conf_item_free (T_UC_CONF_ITEM * conf_item, int num);
static char *get_broker_name (T_BR_CONF * br_conf);
static const char *get_as_type_str (char as_type);
static void change_conf_as_type (T_BR_CONF * br_conf, int old_as_type, int new_as_type);
static void reset_conf_value (int num_item, T_UC_CONF_ITEM * item, const char *name);
static int get_as_type (const char *type_str);
static int uc_changer_internal (const char *br_name, const char *name, const char *value, int as_number, char *err_msg);

#define CHECK_SHARED_MEMORY(p_shm, err_msg)             \
    do {                                                \
        if (!p_shm) {                                   \
            if (err_msg)  strcpy(err_msg, "Shared memory is not opened."); \
            return -1;                                  \
        }                                               \
    } while (0)

DLL_EXPORT void *
uc_broker_shm_open (char *err_msg)
{
  T_BROKER_INFO br_conf[MAX_BROKER_NUM];
  int num_broker, master_shm_id;
  char admin_log_file[BROKER_PATH_MAX];
  void *ret_val;

  if (admin_common (br_conf, &num_broker, &master_shm_id, admin_log_file, err_msg, 0, NULL, NULL, NULL) < 0)
    {
      return NULL;
    }
  ret_val = uw_shm_open (master_shm_id, SHM_BROKER, SHM_MODE_ADMIN);
  if (!ret_val && err_msg)
    {
      strcpy (err_msg, strerror (errno));
    }
  return ret_val;
}

DLL_EXPORT int
uc_get_br_num_with_opened_shm (void *shm_br, char *err_msg)
{
  CHECK_SHARED_MEMORY (shm_br, err_msg);
  return ((T_SHM_BROKER *) shm_br)->num_broker;
}

DLL_EXPORT int
uc_get_br_name_with_opened_shm (void *shm_br, int br_index, char *name, int buffer_size, char *err_msg)
{
  CHECK_SHARED_MEMORY (shm_br, err_msg);
  if (name == NULL)
    {
      if (err_msg)
    {
      strcpy (err_msg, "Invalid name buffer.");
    }
      return -1;
    }

  strncpy (name, ((T_SHM_BROKER *) shm_br)->br_info[br_index].name, buffer_size);
  return 1;
}

DLL_EXPORT void *
uc_as_shm_open (void *shm_br, int br_index, char *err_msg)
{
  void *ret_val;

  if (shm_br == NULL)
    {
      if (err_msg)
    {
      strcpy (err_msg, "Shared memory is not opened.");
    }
      return NULL;
    }

  ret_val = uw_shm_open (((T_SHM_BROKER *) shm_br)->br_info[br_index].appl_server_shm_id, SHM_APPL_SERVER,
             SHM_MODE_MONITOR);
  if (!ret_val && err_msg)
    {
      strcpy (err_msg, strerror (errno));
    }
  return ret_val;
}

DLL_EXPORT int
uc_get_as_num_with_opened_shm (void *shm_br, int br_index, char *err_msg)
{
  CHECK_SHARED_MEMORY (shm_br, err_msg);
  return ((T_SHM_BROKER *) shm_br)->br_info[br_index].appl_server_max_num;
}

DLL_EXPORT int
uc_get_as_reqs_received_with_opened_shm (void *shm_as, long long array[], int array_size, char *err_msg)
{
  /* return value -2 means that array_size is different from real as num (as add or remove ...) so coller must reset
   * array[] info and after, recall this function */
  int i;

  CHECK_SHARED_MEMORY (shm_as, err_msg);
/*
  if (array_size != ((T_SHM_APPL_SERVER*)shm_as)->num_appl_server) {
    if (err_msg) strcpy(err_msg, "Invalid array_size.");
    return -2;
  }
*/
  for (i = 0; i < array_size; i++)
    {
      array[i] = ((T_SHM_APPL_SERVER *) shm_as)->as_info[i].num_requests_received;
    }

  return 1;
}

DLL_EXPORT int
uc_get_active_session_with_opened_shm (void *shm_p, char *err_msg)
{
  T_SHM_BROKER *shm_br = (T_SHM_BROKER *) shm_p;
  int num_ses = 0, i;

  CHECK_SHARED_MEMORY (shm_br, err_msg);

  for (i = 0; i < shm_br->num_broker; i++)
    {
      if (shm_br->br_info[i].service_flag == ON)
    {
      num_ses += shm_br->br_info[i].num_busy_count;
    }
    }

  return num_ses;
}

DLL_EXPORT int
uc_get_as_tran_processed_with_opened_shm (void *shm_as, long long array[], int array_size, char *err_msg)
{
  int i;

  CHECK_SHARED_MEMORY (shm_as, err_msg);

  for (i = 0; i < array_size; i++)
    {
      array[i] = ((T_SHM_APPL_SERVER *) shm_as)->as_info[i].num_transactions_processed;
    }

  return 1;
}

DLL_EXPORT int
uc_get_as_query_processed_with_opened_shm (void *shm_as, long long array[], int array_size, char *err_msg)
{
  int i;

  CHECK_SHARED_MEMORY (shm_as, err_msg);

  for (i = 0; i < array_size; i++)
    {
      array[i] = ((T_SHM_APPL_SERVER *) shm_as)->as_info[i].num_queries_processed;
    }

  return 1;
}

DLL_EXPORT void
uc_shm_detach (void *p)
{
  uw_shm_detach (p);
}

DLL_EXPORT const char *
uc_version ()
{
  return makestring (BUILD_NUMBER);
}

DLL_EXPORT int
uc_start (char *err_msg)
{
  T_BROKER_INFO br_info[MAX_BROKER_NUM];
  int num_broker, master_shm_id;
  char admin_log_file[BROKER_PATH_MAX];
  char acl_file[BROKER_PATH_MAX];
  bool acl_flag, acl_default_policy;

  if (admin_common
      (br_info, &num_broker, &master_shm_id, admin_log_file, err_msg, 1, &acl_flag, acl_file, &acl_default_policy) < 0)
    {
      return -1;
    }

  if (admin_start_cmd (br_info, num_broker, master_shm_id, acl_flag, acl_file, acl_default_policy, admin_log_file) < 0)
    {
      CP_ADMIN_ERR_MSG (err_msg);
      return -1;
    }

  admin_log_write (admin_log_file, "start");

  return 0;
}

DLL_EXPORT int
uc_stop (char *err_msg)
{
  T_BROKER_INFO br_info[MAX_BROKER_NUM];
  int num_broker, master_shm_id;
  char admin_log_file[BROKER_PATH_MAX];

  if (admin_common (br_info, &num_broker, &master_shm_id, admin_log_file, err_msg, 1, NULL, NULL, NULL) < 0)
    {
      return -1;
    }

  if (admin_stop_cmd (master_shm_id) < 0)
    {
      CP_ADMIN_ERR_MSG (err_msg);
      return -1;
    }

  admin_log_write (admin_log_file, "stop");

  return 0;
}

DLL_EXPORT int
uc_add (const char *br_name, char *err_msg)
{
  T_BROKER_INFO br_info[MAX_BROKER_NUM];
  int num_broker, master_shm_id;
  char admin_log_file[BROKER_PATH_MAX];
  char msg_buf[256];

  if (admin_common (br_info, &num_broker, &master_shm_id, admin_log_file, err_msg, 1, NULL, NULL, NULL) < 0)
    {
      return -1;
    }

  if (admin_add_cmd (master_shm_id, br_name) < 0)
    {
      CP_ADMIN_ERR_MSG (err_msg);
      return -1;
    }

  sprintf (msg_buf, "add %s", br_name);
  admin_log_write (admin_log_file, msg_buf);

  return 0;
}

DLL_EXPORT int
uc_restart (const char *br_name, int as_index, char *err_msg)
{
  T_BROKER_INFO br_info[MAX_BROKER_NUM];
  int num_broker, master_shm_id;
  char admin_log_file[BROKER_PATH_MAX];
  char msg_buf[256];

  if (admin_common (br_info, &num_broker, &master_shm_id, admin_log_file, err_msg, 1, NULL, NULL, NULL) < 0)
    {
      return -1;
    }

  if (admin_restart_cmd (master_shm_id, br_name, as_index) < 0)
    {
      CP_ADMIN_ERR_MSG (err_msg);
      return -1;
    }

  sprintf (msg_buf, "restart %s %d", br_name, as_index);
  admin_log_write (admin_log_file, msg_buf);

  return 0;
}

DLL_EXPORT int
uc_drop (const char *br_name, char *err_msg)
{
  T_BROKER_INFO br_info[MAX_BROKER_NUM];
  int num_broker, master_shm_id;
  char admin_log_file[256];
  char msg_buf[256];

  if (admin_common (br_info, &num_broker, &master_shm_id, admin_log_file, err_msg, 1, NULL, NULL, NULL) < 0)
    {
      return -1;
    }

  if (admin_drop_cmd (master_shm_id, br_name) < 0)
    {
      CP_ADMIN_ERR_MSG (err_msg);
      return -1;
    }

  sprintf (msg_buf, "drop %s", br_name);
  admin_log_write (admin_log_file, msg_buf);

  return 0;
}

DLL_EXPORT int
uc_on (const char *br_name, char *err_msg)
{
  T_BROKER_INFO br_info[MAX_BROKER_NUM];
  int num_broker, master_shm_id;
  char admin_log_file[BROKER_PATH_MAX];
  char msg_buf[256];

  if (admin_common (br_info, &num_broker, &master_shm_id, admin_log_file, err_msg, 1, NULL, NULL, NULL) < 0)
    {
      return -1;
    }

  if (admin_on_cmd (master_shm_id, br_name) < 0)
    {
      CP_ADMIN_ERR_MSG (err_msg);
      return -1;
    }

  sprintf (msg_buf, "%s on", br_name);
  admin_log_write (admin_log_file, msg_buf);

  return 0;
}

DLL_EXPORT int
uc_off (const char *br_name, char *err_msg)
{
  T_BROKER_INFO br_info[MAX_BROKER_NUM];
  int num_broker, master_shm_id;
  char admin_log_file[BROKER_PATH_MAX];
  char msg_buf[256];

  if (admin_common (br_info, &num_broker, &master_shm_id, admin_log_file, err_msg, 1, NULL, NULL, NULL) < 0)
    {
      return -1;
    }

  if (admin_off_cmd (master_shm_id, br_name) < 0)
    {
      CP_ADMIN_ERR_MSG (err_msg);
      return -1;
    }

  sprintf (msg_buf, "%s off", br_name);
  admin_log_write (admin_log_file, msg_buf);

  return 0;
}

DLL_EXPORT int
uc_as_info (const char *br_name, T_AS_INFO ** ret_as_info, T_JOB_INFO ** job_info, int *num_job, char *err_msg)
{
  T_BROKER_INFO br_info[MAX_BROKER_NUM];
  int num_broker, master_shm_id;
  char admin_log_file[BROKER_PATH_MAX];
  T_SHM_BROKER *shm_br = NULL;
  T_SHM_APPL_SERVER *shm_appl = NULL;
  int br_index, i, appl_shm_key;
  int num_as;
  T_AS_INFO *as_info = NULL;
  char client_ip_str[16];

  if (admin_common (br_info, &num_broker, &master_shm_id, admin_log_file, err_msg, 0, NULL, NULL, NULL) < 0)
    {
      return -1;
    }

  shm_br = (T_SHM_BROKER *) uw_shm_open (master_shm_id, SHM_BROKER, SHM_MODE_ADMIN);
  if (shm_br == NULL)
    {
      strcpy (err_msg, "Error: shared memory open error");
      return -1;
    }
  br_index = -1;
  for (i = 0; i < shm_br->num_broker; i++)
    {
      if (strcasecmp (br_name, shm_br->br_info[i].name) == 0)
    {
      appl_shm_key = shm_br->br_info[i].appl_server_shm_id;
      br_index = i;
      break;
    }
    }
  if (br_index < 0)
    {
      sprintf (err_msg, "Error: cannot find broker [%s]", br_name);
      goto as_info_error;
    }
  shm_appl = (T_SHM_APPL_SERVER *) uw_shm_open (appl_shm_key, SHM_APPL_SERVER, SHM_MODE_ADMIN);
  if (shm_appl == NULL)
    {
      strcpy (err_msg, "Error: shared memory open error");
      goto as_info_error;
    }

  num_as = shm_br->br_info[br_index].appl_server_max_num;
  as_info = (T_AS_INFO *) malloc (sizeof (T_AS_INFO) * num_as);
  if (as_info == NULL)
    {
      strcpy (err_msg, strerror (errno));
      goto as_info_error;
    }
  memset (as_info, 0, sizeof (T_AS_INFO) * num_as);

  for (i = 0; i < shm_br->br_info[br_index].appl_server_max_num; i++)
    {
      T_PSINFO proc_info;

      as_info[i].service_flag = shm_appl->as_info[i].service_flag;
      if (shm_appl->as_info[i].service_flag != SERVICE_ON)
    {
      continue;
    }

      as_info[i].pid = shm_appl->as_info[i].pid;
      as_info[i].psize = getsize (as_info[i].pid);
      memset (&proc_info, 0, sizeof (T_PSINFO));
      get_psinfo (as_info[i].pid, &proc_info);
      as_info[i].num_thr = proc_info.num_thr;
      as_info[i].cpu_time = proc_info.cpu_time;
      as_info[i].pcpu = proc_info.pcpu;
      as_info[i].num_request = shm_appl->as_info[i].num_request;
#if defined(WINDOWS)
      if (shm_appl->use_pdh_flag == TRUE)
    {
      float pct_cpu;

      pct_cpu = shm_appl->as_info[i].pdh_pct_cpu;
      if (pct_cpu >= 0)
        {
          as_info[i].pcpu = pct_cpu;
        }
      as_info[i].psize = shm_appl->as_info[i].pdh_workset;
      as_info[i].cpu_time = shm_appl->as_info[i].cpu_time;
    }
#endif /* WINDOWS */
#if defined(WINDOWS)
      as_info[i].as_port = shm_appl->as_info[i].as_port;
#else /* WINDOWS */
      as_info[i].as_port = 0;
#endif /* WINDOWS */
      if (shm_appl->as_info[i].uts_status == UTS_STATUS_BUSY)
    {
      if (IS_APPL_SERVER_TYPE_CAS (shm_br->br_info[br_index].appl_server))
        {
          if (shm_appl->as_info[i].con_status == CON_STATUS_OUT_TRAN)
        {
          as_info[i].status = AS_STATUS_CLOSE_WAIT;
        }
          else if (shm_appl->as_info[i].log_msg[0] == '\0')
        {
          as_info[i].status = AS_STATUS_CLIENT_WAIT;
        }
          else
        {
          as_info[i].status = AS_STATUS_BUSY;
        }
        }
      else
        {
          as_info[i].status = AS_STATUS_BUSY;
        }
    }
#if defined(WINDOWS)
      else if (shm_appl->as_info[i].uts_status == UTS_STATUS_BUSY_WAIT)
    {
      as_info[i].status = AS_STATUS_BUSY;
    }
#endif /* WINDOWS */
      else if (shm_appl->as_info[i].uts_status == UTS_STATUS_RESTART)
    {
      as_info[i].status = AS_STATUS_RESTART;
    }
      else
    {
      as_info[i].status = AS_STATUS_IDLE;
    }

      as_info[i].last_access_time = shm_appl->as_info[i].last_access_time;
      as_info[i].last_connect_time = shm_appl->as_info[i].last_connect_time;
      as_info[i].num_requests_received = shm_appl->as_info[i].num_requests_received;
      as_info[i].num_queries_processed = shm_appl->as_info[i].num_queries_processed;
      as_info[i].num_transactions_processed = shm_appl->as_info[i].num_transactions_processed;
      as_info[i].num_long_queries = shm_appl->as_info[i].num_long_queries;
      as_info[i].num_long_transactions = shm_appl->as_info[i].num_long_transactions;
      as_info[i].num_error_queries = shm_appl->as_info[i].num_error_queries;
      as_info[i].num_interrupts = shm_appl->as_info[i].num_interrupts;

      ut_get_ipv4_string (client_ip_str, sizeof (client_ip_str), shm_appl->as_info[i].cas_clt_ip);
      strncpy (as_info[i].clt_ip_addr, client_ip_str, sizeof (as_info[i].clt_ip_addr) - 1);

      strncpy (as_info[i].database_host, shm_appl->as_info[i].database_host, sizeof (as_info[i].database_host) - 1);
      strncpy (as_info[i].database_name, shm_appl->as_info[i].database_name, sizeof (as_info[i].database_name) - 1);

      strncpy (as_info[i].clt_appl_name, shm_appl->as_info[i].clt_appl_name, sizeof (as_info[i].clt_appl_name) - 1);
      strncpy (as_info[i].request_file, shm_appl->as_info[i].clt_req_path_info, sizeof (as_info[i].request_file) - 1);

      strncpy (as_info[i].log_msg, shm_appl->as_info[i].log_msg, sizeof (as_info[i].log_msg) - 1);
    }

  if (job_info)
    {
      T_MAX_HEAP_NODE job_q[JOB_QUEUE_MAX_SIZE + 1];

      memcpy (job_q, shm_appl->job_queue, sizeof (T_MAX_HEAP_NODE) * (JOB_QUEUE_MAX_SIZE + 1));
      *num_job = copy_job_info (job_info, job_q);
    }
  else if (num_job)
    {
      *num_job = shm_appl->job_queue[0].id;
    }

  uw_shm_detach (shm_appl);
  uw_shm_detach (shm_br);

  *ret_as_info = as_info;
  return (num_as);

as_info_error:
  if (shm_appl)
    {
      uw_shm_detach (shm_appl);
    }
  if (shm_br)
    {
      uw_shm_detach (shm_br);
    }
  uc_info_free (as_info);
  return -1;
}

DLL_EXPORT void
uc_info_free (void *info)
{
  FREE_MEM (info);
}

DLL_EXPORT int
uc_br_info (T_BR_INFO ** ret_br_info, char *err_msg)
{
  T_BROKER_INFO br_conf[MAX_BROKER_NUM];
  T_SHM_BROKER *shm_br;
  int num_broker, master_shm_id;
  char admin_log_file[BROKER_PATH_MAX];
  int i, num_br;
  T_BR_INFO *br_info = NULL;
  char *p;

  if (admin_common (br_conf, &num_broker, &master_shm_id, admin_log_file, err_msg, 0, NULL, NULL, NULL) < 0)
    {
      return -1;
    }

  shm_br = (T_SHM_BROKER *) uw_shm_open (master_shm_id, SHM_BROKER, SHM_MODE_ADMIN);
  if (shm_br == NULL)
    {
      strcpy (err_msg, "ERROR: shared memory open error");
      return -1;
    }
  num_br = shm_br->num_broker;
  if (num_br < 1 || num_br > MAX_BROKER_NUM)
    {
      goto br_info_error;
    }
  br_info = (T_BR_INFO *) malloc (sizeof (T_BR_INFO) * num_br);
  if (br_info == NULL)
    {
      goto br_info_error;
    }
  memset (br_info, 0, sizeof (T_BR_INFO) * num_br);
  for (i = 0; i < num_br; i++)
    {
      strncpy (br_info[i].name, shm_br->br_info[i].name, sizeof (br_info[i].name) - 1);
      strcpy (br_info[i].as_type, get_as_type_str (shm_br->br_info[i].appl_server));
      br_info[i].status = SET_FLAG (shm_br->br_info[i].service_flag);
      if (shm_br->br_info[i].service_flag == ON)
    {
#if !defined(WINDOWS)
      T_PSINFO proc_info;
#endif /* !WINDOWS */
      int num_req, j;
      INT64 num_tran, num_query, num_long_query, num_long_tran, num_error_query, num_interrupts;
      T_SHM_APPL_SERVER *shm_appl;

      shm_appl =
        (T_SHM_APPL_SERVER *) uw_shm_open (shm_br->br_info[i].appl_server_shm_id, SHM_APPL_SERVER, SHM_MODE_ADMIN);
      if (shm_appl == NULL)
        {
          strcpy (err_msg, "ERROR: shared memory open error");
          goto br_info_error;
        }

      br_info[i].pid = shm_br->br_info[i].pid;
      br_info[i].port = shm_br->br_info[i].port;
      br_info[i].num_as = shm_br->br_info[i].appl_server_num;
      br_info[i].max_as = shm_br->br_info[i].appl_server_max_num;
      br_info[i].min_as = shm_br->br_info[i].appl_server_min_num;
      br_info[i].num_job_q = shm_appl->job_queue[0].id;
      br_info[i].num_busy_count = shm_br->br_info[i].num_busy_count;
#if defined(WINDOWS)
      br_info[i].num_thr = shm_br->br_info[i].pdh_num_thr;
      br_info[i].pcpu = shm_br->br_info[i].pdh_pct_cpu;
      br_info[i].cpu_time = shm_br->br_info[i].cpu_time;
#else /* WINDOWS */
      memset (&proc_info, 0, sizeof (proc_info));
      get_psinfo (br_info[i].pid, &proc_info);
      br_info[i].num_thr = proc_info.num_thr;
      br_info[i].pcpu = proc_info.pcpu;
      br_info[i].cpu_time = proc_info.cpu_time;
#endif /* WINDOWS */

      num_req = 0;
      num_tran = 0;
      num_query = 0;
      num_long_tran = 0;
      num_long_query = 0;
      num_error_query = 0;
      num_interrupts = 0;
      for (j = 0; j < shm_br->br_info[i].appl_server_max_num; j++)
        {
          num_req += shm_appl->as_info[j].num_request;
          num_tran += shm_appl->as_info[j].num_transactions_processed;
          num_query += shm_appl->as_info[j].num_queries_processed;
          num_long_query += shm_appl->as_info[j].num_long_queries;
          num_long_tran += shm_appl->as_info[j].num_long_transactions;
          num_error_query += shm_appl->as_info[j].num_error_queries;
          num_interrupts += shm_appl->as_info[j].num_interrupts;
        }

      br_info[i].num_req = num_req;
      br_info[i].num_tran = num_tran;
      br_info[i].num_query = num_query;
      br_info[i].num_long_query = num_long_query;
      br_info[i].num_long_tran = num_long_tran;
      br_info[i].num_error_query = num_error_query;
      br_info[i].num_interrupts = num_interrupts;

      br_info[i].keep_connection = shm_appl->keep_connection;

      br_info[i].shm_id = shm_br->br_info[i].appl_server_shm_id;
      br_info[i].session_timeout = shm_br->br_info[i].session_timeout;
      br_info[i].auto_add_flag = SET_FLAG (shm_br->br_info[i].auto_add_appl_server);
      br_info[i].sql_log_mode = shm_br->br_info[i].sql_log_mode;
      br_info[i].slow_log_mode = shm_br->br_info[i].slow_log_mode;
      br_info[i].access_mode = shm_br->br_info[i].access_mode;
      br_info[i].long_query_time = shm_br->br_info[i].long_query_time;
      br_info[i].long_transaction_time = shm_br->br_info[i].long_transaction_time;
      strncpy (br_info[i].log_dir, shm_br->br_info[i].access_log_file, sizeof (br_info[i].log_dir) - 1);
      p = strrchr (br_info[i].log_dir, '/');
      if (p != NULL)
        {
          *p = '\0';
        }
      br_info[i].as_max_size = shm_br->br_info[i].appl_server_max_size;
      br_info[i].as_hard_limit = shm_br->br_info[i].appl_server_hard_limit;
      br_info[i].log_backup_flag = shm_br->br_info[i].log_backup;
      br_info[i].time_to_kill = shm_br->br_info[i].time_to_kill;
      uw_shm_detach (shm_appl);
    }
      if (shm_br->br_info[i].acl_file[0] == '\0')
    {
      br_info[i].access_list_flag = 0;
    }
      else
    {
      br_info[i].access_list_flag = 1;
    }

      if (shm_br->br_info[i].source_env[0] == '\0')
    {
      br_info[i].source_env_flag = 0;
    }
      else
    {
      br_info[i].source_env_flag = 1;
    }
    }
  uw_shm_detach (shm_br);

  *ret_br_info = br_info;

  return (num_br);

br_info_error:
  if (shm_br)
    {
      uw_shm_detach (shm_br);
    }
  if (br_info)
    {
      uc_info_free (br_info);
    }
  return -1;
}

DLL_EXPORT int
uc_unicas_conf (T_UC_CONF * unicas_conf, int *ret_mst_shmid, char *err_msg)
{
  T_BROKER_INFO br_conf[MAX_BROKER_NUM];
  int num_broker, master_shm_id;
  char admin_log_file[BROKER_PATH_MAX];

  memset (unicas_conf, 0, sizeof (T_UC_CONF));

  if (admin_common (br_conf, &num_broker, &master_shm_id, admin_log_file, err_msg, 0, NULL, NULL, NULL) < 0)
    {
      return -1;
    }

  if (conf_copy_header (unicas_conf, master_shm_id, admin_log_file, err_msg) < 0)
    {
      return -1;
    }

  if (conf_copy_broker (unicas_conf, br_conf, num_broker, err_msg) < 0)
    {
      return -1;
    }

  if (ret_mst_shmid)
    *ret_mst_shmid = master_shm_id;

  return 0;
}

DLL_EXPORT void
uc_unicas_conf_free (T_UC_CONF * unicas_conf)
{
  int i;

  conf_item_free (unicas_conf->header_conf, unicas_conf->num_header);
  if (unicas_conf->br_conf)
    {
      for (i = 0; i < unicas_conf->num_broker; i++)
    {
      conf_item_free (unicas_conf->br_conf[i].item, unicas_conf->br_conf[i].num);
    }
      FREE_MEM (unicas_conf->br_conf);
    }
  memset (unicas_conf, 0, sizeof (T_UC_CONF));
}

DLL_EXPORT int
uc_conf_broker_add (T_UC_CONF * unicas_conf, const char *br_name, char *err_msg)
{
  int num_br, n;
  T_UC_CONF_ITEM *conf_item;

  num_br = unicas_conf->num_broker + 1;
  unicas_conf->br_conf = (T_BR_CONF *) realloc (unicas_conf->br_conf, sizeof (T_BR_CONF) * num_br);
  if (unicas_conf->br_conf == NULL)
    {
      strcpy (err_msg, strerror (errno));
      return -1;
    }
  memset (&(unicas_conf->br_conf[num_br - 1]), 0, sizeof (T_BR_CONF));
  unicas_conf->num_broker = num_br;

  conf_item = (T_UC_CONF_ITEM *) malloc (sizeof (T_UC_CONF_ITEM) * MAX_NUM_CONF);
  if (conf_item == NULL)
    {
      strcpy (err_msg, strerror (errno));
      return -1;
    }
  memset (conf_item, 0, sizeof (T_UC_CONF_ITEM) * MAX_NUM_CONF);

  n = 0;
  SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_BROKER_NAME, br_name);
  SET_CONF_ITEM_ONOFF (conf_item, n, UC_CONF_PARAM_SERVICE, ON);
  SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_APPL_SERVER, get_as_type_str (APPL_SERVER_CAS));
  SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_BROKER_PORT, 0, FMT_D);
  SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_MIN_NUM_APPL_SERVER, 2, FMT_D);
  SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_MAX_NUM_APPL_SERVER, 10, FMT_D);
  SET_CONF_ITEM_ONOFF (conf_item, n, UC_CONF_PARAM_AUTO_ADD_APPL_SERVER, OFF);
  SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_APPL_SERVER_SHM_ID, 0, FMT_X);
  SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_APPL_SERVER_MAX_SIZE, DEFAULT_SERVER_MAX_SIZE);
  SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_LOG_DIR, DEFAULT_LOG_DIR);
  SET_CONF_ITEM_ONOFF (conf_item, n, UC_CONF_PARAM_LOG_BACKUP, OFF);
  SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_SOURCE_ENV, "");
  SET_CONF_ITEM_ONOFF (conf_item, n, UC_CONF_PARAM_ACCESS_LOG, ON);
  SET_CONF_ITEM_SQL_LOG_MODE (conf_item, n, UC_CONF_PARAM_SQL_LOG, SQL_LOG_MODE_ERROR);
  SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_LONG_QUERY_TIME, DEFAULT_LONG_QUERY_TIME);
  SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_LONG_TRANSACTION_TIME, DEFAULT_LONG_TRANSACTION_TIME);
  SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_TIME_TO_KILL, DEFAULT_TIME_TO_KILL);
  SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_SESSION_TIMEOUT, 30, FMT_D);
  SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_JOB_QUEUE_SIZE, 30, FMT_D);
  SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_ACCESS_LIST, "");
  SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_MAX_STRING_LENGTH, -1, FMT_D);
  SET_CONF_ITEM_ONOFF (conf_item, n, UC_CONF_PARAM_STRIPPED_COLUMN_NAME, ON);
  SET_CONF_ITEM_KEEP_CON (conf_item, n, UC_CONF_PARAM_KEEP_CONNECTION, KEEP_CON_DEFAULT);
  SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_SQL_LOG_MAX_SIZE, DEFAULT_SQL_LOG_MAX_SIZE);

  unicas_conf->br_conf[num_br - 1].num = n;
  unicas_conf->br_conf[num_br - 1].item = conf_item;
  return 0;
}

DLL_EXPORT void
uc_change_config (T_UC_CONF * unicas_conf, const char *br_name, const char *name, const char *value)
{
  T_BR_CONF *br_conf = NULL;
  int i;

  for (i = 0; i < unicas_conf->num_broker; i++)
    {
      br_conf = &(unicas_conf->br_conf[i]);
      if (strcasecmp (br_name, get_broker_name (br_conf)) == 0)
    {
      break;
    }
      br_conf = NULL;
    }
  if (br_conf == NULL)
    {
      return;
    }

  for (i = 0; i < br_conf->num; i++)
    {
      if (strcasecmp (name, br_conf->item[i].name) == 0)
    {
      if (strcasecmp (name, UC_CONF_PARAM_APPL_SERVER) == 0)
        {
          change_conf_as_type (br_conf, get_as_type (br_conf->item[i].value), get_as_type (value));
        }
      FREE_MEM (br_conf->item[i].value);
      br_conf->item[i].value = strdup (value);
      break;
    }
    }
}

DLL_EXPORT int
uc_changer (const char *br_name, const char *name, const char *value, char *err_msg)
{
  return uc_changer_internal (br_name, name, value, -1, err_msg);
}

DLL_EXPORT int
uc_cas_changer (const char *br_name, const char *name, const char *value, int as_number, char *err_msg)
{
  return uc_changer_internal (br_name, name, value, as_number, err_msg);
}

DLL_EXPORT int
uc_del_cas_log (const char *br_name, int asid, char *err_msg)
{
  T_BROKER_INFO br_info[MAX_BROKER_NUM];
  int num_broker, master_shm_id;
  char admin_log_file[BROKER_PATH_MAX];

  if (err_msg == NULL)
    {
      return -1;
    }

  err_msg[0] = '\0';

  if (admin_common (br_info, &num_broker, &master_shm_id, admin_log_file, err_msg, 0, NULL, NULL, NULL) < 0)
    {
      return -1;
    }

  if (admin_del_cas_log (master_shm_id, br_name, asid) < 0)
    {
      return -1;
    }

  return 0;
}

/******************************************************************
  private functions
 ******************************************************************/

static char *
get_broker_name (T_BR_CONF * br_conf)
{
  int i, num;
  T_UC_CONF_ITEM *conf_item;

  conf_item = br_conf->item;
  num = br_conf->num;

  for (i = 0; i < num; i++)
    {
      if (strcmp (conf_item[i].name, UC_CONF_PARAM_BROKER_NAME) == 0)
    {
      if (conf_item[i].value == NULL)
        {
          return (char *) "";
        }
      return conf_item[i].value;
    }
    }
  return (char *) "";
}

static void
conf_item_free (T_UC_CONF_ITEM * conf_item, int num)
{
  int i;

  if (conf_item == NULL)
    {
      return;
    }
  for (i = 0; i < num; i++)
    {
      FREE_MEM (conf_item[i].value);
    }
  FREE_MEM (conf_item);
}

static int
conf_copy_broker (T_UC_CONF * unicas_conf, T_BROKER_INFO * br_conf, int num_br, char *err_msg)
{
  int i, n;
  T_UC_CONF_ITEM *conf_item;

  unicas_conf->br_conf = (T_BR_CONF *) malloc (sizeof (T_BR_CONF) * num_br);
  if (unicas_conf->br_conf == NULL)
    {
      strcpy (err_msg, strerror (errno));
      return -1;
    }
  memset (unicas_conf->br_conf, 0, sizeof (T_BR_CONF) * num_br);
  unicas_conf->num_broker = num_br;

  for (i = 0; i < num_br; i++)
    {
      char as_type;
      conf_item = (T_UC_CONF_ITEM *) malloc (sizeof (T_UC_CONF_ITEM) * MAX_NUM_CONF);
      if (conf_item == NULL)
    {
      strcpy (err_msg, strerror (errno));
      return -1;
    }
      memset (conf_item, 0, sizeof (T_UC_CONF_ITEM) * MAX_NUM_CONF);
      as_type = br_conf[i].appl_server;
      n = 0;
      SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_BROKER_NAME, br_conf[i].name);
      SET_CONF_ITEM_ONOFF (conf_item, n, UC_CONF_PARAM_SERVICE, br_conf[i].service_flag);
      SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_APPL_SERVER, get_as_type_str (br_conf[i].appl_server));
      SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_BROKER_PORT, br_conf[i].port, FMT_D);
      SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_MIN_NUM_APPL_SERVER, br_conf[i].appl_server_min_num, FMT_D);
      SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_MAX_NUM_APPL_SERVER, br_conf[i].appl_server_max_num, FMT_D);
      SET_CONF_ITEM_ONOFF (conf_item, n, UC_CONF_PARAM_AUTO_ADD_APPL_SERVER, br_conf[i].auto_add_appl_server);
      SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_APPL_SERVER_SHM_ID, br_conf[i].appl_server_shm_id, FMT_X);
      SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_APPL_SERVER_MAX_SIZE, br_conf[i].appl_server_max_size / ONE_K,
             FMT_D);
      SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_APPL_SERVER_HARD_LIMIT, br_conf[i].appl_server_hard_limit / ONE_K,
             FMT_D);
      SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_LOG_DIR, br_conf[i].log_dir);
      SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_SLOW_LOG_DIR, br_conf[i].slow_log_dir);
      SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_ERROR_LOG_DIR, br_conf[i].err_log_dir);
      SET_CONF_ITEM_ONOFF (conf_item, n, UC_CONF_PARAM_LOG_BACKUP, br_conf[i].log_backup);
      SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_SOURCE_ENV, br_conf[i].source_env);
      SET_CONF_ITEM_ONOFF (conf_item, n, UC_CONF_PARAM_ACCESS_LOG, br_conf[i].access_log);
      SET_CONF_ITEM_SQL_LOG_MODE (conf_item, n, UC_CONF_PARAM_SQL_LOG, br_conf[i].sql_log_mode);
      SET_CONF_ITEM_ONOFF (conf_item, n, UC_CONF_PARAM_SLOW_LOG, br_conf[i].slow_log_mode);
      SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_SESSION_TIMEOUT, br_conf[i].session_timeout, FMT_D);
      SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_SQL_LOG_MAX_SIZE, br_conf[i].sql_log_max_size, FMT_D);
      SET_CONF_ITEM_KEEP_CON (conf_item, n, UC_CONF_PARAM_KEEP_CONNECTION, br_conf[i].keep_connection);
      SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_TIME_TO_KILL, br_conf[i].time_to_kill, FMT_D);
      SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_SESSION_TIMEOUT, br_conf[i].session_timeout, FMT_D);
      SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_JOB_QUEUE_SIZE, br_conf[i].job_queue_size, FMT_D);
      if (IS_APPL_SERVER_TYPE_CAS (as_type))
    {
      SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_MAX_STRING_LENGTH, br_conf[i].max_string_length, FMT_D);
      SET_CONF_ITEM_ONOFF (conf_item, n, UC_CONF_PARAM_STRIPPED_COLUMN_NAME, br_conf[i].stripped_column_name);
    }
      SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_ACCESS_LIST, br_conf[i].acl_file);
#if 0
      SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_SQL_LOG2, br_conf[i].sql_log2, FMT_D);
#endif

      unicas_conf->br_conf[i].num = n;
      unicas_conf->br_conf[i].item = conf_item;
    }
  return 0;
}

static int
conf_copy_header (T_UC_CONF * unicas_conf, int master_shm_id, char *admin_log_file, char *err_msg)
{
  T_UC_CONF_ITEM *conf_item;
  int n;

  conf_item = (T_UC_CONF_ITEM *) malloc (sizeof (T_UC_CONF_ITEM) * 2);
  if (conf_item == NULL)
    {
      strcpy (err_msg, strerror (errno));
      return -1;
    }
  n = 0;
  SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_MASTER_SHM_ID, master_shm_id, FMT_X);
  SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_ADMIN_LOG_FILE, admin_log_file);

  unicas_conf->num_header = n;
  unicas_conf->header_conf = conf_item;
  return 0;
}

static int
admin_common (T_BROKER_INFO * br_info, int *num_broker, int *master_shm_id, char *admin_log_file, char *err_msg,
          char admin_flag, bool * acl_flag, char *acl_file, bool * acl_default_policy)
{
  if (broker_config_read (NULL, br_info, num_broker, master_shm_id, admin_log_file, admin_flag, acl_flag, acl_file,
              acl_default_policy, err_msg) < 0)
    {
      return -1;
    }

  ut_cd_work_dir ();

  if (!admin_flag)
    {
      return 0;
    }

#if defined(WINDOWS)
  if (wsa_initialize () < 0)
    {
      strcpy (err_msg, "Error: WSAinit");
      return -1;
    }
#endif /* WINDOWS */

#if 0
  if (admin_get_host_ip ())
    {
      CP_ADMIN_ERR_MSG (err_msg);
      return -1;
    }
#endif

  admin_init_env ();

  return 0;
}

static int
copy_job_info (T_JOB_INFO ** ret_job_info, T_MAX_HEAP_NODE * job_q)
{
  int num_job = job_q[0].id;
  int i;
  T_MAX_HEAP_NODE item;
  T_JOB_INFO *job_info;

  job_info = (T_JOB_INFO *) malloc (sizeof (T_JOB_INFO) * num_job);
  if (job_info == NULL)
    {
      return 0;
    }
  memset (job_info, 0, sizeof (T_JOB_INFO) * num_job);

  for (i = 0; i < num_job; i++)
    {
      if (max_heap_delete (job_q, &item) < 0)
    {
      num_job = i;
      break;
    }
      job_info[i].id = item.id;
      job_info[i].priority = item.priority;
      memcpy (job_info[i].ip, item.ip_addr, 4);
      job_info[i].recv_time = item.recv_time;
      strncpy (job_info[i].script, item.script, sizeof (job_info[i].script) - 1);
      strncpy (job_info[i].prgname, item.prg_name, sizeof (job_info[i].prgname) - 1);
    }

  *ret_job_info = job_info;
  return num_job;
}

static const char *
get_as_type_str (char as_type)
{
  if (as_type == APPL_SERVER_CAS_CGW)
    {
      return APPL_SERVER_CAS_CGW_TYPE_NAME;
    }
  return APPL_SERVER_CAS_TYPE_NAME;
}

static int
get_as_type (const char *type_str)
{
  if (strcasecmp (type_str, APPL_SERVER_CAS_CGW_TYPE_NAME) == 0)
    {
      return APPL_SERVER_CAS_CGW;
    }
  return APPL_SERVER_CAS;
}

static void
change_conf_as_type (T_BR_CONF * br_conf, int old_as_type, int new_as_type)
{
  int num;
  T_UC_CONF_ITEM *item;

  if (old_as_type == new_as_type)
    return;

  num = br_conf->num;
  item = br_conf->item;
  if (IS_APPL_SERVER_TYPE_CAS (old_as_type))
    {
      reset_conf_value (num, item, UC_CONF_PARAM_MAX_STRING_LENGTH);
      reset_conf_value (num, item, UC_CONF_PARAM_STRIPPED_COLUMN_NAME);
    }
  num = br_conf->num - 1;
  br_conf->num = num;
}

static void
reset_conf_value (int num_item, T_UC_CONF_ITEM * item, const char *name)
{
  int i;

  for (i = 0; i < num_item; i++)
    {
      if (strcasecmp (item[i].name, name) == 0)
    {
      if (item[i].value)
        {
          item[i].value[0] = '\0';
        }
      return;
    }
    }
}

static void
admin_log_write (const char *log_file, const char *msg)
{
  FILE *fp;
  struct tm ct;
  time_t ts;

  fp = fopen (log_file, "a");
  if (fp != NULL)
    {
      ts = time (NULL);
      memset (&ct, 0x0, sizeof (struct tm));
      localtime_r (&ts, &ct);
      fprintf (fp, "%d/%02d/%02d %02d:%02d:%02d %s\n", ct.tm_year + 1900, ct.tm_mon + 1, ct.tm_mday, ct.tm_hour,
           ct.tm_min, ct.tm_sec, msg);
      fclose (fp);
    }
}

static int
uc_changer_internal (const char *br_name, const char *name, const char *value, int as_number, char *err_msg)
{
  T_BROKER_INFO br_info[MAX_BROKER_NUM];
  int num_broker, master_shm_id;
  char admin_log_file[BROKER_PATH_MAX];

  if (admin_common (br_info, &num_broker, &master_shm_id, admin_log_file, err_msg, 0, NULL, NULL, NULL) < 0)
    {
      return -1;
    }
  if (admin_conf_change (master_shm_id, br_name, name, value, as_number) < 0)
    {
      strcpy (err_msg, "ERROR : changer");
      return -1;
    }
  return 0;
}