Back to home page

Enduro/X

 
 

    


0001 /**
0002  * @brief Get resource manager name
0003  *
0004  * @file getrm.c
0005  */
0006 /* -----------------------------------------------------------------------------
0007  * Enduro/X Middleware Platform for Distributed Transaction Processing
0008  * Copyright (C) 2009-2016, ATR Baltic, Ltd. All Rights Reserved.
0009  * Copyright (C) 2017-2018, Mavimax, Ltd. All Rights Reserved.
0010  * This software is released under one of the following licenses:
0011  * AGPL or Mavimax's license for commercial use.
0012  * -----------------------------------------------------------------------------
0013  * AGPL license:
0014  * 
0015  * This program is free software; you can redistribute it and/or modify it under
0016  * the terms of the GNU Affero General Public License, version 3 as published
0017  * by the Free Software Foundation;
0018  *
0019  * This program is distributed in the hope that it will be useful, but WITHOUT ANY
0020  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
0021  * PARTICULAR PURPOSE. See the GNU Affero General Public License, version 3
0022  * for more details.
0023  *
0024  * You should have received a copy of the GNU Affero General Public License along 
0025  * with this program; if not, write to the Free Software Foundation, Inc., 
0026  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
0027  *
0028  * -----------------------------------------------------------------------------
0029  * A commercial use license is available from Mavimax, Ltd
0030  * contact@mavimax.com
0031  * -----------------------------------------------------------------------------
0032  */
0033 
0034 /*---------------------------Includes-----------------------------------*/
0035 
0036 #include <unistd.h>
0037 #include <stdio.h>
0038 #include <errno.h>
0039 #include <stdlib.h>
0040 #include <atmi.h>
0041 #include <string.h>
0042 
0043 #include <ubf.h>
0044 #include <ferror.h>
0045 #include <fieldtable.h>
0046 #include <fdatatype.h>
0047 
0048 #include <ndrstandard.h>
0049 #include <ndebug.h>
0050 #include <errno.h>
0051 #include "buildtools.h"
0052 /*---------------------------Externs------------------------------------*/
0053 /*---------------------------Macros-------------------------------------*/
0054 /*---------------------------Enums--------------------------------------*/
0055 /*---------------------------Typedefs-----------------------------------*/
0056 /*---------------------------Globals------------------------------------*/
0057 /*---------------------------Statics------------------------------------*/
0058 
0059 exprivate ndrx_rm_def_t *M_rms = NULL;
0060 
0061 /*---------------------------Prototypes---------------------------------*/
0062 
0063 /**
0064  * Parse resource manager file,
0065  * format: res_mgr_logical_name:xa_switch_name:build_libraries_last_names
0066  * 
0067  * @param buf parsed buffer from udataobj/RM text file
0068  * @param p_rmdef resource manager define, shall be set to 0 (memset)
0069  * @return EXUSCCEED/EXFAIL
0070  */
0071 exprivate int parse_rm_string(char *buf, ndrx_rm_def_t *p_rmdef)
0072 {
0073     int ret = EXSUCCEED;
0074     char *saveptr1 = NULL, *p;
0075     int i;
0076     char *args[3] = {NULL, NULL, NULL};
0077     
0078     p = strtok_r (buf, ":", &saveptr1);
0079     
0080     NDRX_LOG(log_debug, "Parsing define: [%s]", buf);
0081     
0082     for (i=0; i<3 && NULL!=p; i++, p = strtok_r (NULL, ":", &saveptr1))
0083     {
0084         args[i]=p;
0085     }
0086     
0087     if (i<2)
0088     {
0089         _Nset_error_fmt(NEFORMAT, "Invalid resource manager define: [%s]", buf);
0090         EXFAIL_OUT(ret);
0091     }
0092     
0093     NDRX_STRCPY_SAFE(p_rmdef->rmname, args[0]);
0094     NDRX_STRCPY_SAFE(p_rmdef->structname, args[1]);
0095     
0096     if (args[2])
0097     {
0098         NDRX_STRCPY_SAFE(p_rmdef->libnames, args[2]);
0099     }
0100     
0101     NDRX_LOG(log_debug, "Got rmname=[%s] structname=[%s] libnames[%s]", 
0102             p_rmdef->rmname, p_rmdef->structname, p_rmdef->libnames);
0103     
0104 out:
0105     
0106     return ret;
0107 }
0108 
0109 /**
0110  * Get resource manager and last files for xa_switch_name by rm_name
0111  * Function is not thread safe.
0112  * @param rm_name resource manager name to search for
0113  * @param p_rmdef Resource manager define struct
0114  * @return EXFAIL (failed to process), EXTRUE if found, EXSUCCEED if not found but ok
0115  */
0116 expublic int ndrx_get_rm_name(char *rm_name, ndrx_rm_def_t *p_rmdef)
0117 {
0118     int ret = EXSUCCEED;
0119     FILE *fp = NULL;
0120     char *config;
0121     char *tmp;
0122     char ndrx_home_rmfile[NDRX_BPATH_MAX]={EXEOS};
0123     char buf[NDRX_BPATH_MAX+1];
0124     static int first = EXTRUE;
0125     ndrx_rm_def_t *el = NULL, *elt;
0126     
0127     p_rmdef->rmname[0]=EXEOS;
0128     p_rmdef->structname[0]=EXEOS;
0129     p_rmdef->libnames[0]=EXEOS;
0130     if (first)
0131     {
0132         config=getenv(CONF_NDRX_RMFILE);
0133 
0134         if (NULL!=config)
0135         {
0136             NDRX_LOG(log_info , "RM file - using [%s]", CONF_NDRX_RMFILE);
0137         }
0138         else if (NULL!=(tmp=getenv(CONF_NDRX_HOME)))
0139         {
0140             NDRX_LOG(log_info , "RM file try from home [%s]", tmp);
0141 
0142             snprintf(ndrx_home_rmfile, sizeof(ndrx_home_rmfile), 
0143                                     "%s/udataobj/RM", tmp);
0144             config = ndrx_home_rmfile;
0145         }
0146         else
0147         {
0148             NDRX_LOG(log_error, "Resource Manager file not set (no %s or %s)!", 
0149                     CONF_NDRX_RMFILE, CONF_NDRX_HOME);
0150             EXFAIL_OUT(ret);
0151         }
0152 
0153         NDRX_LOG(log_debug, "Try to open: [%s]", config);
0154 
0155         if (NULL==(fp=NDRX_FOPEN(config, "r")))
0156         {
0157             int err = errno;
0158             NDRX_LOG(log_error, "Failed to open RM file [%s]: %s", config, strerror(err));
0159 
0160             _Nset_error_fmt(NENOENT, "Failed to open RM file [%s]: %s", 
0161                     config, strerror(err));
0162 
0163             EXFAIL_OUT(ret);
0164         }
0165 
0166          /* process line by line */
0167         while (NULL!=fgets(buf, sizeof(buf), fp))
0168         {
0169             char *stripped;
0170 
0171             ndrx_str_rstrip(buf," \t\n\r");
0172             stripped = ndrx_str_lstrip_ptr(buf," \t\n\r");
0173 
0174             if (EXEOS==stripped[0] || '#'==stripped[0])
0175             {
0176                 /* skip comments */
0177                 continue;
0178             }
0179             
0180             /* Alloc new tmp_rm */
0181             if (NULL==(el = NDRX_FPMALLOC(sizeof(ndrx_rm_def_t),0)))
0182             {
0183                 NDRX_LOG(log_error, "Failed to malloc %d bytes: %s", 
0184                         sizeof(ndrx_rm_def_t), strerror(errno));
0185                 EXFAIL_OUT(ret);
0186             }
0187             
0188             el->rmname[0]=EXEOS;
0189             el->structname[0]=EXEOS;
0190             el->libnames[0]=EXEOS;
0191             
0192             /* try to parse rm switch */
0193             if (EXSUCCEED!=parse_rm_string(stripped, el))
0194             {
0195                 EXFAIL_OUT(ret);
0196             }
0197             
0198             /* Add to cache */
0199             EXHASH_ADD_STR(M_rms, rmname, el);
0200             
0201             el=NULL;
0202         }
0203         
0204         /* cached OK */
0205         first=EXFALSE;
0206     }
0207     
0208     EXHASH_FIND_STR(M_rms, rm_name, el);
0209     
0210     if (NULL!=el)
0211     {
0212         NDRX_LOG(log_info, "rm_name=[%s] found switch [%s] libs [%s]", 
0213                 el->rmname, el->structname, el->libnames);
0214         ret=EXTRUE;
0215         NDRX_STRCPY_SAFE(p_rmdef->rmname, el->rmname);
0216         NDRX_STRCPY_SAFE(p_rmdef->structname, el->structname);
0217         NDRX_STRCPY_SAFE(p_rmdef->libnames, el->libnames);
0218     }
0219     
0220     el=NULL;
0221     
0222 out:
0223     
0224     if (NULL!=el)
0225     {
0226         NDRX_FPFREE(el);
0227     }
0228 
0229     if (NULL!=fp)
0230     {
0231         NDRX_FCLOSE(fp);
0232         fp = NULL;
0233     }
0234 
0235     if (EXFAIL==ret)
0236     {
0237         /* delete the cache... */
0238         EXHASH_ITER(hh, M_rms, el, elt)
0239         {
0240             EXHASH_DEL(M_rms, el);
0241             NDRX_FPFREE(el);
0242         }
0243     }
0244 
0245     return ret;
0246 }
0247 
0248 /* vim: set ts=4 sw=4 et smartindent: */