Skip to content

File broker_filename.c

File List > broker > broker_filename.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_filename.c -
 */

#ident "$Id$"

#include "config.h"

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

#if defined(WINDOWS)
#include <direct.h>
#else
#include <fcntl.h>
#include <sys/sendfile.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <linux/fs.h>
#include <unistd.h>
#endif

#include "broker_admin_pub.h"
#include "broker_filename.h"
#include "environment_variable.h"
#include "error_manager.h"
#include "system_parameter.h"

static char cubrid_Dir[BROKER_PATH_MAX] = "";

#define NUM_CUBRID_FILE     MAX_CUBRID_FILE
static T_CUBRID_FILE_INFO cubrid_file[NUM_CUBRID_FILE] = {
  {FID_CUBRID_BROKER_CONF, ""},
  {FID_UV_ERR_MSG, ""},
  {FID_V3_OUTFILE_DIR, ""},
  {FID_CAS_TMPGLO_DIR, ""},
  {FID_CAS_TMP_DIR, ""},
  {FID_VAR_DIR, ""},
  {FID_SOCK_DIR, ""},
  {FID_AS_PID_DIR, ""},
  {FID_ADMIND_PID, ""},
  {FID_SQL_LOG_DIR, ""},
  {FID_SQL_LOG2_DIR, ""},
  {FID_ADMIND_LOG, ""},
  {FID_MONITORD_LOG, ""},
  {FID_ER_HTML, ""},
  {FID_CUBRID_ERR_DIR, ""},
  {FID_ACCESS_CONTROL_FILE, ""},
  {FID_SLOW_LOG_DIR, ""},
  {FID_SHARD_DBINFO, ""},
  {FID_SHARD_PROXY_LOG_DIR, ""},
  {FID_CUBRID_GATEWAY_CONF, ""},
  {FID_COPIED_CUBRID_CONF, ""}
};

void
set_cubrid_home ()
{
  char dirname[BROKER_PATH_MAX];
  const char *p;

  p = getenv_cubrid_broker ();
  if (p)
    {
      strcpy (cubrid_Dir, p);
      return;
    }
  getcwd (dirname, sizeof (dirname));
  if (snprintf (cubrid_Dir, sizeof (cubrid_Dir) - 1, "%s/..", dirname) < 0)
    {
      assert (false);
      cubrid_Dir[0] = '\0';
    }
}

char *
get_cubrid_home ()
{
  if (cubrid_Dir[0] == '\0')
    {
      set_cubrid_home ();
    }
  return cubrid_Dir;
}


void
set_cubrid_file (T_CUBRID_FILE_ID fid, char *value)
{
  size_t value_len;
  bool repath = true;
  int ret = 0;

  if (value == NULL)
    {
      return;
    }

  if (IS_ABS_PATH (value))
    {
      repath = false;
    }

  switch (fid)
    {
    case FID_V3_OUTFILE_DIR:
    case FID_CAS_TMPGLO_DIR:
    case FID_CAS_TMP_DIR:
    case FID_VAR_DIR:
    case FID_SOCK_DIR:
    case FID_AS_PID_DIR:
    case FID_SQL_LOG_DIR:
    case FID_SQL_LOG2_DIR:
    case FID_SLOW_LOG_DIR:
    case FID_CUBRID_ERR_DIR:
      value_len = strlen (value);
      if (value[value_len] == '/' || value[value_len] == '\\')
    {
      if (repath)
        {
          ret = snprintf (cubrid_file[fid].file_name, BROKER_PATH_MAX, "%s/%s", get_cubrid_home (), value);
        }
      else
        {
          ret = snprintf (cubrid_file[fid].file_name, BROKER_PATH_MAX, value);
        }
    }
      else
    {
      if (repath)
        {
          ret = snprintf (cubrid_file[fid].file_name, BROKER_PATH_MAX, "%s/%s/", get_cubrid_home (), value);
        }
      else
        {
          ret = snprintf (cubrid_file[fid].file_name, BROKER_PATH_MAX, "%s/", value);
        }
    }
      break;

    case FID_ACCESS_CONTROL_FILE:
      if (repath)
    {
      envvar_confdir_file (cubrid_file[fid].file_name, BROKER_PATH_MAX, value);
    }
      else
    {
      ret = snprintf (cubrid_file[fid].file_name, BROKER_PATH_MAX, "%s", value);
    }
      break;
    default:
      if (repath)
    {
      ret = snprintf (cubrid_file[fid].file_name, BROKER_PATH_MAX, "%s/%s", get_cubrid_home (), value);
    }
      else
    {
      ret = snprintf (cubrid_file[fid].file_name, BROKER_PATH_MAX, value);
    }
      break;
    }
  if (ret < 0)
    {
      assert (false);
      cubrid_file[fid].file_name[0] = '\0';
    }
}

