153{
154 char secbuff[4096], *nscan, *pname, *pargs, *bp = secbuff;
156 XrdSecProtList *pl;
157 XrdSecProtocol *pp;
158 XrdOucErrInfo ei;
159 XrdOucErrInfo *erp;
160 char *wp;
161 int i;
162
163
164
165
166
167
168
169 if (isProxy)
170 {wp = 0;
171 if (!fwdCreds) eri = 0;
172 } else {
174 if (!eri || (envP = eri->getEnv()) == 0) wp = 0;
175 else wp =
envP->
Get(
"xrd.wantprot");
176 }
177
178
179
180 const char *wantProt = wp ? (const char *)wp : getenv("XrdSecPROTOCOL");
181 erp = (eri) ? eri : &ei;
182
183
184
185 if (secparm.
size <= 0) return (XrdSecProtocol *)0;
186
187
188
189 if (wantProt)
190 {i = strlen(wantProt);
191 compProt = (char *)malloc(i+3);
192 *compProt = ',';
193 strcpy(compProt+1, wantProt);
194 compProt[i+1] = ','; compProt[i+2] = 0; *pcomp = ',';
195 } else compProt = 0;
196
197
198
199
200 if (secparm.
size < (
int)
sizeof(secbuff)) i = secparm.
size;
201 else i = sizeof(secbuff)-1;
202 strncpy(secbuff, secparm.
buffer, i);
203 secbuff[i] = '\0';
204
205
206
207 while(*bp)
208 {if (*bp != '&') {bp++; continue;}
209 else if (!*(++bp) || *bp !=
'P' || !*(++bp) || *bp !=
'=')
continue;
210 bp++; pname = bp; pargs = 0;
211 while(*bp && *bp != ',' && *bp != '&') bp++;
212 if (!*bp) nscan = 0;
213 else {if (*bp == '&') {*bp = '\0'; pargs = 0; nscan = bp;}
214 else {*bp = '\0'; pargs = ++bp;
215 while (*bp && *bp != '&') bp++;
216 if (*bp) {*bp ='\0'; nscan = bp;}
217 else nscan = 0;
218 }
219 }
220 if (wantProt)
223 strcat(pcomp, ",");
224 }
225 if (!wantProt || strstr(compProt, pcomp))
226 {XrdSysMutexHelper pmHelper(pmMutex);
227 if ((pl = Lookup(pname)) || (pl = ldPO(erp, 'c', pname)))
228 {
DEBUG(
"Using " <<pname <<
" protocol, args='"
229 <<(pargs ? pargs : "") <<"'");
230 if ((pp = pl->
ep(
'c', hname, endPoint, pargs, erp)))
231 {if (nscan) {i = nscan - secbuff;
233 }
else secparm.
size = -1;
234 if (compProt) free(compProt);
235 return pp;
236 }
237 }
239 }
else {
DEBUG(
"Skipping " <<pname <<
" only want " <<wantProt);}
240 if (!nscan) break;
241 *nscan = '&'; bp = nscan;
242 }
244 if (compProt) free(compProt);
245 return (XrdSecProtocol *)0;
246}
#define XrdSecPROTOIDSIZE
char * Get(const char *varname)
const char * getErrText()
char * buffer
Pointer to the buffer.
int size
Size of the buffer or length of data in the buffer.