0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
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
0053
0054
0055
0056
0057
0058
0059 exprivate ndrx_rm_def_t *M_rms = NULL;
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
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
0111
0112
0113
0114
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
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
0177 continue;
0178 }
0179
0180
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
0193 if (EXSUCCEED!=parse_rm_string(stripped, el))
0194 {
0195 EXFAIL_OUT(ret);
0196 }
0197
0198
0199 EXHASH_ADD_STR(M_rms, rmname, el);
0200
0201 el=NULL;
0202 }
0203
0204
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
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