char *
get_cubrid_file_ptr (T_CUBRID_FILE_ID fid)
{
  return cubrid_file[fid].file_name;
}

char *
get_cubrid_file (T_CUBRID_FILE_ID fid, char *buf, size_t len)
{
  buf[0] = '\0';

  if (cubrid_Dir[0] == '\0')
    {
      set_cubrid_home ();
    }

  if (strlen (cubrid_file[fid].file_name) > 0)
    {
      if (snprintf (buf, len, "%s", cubrid_file[fid].file_name) < 0)
    {
      assert (false);
      buf[0] = '\0';
    }
      return buf;
    }

  switch (fid)
    {
    case FID_CUBRID_BROKER_CONF:
      envvar_confdir_file (buf, len, "cubrid_broker.conf");
      break;
    case FID_CUBRID_GATEWAY_CONF:
      envvar_confdir_file (buf, len, "cubrid_gateway.conf");
      break;
    case FID_UV_ERR_MSG:
      envvar_confdir_file (buf, len, "uv_er.msg");
      break;
    case FID_V3_OUTFILE_DIR:
      envvar_tmpdir_file (buf, len, "");
      break;
    case FID_CAS_TMPGLO_DIR:
      envvar_tmpdir_file (buf, len, "");
      break;
    case FID_CAS_TMP_DIR:
      envvar_tmpdir_file (buf, len, "");
      break;
    case FID_VAR_DIR:
      envvar_vardir_file (buf, len, "");
      break;
    case FID_SOCK_DIR:
      {
    const char *cubrid_tmp = envvar_get ("TMP");
    if (cubrid_tmp == NULL || cubrid_tmp[0] == '\0')
      {
        envvar_vardir_file (buf, len, "CUBRID_SOCK/");
      }
    else
      {
        if (snprintf (buf, len, "%s/", cubrid_tmp) < 0)
          {
        assert (false);
        buf[0] = '\0';
          }
      }
      }
      break;
    case FID_AS_PID_DIR:
      envvar_vardir_file (buf, len, "as_pid/");
      break;
    case FID_ADMIND_PID:
      envvar_vardir_file (buf, len, "as_pid/casd.pid");
      break;
#if defined(FOR_ODBC_GATEWAY)
    case FID_SQL_LOG_DIR:
      envvar_logdir_file (buf, len, "gateway/sql_log/");
      break;
    case FID_SQL_LOG2_DIR:
      envvar_logdir_file (buf, len, "gateway/sql_log/query/");
      break;
    case FID_SLOW_LOG_DIR:
      envvar_logdir_file (buf, len, "gateway/sql_log/");
      break;
    case FID_ADMIND_LOG:
      envvar_logdir_file (buf, len, "gateway/sql_log/cas_admind.log");
      break;
    case FID_MONITORD_LOG:
      envvar_logdir_file (buf, len, "gateway/sql_log/cas_monitord.log");
      break;
    case FID_CUBRID_ERR_DIR:
      envvar_logdir_file (buf, len, "gateway/error_log/");
      break;
#else
    case FID_SQL_LOG_DIR:
      envvar_logdir_file (buf, len, "broker/sql_log/");
      break;
    case FID_SQL_LOG2_DIR:
      envvar_logdir_file (buf, len, "broker/sql_log/query/");
      break;
    case FID_SLOW_LOG_DIR:
      envvar_logdir_file (buf, len, "broker/sql_log/");
      break;
    case FID_ADMIND_LOG:
      envvar_logdir_file (buf, len, "broker/sql_log/cas_admind.log");
      break;
    case FID_MONITORD_LOG:
      envvar_logdir_file (buf, len, "broker/sql_log/cas_monitord.log");
      break;
    case FID_CUBRID_ERR_DIR:
      envvar_logdir_file (buf, len, "broker/error_log/");
      break;
#endif
    case FID_ER_HTML:
      envvar_confdir_file (buf, len, "uw_er.html");
      break;
    case FID_SHARD_DBINFO:
      envvar_confdir_file (buf, BROKER_PATH_MAX, "shard_databases.txt");
      if (snprintf (cubrid_file[fid].file_name, BROKER_PATH_MAX, buf) < 0)
    {
      assert (false);
      buf[0] = '\0';
    }
      break;
    case FID_SHARD_PROXY_LOG_DIR:
      envvar_logdir_file (buf, BROKER_PATH_MAX, "broker/proxy_log/");
      if (snprintf (cubrid_file[fid].file_name, BROKER_PATH_MAX, buf) < 0)
    {
      assert (false);
      buf[0] = '\0';
    }
      break;
    case FID_COPIED_CUBRID_CONF:
      envvar_vardir_file (buf, len, "as_pid/.cubrid.conf");
      break;
    default:
      break;
    }

  if (snprintf (cubrid_file[fid].file_name, BROKER_PATH_MAX, "%s", buf) < 0)
    {
      assert (false);
      buf[0] = '\0';
    }
  return buf;
}

