31 #include <sys/types.h>
45 const char *XrdOucMsubs::vName[vMax] = {0};
60 vName[vLFN2] =
"$LFN2";
61 vName[vPFN2] =
"$PFN2";
62 vName[vRFN2] =
"$RFN2";
63 vName[vFM] =
"$FMODE";
64 vName[vNFY] =
"$NOTIFY";
65 vName[vOFL] =
"$OFLAG";
66 vName[vOPT] =
"$OPTS";
67 vName[vPTY] =
"$PRTY";
68 vName[vUSR] =
"$USER";
69 vName[vHST] =
"$HOST";
79 mData[0] = 0; mDlen[0] = 0;
91 if (mText) free(mText);
93 for (i = 0; i < numElem; i++)
if (mDlen[i] < 0) free(mData[i]);
102 char ctmp, *vp, *ip, *lastp, *infop;
108 lastp = infop = mText = strdup(msg);
109 while ((ip = index(infop,
'$')) && j <
maxElem)
110 if (isalnum(*(ip+1)) && (infop == ip || *(ip-1) !=
'\\'))
111 {
if ((mDlen[j] = ip-lastp)) mData[j++] = lastp;
113 while(isalnum(*ip) || *ip ==
'.') ip++;
114 ctmp = *ip; *ip =
'\0';
116 mData[j] = vp = strdup(vp); mData[j++]++;
117 *ip = ctmp; lastp = infop = ip;
118 if (isupper(*(vp+1)))
119 for (i = 1; i < vMax; i++)
120 if (!strcmp(vp, vName[i]))
121 {mDlen[j-1] = i; mData[j-1] = 0; free(vp);
break;}
122 }
else if (ip != infop && *(ip-1) ==
'\\')
123 {
if ((mDlen[j] = (ip-lastp)-1) > 0) mData[j++] = lastp;
124 lastp = ip; infop = ip+1;
130 {
if ((mDlen[j] = strlen(lastp))) mData[j++] = lastp;
133 eDest->
Emsg(dName,
"Too many variables in", dName,
"string.");
152 for (k = 0; k < numElem; k++)
154 {Data[k] = getVal(
Info, mDlen[k]);
155 Dlen[k] = strlen(Data[k]);
157 else if (mDlen[k] < 0)
158 {
if ((Data[k] =
Info.Env->Get(mData[k])))
159 Dlen[k] = strlen(Data[k]);
160 else {Data[k]=mData[k]-1; Dlen[k]=(-mDlen[k]);}
162 else {Data[k] = mData[k]; Dlen[k] = mDlen[k];}
178 {
case vLFN:
return (
char *)
Info.lfn;
180 case vPFN:
if (
Info.pfn)
return (
char *)
Info.pfn;
181 if (!
Info.N2N)
return (
char *)
Info.lfn;
182 if (
Info.pfnbuff)
return Info.pfnbuff;
183 if (
Info.N2N->lfn2pfn(
Info.lfn,buff,
sizeof(buff)))
break;
184 Info.pfnbuff = strdup(buff);
187 case vRFN:
if (!
Info.N2N)
return (
char *)
Info.lfn;
188 if (
Info.rfnbuff)
return Info.rfnbuff;
189 if (
Info.N2N->lfn2rfn(
Info.lfn,buff,
sizeof(buff)))
break;
190 Info.rfnbuff = strdup(buff);
195 case vSRC:
if (
Info.lfn2)
return (
char *)
Info.lfn2;
198 case vDST:
if (
Info.pfn2)
return (
char *)
Info.pfn2;
201 case vPFN2:
if (!
Info.lfn2)
break;
202 if (
Info.pfn2)
return (
char *)
Info.pfn2;
203 if (!
Info.N2N)
return (
char *)
Info.lfn2;
204 if (
Info.pfn2buff)
return Info.pfn2buff;
205 if (
Info.N2N->lfn2pfn(
Info.lfn2,buff,
sizeof(buff)))
break;
206 Info.pfn2buff = strdup(buff);
207 return Info.pfn2buff;
209 case vRFN2:
if (!
Info.lfn2)
break;
210 if (!
Info.N2N)
return (
char *)
Info.lfn2;
211 if (
Info.rfn2buff)
return Info.rfn2buff;
212 if (
Info.N2N->lfn2rfn(
Info.lfn2,buff,
sizeof(buff)))
break;
213 Info.rfn2buff = strdup(buff);
214 return Info.rfn2buff;
216 case vFM: sprintf(
Info.mbuff,
"%o",
static_cast<int>(
Info.Mode));
219 case vOFL: op =
Info.obuff;
220 if (!(
Info.Oflag & (O_WRONLY | O_RDWR))) *op++ =
'r';
222 if (
Info.Oflag & O_CREAT) *op++ =
'c';
223 if (
Info.Oflag & O_EXCL) *op++ =
'x';
224 if (
Info.Oflag & O_TRUNC) *op++ =
't';
230 case vOPT:
if (
Info.misc)
return (
char *)
Info.misc;
233 case vPTY: sprintf(
Info.mbuff,
"%d",
static_cast<int>(
Info.Mode));
236 case vHST:
if ((op =
Info.Env->Get(
SEC_HOST)))
return op;
239 case vUSR:
if ((op =
Info.Env->Get(
SEC_USER)))
return op;
242 case vRID:
if (
Info.Rid)
return (
char *)
Info.Rid;
243 return (
char *)
Info.Tid;
245 case vTID:
return (
char *)
Info.Tid;
247 case vCGI:
if (!(op =
Info.Env->Env(n))) op = (
char *)
"";
250 case vCID:
if ((op =
Info.Env->Get(
CMS_CID)))
return op;
253 case vINS:
if ((op =
Info.Env->Get(
XRD_INS)))
return op;
256 default:
return (
char *)
"$";
258 return (
char *)vName[vNum];
int Parse(const char *oname, char *msg)
int Subs(XrdOucMsubsInfo &Info, char **Data, int *Dlen)
XrdOucMsubs(XrdSysError *errp)
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)