const char *
getenv_cubrid_broker ()
{
  const char *p;

  p = envvar_root ();

  return p;
}

int
make_abs_path (char *dest, const char *subdir, const char *path, size_t dest_len)
{
  int ret = 0;
  char buf[BROKER_PATH_MAX * 4];
  char new_path[BROKER_PATH_MAX * 4];
  int path_len;

  if (path == NULL || path[0] == 0)
    {
      dest[0] = '\0';
      return path ? 0 : -1;
    }

#if defined (WINDOWS)
  if (IS_ABS_PATH (path))
    {
      _fullpath (new_path, path, dest_len);
    }
  else
    {
      snprintf (buf, dest_len, "%s%s%s\\%s", get_cubrid_home (), subdir ? "\\" : "", subdir ? subdir : "", path);
      _fullpath (new_path, buf, dest_len);
    }
#else
  if (IS_ABS_PATH (path))
    {
      snprintf (new_path, dest_len, "%s", path);
    }
  else
    {
      snprintf (new_path, dest_len, "%s%s%s/%s", get_cubrid_home (), subdir ? "/" : "", subdir ? subdir : "", path);
    }
#endif

  path_len = strlen (new_path) - 1;
  while (path_len > 0)
    {
      if (new_path[path_len] == '/' || new_path[path_len] == '\\')
    {
      new_path[path_len] = '\0';
    }
      else
    {
      break;
    }
      path_len--;
    }

  if (strlen (new_path) < dest_len)
    {
      snprintf (dest, dest_len, "%s", new_path);
    }
  else
    {
      ret = -1;
    }

  return ret;
}

#if !defined(WINDOWS)
int
copy_cubrid_conf (const char *dest)
{
  const char *conf_file = NULL;
  const char *file_path_ptr = NULL;
  char file_being_dealt_with[PATH_MAX];
  int src_fd = -1, dest_fd = -1;
  struct stat stat_buf;
  int error_code = 0;

  conf_file = envvar_get ("CONF_FILE");
  if (conf_file != NULL && *conf_file == '\0')
    {
      conf_file = NULL;
    }

  if (conf_file != NULL)
    {
      file_path_ptr = conf_file;
    }
  else
    {
      envvar_confdir_file (file_being_dealt_with, PATH_MAX, "cubrid.conf");
      file_path_ptr = file_being_dealt_with;
    }

  src_fd = open (file_path_ptr, O_RDONLY);
  if (src_fd < 0)
    {
      error_code = -1;
      goto error;
    }

  if (fstat (src_fd, &stat_buf) < 0)
    {
      error_code = -2;
      goto error;
    }

  dest_fd = open (dest, O_WRONLY | O_CREAT | O_TRUNC, 0600);
  if (dest_fd < 0)
    {
      error_code = -3;
      goto error;
    }

  if (sendfile (dest_fd, src_fd, NULL, stat_buf.st_size) != (ssize_t) stat_buf.st_size)
    {
      error_code = -4;
      goto error;
    }

  if (fchmod (dest_fd, 0400) < 0)
    {
      error_code = -5;
      goto error;
    }

  close (src_fd);
  close (dest_fd);

  return 0;

error:
  if (src_fd >= 0)
    {
      close (src_fd);
    }

  if (dest_fd >= 0)
    {
      close (dest_fd);
      unlink (dest);
    }

  return error_code;
}

void
manage_cubrid_conf (T_CMD_CUBRID_CONF command)
{
  char cubrid_conf[BROKER_PATH_MAX];
  int error_code = 0;

  get_cubrid_file (FID_COPIED_CUBRID_CONF, cubrid_conf, BROKER_PATH_MAX);

  switch (command)
    {
    case CMD_START:
      if ((error_code = copy_cubrid_conf (cubrid_conf)) == 0)
    {
      setenv (CUBRID_CONF_FOR_BROKER, cubrid_conf, 1);
    }
      else
    {
      _er_log_debug (ARG_FILE_LINE, "fail of copy_cubrid_conf : %d\n", error_code);
    }
      break;
    case CMD_STOP:
      if (access (cubrid_conf, F_OK) == 0)
    {
      unlink (cubrid_conf);
    }
      unsetenv (CUBRID_CONF_FOR_BROKER);
      break;
    case CMD_ON:
      if (access (cubrid_conf, F_OK) == 0)
    {
      setenv (CUBRID_CONF_FOR_BROKER, cubrid_conf, 1);
    }
      break;
    case CMD_OFF:
      unsetenv (CUBRID_CONF_FOR_BROKER);
      break;
    default:
      break;
    }
}
#endif