81 #include "XrdVersion.hh"
84 #define ENODATA ENOATTR
88 #define ETIME ETIMEDOUT
107 void Mask() {
if (bfEcb1 && bfEcb2)
108 {
unsigned char buff[
sizeof(int)*4];
110 bfEcb2->
Encrypt((
unsigned char*)&
FD, buff+8);
111 memcpy((
void*)&
Sid, (
const void*)buff,
sizeof(
int)*4);
116 {
unsigned char buff[
sizeof(int)*4];
118 bfEcb2->
Decrypt((
unsigned char*)&
FD, buff+8);
119 memcpy((
void*)&
Sid, (
const void*)buff,
sizeof(
int)*4);
140 const char *getTime()
142 static char buff[16];
147 if (gettimeofday(&tv, 0))
148 {perror(
"gettimeofday");
151 tmp = localtime(&tv.tv_sec);
153 {perror(
"localtime");
157 if (strftime(buff,
sizeof(buff),
"%y%m%d:%H%M%S. ", tmp) <= 0)
163 snprintf(tuff,
sizeof(tuff),
"%d",
static_cast<int>(tv.tv_usec/100000));
184 static const char *startUP = getTime();
191 int XrdXrootdProtocol::do_Auth()
220 {eText =
eMsg.getErrText(rc);
221 eDest.
Emsg(
"Xeq",
"User authentication failed;", eText);
238 if (!logLogin(
true))
return -1;
245 {
TRACEP(LOGIN,
"more auth requested; sz=" <<(parm ? parm->
size : 0));
250 eDest.
Emsg(
"Xeq",
"Security requested additional auth w/o parms!");
265 eText =
eMsg.getErrText(rc);
266 eDest.
Emsg(
"Xeq",
"User authentication failed;", eText);
274 int XrdXrootdProtocol::do_Bind()
280 char buff[64], *cp, *dp;
328 if (strcmp(
Link->
Host(), lp->Host()))
340 for (i = 1; i <
maxStreams && pp->Stream[i]; i++) {}
348 pp->Stream[i] =
this;
355 if ( (dp = rindex(cp,
'@'))) *dp =
'\0';
356 if (!(dp = rindex(cp,
'.'))) pPid = 0;
357 else {*dp++ =
'\0'; pPid = strtol(dp, (
char **)NULL, 10);}
371 *(pp->pmHandle),
Link->
ID);
377 sprintf(buff,
"FD %d#%d bound",
Link->
FDnum(), i);
386 buff[0] =
static_cast<char>(i);
405 int XrdXrootdProtocol::do_Chmod()
436 int XrdXrootdProtocol::do_CKsum(
int canit)
439 char *algT =
JobCKT, *args[6];
453 if (rpCheck(
argp->
buff, &opaque))
return rpEmsg(
"Check summing",
argp->
buff);
467 algT = getCksType(opaque, cksT,
sizeof(cksT));
470 snprintf(ebuf,
sizeof(ebuf),
"%s checksum not supported.", cksT);
477 if (
JobLCL && (rc = do_CKsum(algT,
argp->
buff, opaque)) <= 0)
return rc;
494 if (
Client->
eaAPI->
Get(std::string(
"request.name"), keyval) && !keyval.empty())
495 args[4] =
const_cast<char *
>(keyval.c_str());
513 int XrdXrootdProtocol::do_CKsum(
char *algT,
const char *
Path,
char *Opaque)
515 static char Space =
' ';
517 int CKTLen = strlen(algT);
519 myError,
CRED, Opaque);
520 const char *csData = myError.getErrText(
ec);
524 if (rc)
return fsError(rc, 0, myError,
Path, Opaque);
530 struct iovec
iov[4] = {{0,0}, {algT, (size_t)CKTLen}, {&Space, 1},
531 {(
char *)csData, strlen(csData)+1}};
538 {
const char *eTxt[2] = {
JobCKT,
" checksum not available."};
539 myError.setErrInfo(0, eTxt, 2);
552 int XrdXrootdProtocol::do_Clone()
570 "clone does not refer to an open dest file");
577 if ( (clVecNum <= 0) ||
590 std::vector<XrdOucCloneSeg> clVec(clVecNum);
598 for (
int i = 0; i < clVecNum; i++)
599 {fh.Set(clList[i].srcFH);
600 if (!srcFile || currFH != fh.handle)
604 "clone does not refer to an open src file");
611 const char *
eMsg = myError.getErrText(ecode);
615 else fdNum = myError.getErrInfo();
619 "clone does not refer to an open src file");
621 clVec[i].srcFD = fdNum;
622 n2hll(clList[i].srcOffs, clVec[i].srcOffs);
623 n2hll(clList[i].srcLen, clVec[i].srcLen);
624 n2hll(clList[i].dstOffs, clVec[i].dstOffs);
629 int rc = dstFile->
Clone(clVec);
630 if (
SFS_OK != rc)
return fsError(rc, 0, dstFile->
error, 0, 0);
639 int XrdXrootdProtocol::do_Close()
655 "close does not refer to an open file");
665 if (fp->
pgwFob && !do_PgClose(fp, rc))
690 rc = fp->XrdSfsp->close();
691 TRACEP(FS,
" fh=" <<fh.handle <<
" close rc=" <<rc);
695 return fsError(rc, 0, fp->XrdSfsp->error, 0, 0);
704 if (
SFS_OK != rc) retval = fsError(rc, 0, fp->XrdSfsp->error, 0, 0);
711 if (!doDel) fp->Ref(-1);
723 int XrdXrootdProtocol::do_Dirlist()
725 int bleft, rc = 0, dlen, cnt = 0;
726 char *opaque, *buff, ebuff[4096];
752 {snprintf(ebuff,
sizeof(ebuff)-1,
"Insufficient memory to open %s",
argp->
buff);
769 return do_DirStat(dp, ebuff, opaque);
779 do {buff = ebuff; bleft =
sizeof(ebuff);
780 while(dname || (dname = dp->
nextEntry()))
781 {dlen = strlen(dname);
782 if (dlen > 2 || dname[0] !=
'.' || (dlen == 2 && dname[1] !=
'.'))
783 {
if ((bleft -= (dlen+1)) < 0)
break;
784 strcpy(buff, dname); buff += dlen; *buff =
'\n'; buff++; cnt++;
789 }
while(!rc && dname);
795 else {*(buff-1) =
'\0';
804 if (!rc) {
TRACEP(FS,
"dirlist entries=" <<cnt <<
" path=" <<
argp->
buff);}
817 char *buff, *dLoc, *algT = 0;
818 const char *csData, *dname;
819 int bleft, rc = 0, dlen, cnt = 0, statSz = 160;
821 struct {
char ebuff[8192];
char epad[512];} XB;
828 algT = getCksType(opaque, cksT,
sizeof(cksT));
831 snprintf(ebuf,
sizeof(ebuf),
"%s checksum not supported.", cksT);
846 dlen = strlen(pbuff);
847 if (pbuff[dlen-1] !=
'/') {pbuff[dlen] =
'/'; dlen++;}
856 strcpy(XB.ebuff,
".\n0 0 0 0\n");
857 buff = XB.ebuff+10; bleft =
sizeof(XB.ebuff)-10;
867 do {
while(dname || (dname = dp->
nextEntry()))
868 {dlen = strlen(dname);
869 if (dlen > 2 || dname[0] !=
'.' || (dlen == 2 && dname[1] !=
'.'))
870 {
if ((bleft -= (dlen+1)) < 0 || bleft < statSz)
break;
871 if (dLoc) strcpy(dLoc, dname);
874 if (rc ==
SFS_ERROR && myError.getErrInfo() == ENOENT)
875 {dname = 0;
continue;}
880 strcpy(buff, dname); buff += dlen; *buff =
'\n'; buff++; cnt++;
881 dlen = StatGen(
Stat, buff,
sizeof(XB.epad));
882 bleft -= dlen; buff += (dlen-1);
885 pbuff, myError,
CRED, opaque);
886 csData = myError.getErrText();
887 if (
ec !=
SFS_OK || !(*csData) || *csData ==
'!')
889 int n = snprintf(buff,
sizeof(XB.epad),
" [ %s:%s ]",
891 buff += n; bleft -= n;
893 *buff =
'\n'; buff++;
899 buff = XB.ebuff; bleft =
sizeof(XB.ebuff);
902 }
while(!rc && dname);
908 else {*(buff-1) =
'\0';
917 if (!rc) {
TRACEP(FS,
"dirstat entries=" <<cnt <<
" path=" <<
argp->
buff);}
925 int XrdXrootdProtocol::do_Endsess()
941 TRACEP(LOGIN,
"endsess " <<sessID.
Pid <<
':' <<sessID.
FD <<
'.' <<sessID.
Inst);
949 if ((sessID.
FD == 0 && sessID.
Inst == 0)
954 TRACEP(LOGIN,
"endsess " <<sessID.
Pid <<
':' <<sessID.
FD <<
'.' <<sessID.
Inst
955 <<
" rc=" <<rc <<
" (" <<
XrdSysE2T(rc < 0 ? -rc : EAGAIN) <<
")");
978 int XrdXrootdProtocol::do_gpFile()
999 int XrdXrootdProtocol::do_Locate()
1003 char *opaque = 0, *
Path, *fn =
argp->
buff, opt[8], *op=opt;
1020 TRACEP(FS,
"locate " <<opt <<
' ' <<fn);
1024 if (*fn !=
'*'){
Path = fn;
1027 else if (*(fn+1)) {
Path = fn+1;
1042 {
if (rpCheck(
Path, &opaque))
return rpEmsg(
"Locating",
Path);
1043 if (!doDig && !Squash(
Path))
return vpEmsg(
"Locating",
Path);
1052 memmove(&
argp->
buff[n+1], opaque, strlen(opaque)+1);
1056 TRACEP(FS,
"rc=" <<rc <<
" locate " <<fn);
1064 int XrdXrootdProtocol::do_Login()
1068 int i, pid, rc, sendSID = 0;
1078 {
const char *
emsg =
"login requires TLS be enabled";
1080 {
emsg =
"login requires TLS support";
1090 uname[
sizeof(uname)-1] = 0;
1096 "duplicate login; already logged in");
1164 if (pp && i ) {
if (!sendSID) rc =
Response.
Send((
void *)pp, i);
1165 else {
struct iovec
iov[3];
1166 iov[1].iov_base = (
char *)&sessID;
1167 iov[1].iov_len =
sizeof(sessID);
1168 iov[2].iov_base = (
char *)pp;
1174 else {rc = (sendSID ?
Response.
Send((
void *)&sessID,
sizeof(sessID))
1179 else {rc = (sendSID ?
Response.
Send((
void *)&sessID,
sizeof(sessID))
1197 char *rnumb = loginEnv.Get(
"xrd.rn");
1198 char *cCode = loginEnv.Get(
"xrd.cc");
1199 char *tzVal = loginEnv.Get(
"xrd.tz");
1200 char *appXQ = loginEnv.Get(
"xrd.appname");
1201 char *aInfo = loginEnv.Get(
"xrd.info");
1202 int tzNum = (tzVal ? atoi(tzVal) : 0);
1203 if (cCode && *cCode && tzNum >= -12 && tzNum <= 14)
1211 snprintf(apBuff,
sizeof(apBuff),
"&R=%s&x=%s&y=%s&I=%c",
1212 (rnumb ? rnumb :
""),
1213 (appXQ ? appXQ :
""), (aInfo ? aInfo :
""),
1219 {
int majr, minr, pchr;
1220 if (sscanf(rnumb,
"v%d.%d.%d", &majr, &minr, &pchr) == 3)
1221 clientRN = (majr<<16) | ((minr<<8) | pchr);
1222 else if (sscanf(rnumb,
"v%d-%*x", &majr) == 1)
clientRN = -1;
1224 if (appXQ)
AppName = strdup(appXQ);
1252 int XrdXrootdProtocol::do_Mkdir()
1285 int XrdXrootdProtocol::do_Mv()
1288 char *oldp, *newp, *Opaque, *Npaque;
1305 while(*newp && *newp !=
' ') newp++;
1306 if (*newp) {*newp =
'\0'; newp++;
1307 while(*newp && *newp ==
' ') newp++;
1313 if (rpCheck(oldp, &Opaque))
return rpEmsg(
"Renaming", oldp);
1314 if (rpCheck(newp, &Npaque))
return rpEmsg(
"Renaming to", newp);
1315 if (!Squash(oldp))
return vpEmsg(
"Renaming", oldp);
1316 if (!Squash(newp))
return vpEmsg(
"Renaming to", newp);
1326 TRACEP(FS,
"rc=" <<rc <<
" mv " <<oldp <<
' ' <<newp);
1338 int XrdXrootdProtocol::do_Offload(
int (
XrdXrootdProtocol::*Invoke)(),
int pathID)
1361 pp->
Resume = &XrdXrootdProtocol::do_OffloadIO;
1365 pp->
reTry = &isAvail;
1375 if ((pioP = pp->
pioFree))
break;
1376 pp->
reTry = &isAvail;
1378 TRACEP(FSZIO,
"busy path " <<pathID <<
" offs=" <<
IO.Offset);
1380 TRACEP(FSZIO,
"retry path " <<pathID <<
" offs=" <<
IO.Offset);
1391 pioP->
Set(Invoke,
IO, streamID);
1404 int XrdXrootdProtocol::do_OffloadIO()
1417 TRACEP(FSZIO,
"dispatch new I/O path " <<
PathID <<
" offs=" <<
IO.Offset);
1427 if (rc > 0 && !
isNOP)
1429 Resume = &XrdXrootdProtocol::do_OffloadIO;
1449 if (rc)
isNOP =
true;
1455 TRACEP(FSZIO,
"offload complete path "<<
PathID<<
" virt rc=" <<rc);
1456 return (rc ? rc : -EINPROGRESS);
1474 : fp(0), xp(0), Locker(lkP), path(fn), mode(0),
1480 else {
if (fp)
delete fp;
1481 if (mode) Locker->
Unlock(path,mode);
1488 int XrdXrootdProtocol::do_Open()
1492 int rc, mode,
opts, optt, openopts, compchk = 0;
1494 char *opaque,
usage, ebuff[2048], opC;
1495 bool doDig, doforce =
false, isAsync =
false, doClone =
false;
1496 char *fn =
argp->
buff, opt[24], *op=opt;
1499 struct stat statbuf;
1501 int resplen =
sizeof(myResp.fhandle);
1502 struct iovec IOResp[3];
1521 mode = mapMode(mode) | S_IRUSR | S_IWUSR;
usage =
'r';
1557 {openopts |=
SFS_O_RAWIO; *op++ =
'c'; compchk = 1;}
1560 {*op++ =
'a'; isAsync =
true;}
1571 "file cloning is not supported" :
1572 "colocating with a specified file is not supported");
1575 "cloned file is not being opened R/W");
1576 {*op++ =
'K'; doClone =
true;}
1579 "file must be opened as a new file in order to colocate");
1584 "file template does not refer to an open file");
1592 {
char* cgiP = index(fn,
'?');
1593 if (cgiP) *cgiP = 0;
1594 TRACEP(FS,
"open " <<opt <<
' ' <<fn);
1595 if (cgiP) *cgiP =
'?';
1600 if (rpCheck(fn, &opaque))
return rpEmsg(
"Opening", fn);
1609 else {
int ropt = -1;
1610 if (!(popt = Squash(fn)))
return vpEmsg(
"Opening", fn);
1629 OpenHelper oHelp(
Locker, fn);
1636 if (rc > 0) who = (rc > 1 ?
"readers" :
"reader");
1638 who = (rc > 1 ?
"writers" :
"writer");
1640 snprintf(ebuff,
sizeof(ebuff)-1,
1641 "%s file %s is already opened by %d %s; open denied.",
1642 (
'r' ==
usage ?
"Input" :
"Output"), fn, rc, who);
1645 }
else oHelp.mode =
usage;
1656 {snprintf(ebuff,
sizeof(ebuff)-1,
"Insufficient memory to open %s",fn);
1678 std::string oinfo(opaque ? opaque :
"");
1682 oinfo += (!oinfo.empty() ?
"&" :
"") + coloc;
1688 (mode_t)mode,
CRED, oinfo.c_str())))
1689 return fsError(rc, opC, fp->
error, fn, opaque);
1694 return fsError(rc, opC, fp->
error, fn, opaque);
1700 {snprintf(ebuff,
sizeof(ebuff)-1,
"Insufficient memory to open %s", fn);
1718 {snprintf(ebuff,
sizeof(ebuff)-1,
"Insufficient memory to open %s", fn);
1732 if ((
'r' ==
usage && wrtrs) || (
'w' ==
usage && rdrs) || wrtrs > 1)
1733 {snprintf(ebuff,
sizeof(ebuff)-1,
1734 "%s file %s forced opened with %d reader(s) and %d writer(s).",
1735 (
'r' ==
usage ?
"Input" :
"Output"), fn, rdrs, wrtrs);
1742 memset(&myResp, 0,
sizeof(myResp));
1743 if (!compchk) resplen =
sizeof(myResp.fhandle);
1745 fp->
getCXinfo((
char *)myResp.cptype, cpsize);
1746 myResp.cpsize =
static_cast<kXR_int32>(htonl(cpsize));
1747 resplen =
sizeof(myResp);
1753 {retStat = StatGen(statbuf, ebuff,
sizeof(ebuff));
1754 IOResp[1].iov_base = (
char *)&myResp; IOResp[1].iov_len =
sizeof(myResp);
1755 IOResp[2].iov_base = ebuff; IOResp[2].iov_len = retStat;
1756 resplen =
sizeof(myResp) + retStat;
1775 memcpy((
void *)myResp.fhandle,(
const void *)&fhandle,
sizeof(myResp.fhandle));
1815 int XrdXrootdProtocol::do_Ping()
1831 int XrdXrootdProtocol::do_Prepare(
bool isQuery)
1844 int rc, pathnum = 0;
1845 char reqid[128], nidbuff[512], *path, *opaque, *prpid = 0;
1848 bool isCancel, isEvict, isPrepare;
1868 isPrepare = !(isCancel || isQuery);
1875 "Surpassed this connection's prepare limit.");
1893 if (isCancel || isQuery)
1894 {
if (!(prpid = pathlist.GetLine()))
1896 fsprep.
reqid = prpid;
1901 prpid =
PrepID->
isMine(prpid, hport, hname,
sizeof(hname));
1904 "Prepare requestid owned by an unknown server");
1906 << hname <<
':' <<hport);
1912 {prpid =
PrepID->
ID(reqid,
sizeof(reqid));
1913 fsprep.
reqid = reqid;
1916 reqid[0]=
'*'; reqid[1]=
'\0';
1917 fsprep.
reqid = prpid = reqid;
1930 while((path = pathlist.GetLine()))
1931 {
if (rpCheck(path, &opaque))
return rpEmsg(
"Preparing", path);
1932 if (!Squash(path))
return vpEmsg(
"Preparing", path);
1934 (pLast ? (pLast->next = pP) : (pFirst = pP)); pLast = pP;
1936 (oLast ? (oLast->next = oP) : (oFirst = oP)); oLast = oP;
1939 fsprep.
paths = pFirst;
1940 fsprep.
oinfo = oFirst;
1964 char *mBuff = myError.getMsgBuff(rc);
1965 pargs.reqid = prpid;
1967 pargs.paths = pFirst;
1969 if (rc < 0) rc =
Response.
Send(
"No information found.");
1997 else snprintf(nidbuff,
sizeof(nidbuff),
"%s://%s:%d/",
2031 {pargs.reqid = prpid;
2033 pargs.paths = pFirst;
2050 int XrdXrootdProtocol::do_Protocol()
2061 bool wantTLS =
false;
2086 ioVec[iovN ].iov_base = (
void *)&theResp.
secreq;
2087 ioVec[iovN++].iov_len = n;
2113 theResp.
flags = (wantTLS ? theRlt : theRle);
2115 theResp.
flags = theRlf;
2121 theResp.
pval = verNum;
2129 if (rc == 0 && wantTLS)
2145 int XrdXrootdProtocol::do_Qconf()
2149 char *val, buff[4096], *bp=buff;
2150 int n, bleft =
sizeof(buff);
2154 if (!qcargs.GetLine() || !(val = qcargs.GetToken()))
2159 if (!strcmp(val,
"cmsd") || !strcmp(val,
"xrootd"))
2160 return do_QconfCX(qcargs, val);
2168 if (!strcmp(
"bind_max", val))
2169 {n = snprintf(bp, bleft,
"%d\n",
maxStreams-1);
2170 bp += n; bleft -= n;
2172 else if (!strcmp(
"chksum", val))
2173 {
const char *csList = getenv(
"XRD_CSLIST");
2175 {n = snprintf(bp, bleft,
"chksum\n");
2176 bp += n; bleft -= n;
2179 n = snprintf(bp, bleft,
"%s\n", csList);
2180 bp += n; bleft -= n;
2182 else if (!strcmp(
"cid", val))
2183 {
const char *cidval = getenv(
"XRDCMSCLUSTERID");
2184 if (!cidval || !(*cidval)) cidval =
"cid";
2185 n = snprintf(bp, bleft,
"%s\n", cidval);
2186 bp += n; bleft -= n;
2188 else if (!strcmp(
"cms", val))
2191 n = snprintf(bp, bleft,
"%s\n", myError.getErrText());
2192 else n = snprintf(bp, bleft,
"%s\n",
"cms");
2193 bp += n; bleft -= n;
2195 else if (!strcmp(
"pio_max", val))
2196 {n = snprintf(bp, bleft,
"%d\n",
maxPio+1);
2197 bp += n; bleft -= n;
2199 else if (!strcmp(
"proxy", val))
2200 {
const char* pxyOrigin =
"proxy";
2202 {pxyOrigin = getenv(
"XRDXROOTD_PROXY");
2203 if (!pxyOrigin) pxyOrigin =
"proxy";
2205 n = snprintf(bp,bleft,
"%s\n",pxyOrigin);
2206 bp += n; bleft -= n;
2208 else if (!strcmp(
"readv_ior_max", val))
2210 bp += n; bleft -= n;
2212 else if (!strcmp(
"readv_iov_max", val))
2214 bp += n; bleft -= n;
2216 else if (!strcmp(
"role", val))
2217 {
const char *theRole = getenv(
"XRDROLE");
2218 n = snprintf(bp, bleft,
"%s\n", (theRole ? theRole :
"none"));
2219 bp += n; bleft -= n;
2221 else if (!strcmp(
"sitename", val))
2222 {
const char *siteName = getenv(
"XRDSITE");
2223 n = snprintf(bp, bleft,
"%s\n", (siteName ? siteName :
"sitename"));
2224 bp += n; bleft -= n;
2226 else if (!strcmp(
"start", val))
2227 {n = snprintf(bp, bleft,
"%s\n", startUP);
2228 bp += n; bleft -= n;
2230 else if (!strcmp(
"sysid", val))
2231 {
const char *cidval = getenv(
"XRDCMSCLUSTERID");
2232 const char *nidval = getenv(
"XRDCMSVNID");
2233 if (!cidval || !(*cidval) || !nidval || !(*nidval))
2234 {cidval =
"sysid"; nidval =
"";}
2235 n = snprintf(bp, bleft,
"%s %s\n", nidval, cidval);
2236 bp += n; bleft -= n;
2238 else if (!strcmp(
"tpc", val))
2239 {
char *tpcval = getenv(
"XRDTPC");
2240 n = snprintf(bp, bleft,
"%s\n", (tpcval ? tpcval :
"tpc"));
2241 bp += n; bleft -= n;
2243 else if (!strcmp(
"tpcdlg", val))
2244 {
char *tpcval = getenv(
"XRDTPCDLG");
2245 n = snprintf(bp, bleft,
"%s\n", (tpcval ? tpcval :
"tpcdlg"));
2246 bp += n; bleft -= n;
2248 else if (!strcmp(
"tls_port", val) &&
tlsPort)
2249 {n = snprintf(bp, bleft,
"%d\n",
tlsPort);
2250 bp += n; bleft -= n;
2252 else if (!strcmp(
"window", val) &&
Window)
2253 {n = snprintf(bp, bleft,
"%d\n",
Window);
2254 bp += n; bleft -= n;
2256 else if (!strcmp(
"version", val))
2257 {n = snprintf(bp, bleft,
"%s\n", XrdVSTRING);
2258 bp += n; bleft -= n;
2260 else if (!strcmp(
"vnid", val))
2261 {
const char *nidval = getenv(
"XRDCMSVNID");
2262 if (!nidval || !(*nidval)) nidval =
"vnid";
2263 n = snprintf(bp, bleft,
"%s\n", nidval);
2265 else if (!strcmp(
"fattr", val))
2266 {n = snprintf(bp, bleft,
"%s\n",
usxParms);
2267 bp += n; bleft -= n;
2269 else {n = strlen(val);
2270 if (bleft <= n)
break;
2271 strcpy(bp, val); bp +=n; *bp =
'\n'; bp++;
2274 }
while(bleft > 0 && (val = qcargs.GetToken()));
2293 bool isCMSD = (*val ==
'c');
2318 int XrdXrootdProtocol::do_Qfh()
2323 const char *fArg = 0, *qType =
"";
2335 "query does not refer to an open file");
2361 "Required query argument not present");
2366 TRACEP(FS,
"fh=" <<fh.handle <<
" query " <<qType <<
" rc=" <<rc);
2379 int XrdXrootdProtocol::do_Qopaque(
short qopt)
2384 const char *Act, *AData;
2392 myData.Arg2 = 0; myData.
Arg2Len = 0;
2394 Act =
" qopaque '"; AData =
"...";
2409 myData.Arg2 = opaque;
2428 TRACEP(FS,
"rc=" <<rc <<Act <<AData <<
"'");
2430 return fsError(rc, 0, myError, 0, 0);
2437 int XrdXrootdProtocol::do_Qspace()
2458 memmove(&
argp->
buff[n+1], opaque, strlen(opaque)+1);
2473 int XrdXrootdProtocol::do_Query()
2493 case kXR_QPrep:
return do_Prepare(
true);
2500 "Invalid information query type code");
2507 int XrdXrootdProtocol::do_Qxattr()
2529 memmove(&
argp->
buff[n+1], opaque, strlen(opaque)+1);
2543 int XrdXrootdProtocol::do_Read()
2545 int pathID, retc = 0;
2554 else if (do_ReadNone(retc, pathID))
return retc;
2565 "read does not refer to an open file");
2569 TRACEP(FSIO, pathID <<
" fh=" <<fh.handle <<
" read " <<
IO.
IOLen
2572 "Read length is negative");
2597 if (!pathID) pP =
this;
2598 else {
if (!(pP =
VerifyStream(retc, pathID,
false)))
return retc;
2624 if (pathID)
return do_Offload(&XrdXrootdProtocol::do_ReadAll, pathID);
2628 return do_ReadAll();
2639 int XrdXrootdProtocol::do_ReadAll()
2674 {
if ((rc = getBuff(1, Quantum)) <= 0)
return rc;}
2685 IO.Offset += xframt;
IO.
IOLen -= xframt;
2699 int XrdXrootdProtocol::do_ReadNone(
int &retc,
int &pathID)
2708 pathID =
static_cast<int>(rargs->
pathid);
2709 if ((ralsz -=
sizeof(
read_args)) <= 0)
return 0;
2728 "preread does not refer to an open file");
2746 int XrdXrootdProtocol::do_ReadV()
2760 int rdVBeg, rdVBreak, rdVNow, rdVNum, rdVecNum;
2761 int currFH, i, k, Quantum, Qleft, rdVecLen =
Request.header.dlen;
2763 int ioMon = (rvMon > 1);
2764 char *buffp, vType = (ioMon ? XROOTD_MON_READU : XROOTD_MON_READV);
2769 rdVecNum = rdVecLen / sizeof(readahead_list);
2770 if ( (rdVecNum <= 0) || (rdVecNum*hdrSZ != rdVecLen) )
2771 return Response.Send(kXR_ArgInvalid, "Read vector is invalid");
2777 if (rdVecNum > XrdProto::maxRvecsz)
2778 return
Response.
Send(kXR_ArgTooLong, "Read vector is too long");
2788 raVec = (readahead_list *)
argp->buff;
2790 for (i = 0; i < rdVecNum; i++)
2791 {totSZ += (rdVec[i].size = ntohl(raVec[i].rlen));
2792 if (rdVec[i].size < 0) return Response.Send(kXR_ArgInvalid,
2793 "Readv length is negative");
2794 if (rdVec[i].size > Quantum) return Response.Send(kXR_NoMemory,
2795 "Single readv transfer is too large");
2796 rdVec[i].offset = ntohll(raVec[i].offset);
2797 memcpy(&rdVec[i].info, raVec[i].fhandle, sizeof(int));
2802 rdVec[i].offset = -1;
2805 rdVBreak = rdVecNum;
2810 if (totSZ > 0x80000000LL)
2811 return
Response.
Send(kXR_NoMemory, "Total readv transfer is too large");
2816 Quantum = totSZ < maxTransz ? totSZ : maxTransz;
2820 if ((Quantum < halfBSize && Quantum > 1024) || Quantum > argp->bsize)
2821 {
if ((k = getBuff(1, Quantum)) <= 0)
return k;}
2828 "readv does not refer to an open file");
2833 currFH = rdVec[0].info;
2834 memcpy(respHdr.fhandle, &currFH,
sizeof(respHdr.fhandle));
2836 "readv does not refer to an open file");
2841 rdVBeg = rdVNow = 0; rdVXfr = rdVAmt = 0;
2845 for (i = 0; i < rdVecNum; i++)
2846 {
if (rdVec[i].info != currFH)
2848 if (xfrSZ != rdVAmt)
break;
2849 rdVNum = i - rdVBeg; rdVXfr += rdVAmt;
2853 htons(rdVNum),
rvSeq, vType);
2854 if (ioMon)
for (k = rdVBeg; k < i; k++)
2856 htonl(rdVec[k].size), htonll(rdVec[k].offset));
2858 rdVXfr = rdVAmt = 0;
2859 if (i == rdVBreak)
break;
2860 rdVBeg = rdVNow = i; currFH = rdVec[i].info;
2861 memcpy(respHdr.fhandle, &currFH,
sizeof(respHdr.fhandle));
2864 "readv does not refer to an open file");
2867 if (Qleft < (rdVec[i].size + hdrSZ))
2870 if (xfrSZ != rdVAmt)
break;
2876 rdVNow = i; rdVXfr += rdVAmt; rdVAmt = 0;
2879 xfrSZ = rdVec[i].size; rdVAmt += xfrSZ;
2880 respHdr.rlen = htonl(xfrSZ);
2881 respHdr.offset = htonll(rdVec[i].offset);
2882 memcpy(buffp, &respHdr, hdrSZ);
2883 rdVec[i].data = buffp + hdrSZ;
2884 buffp += (xfrSZ+hdrSZ); Qleft -= (xfrSZ+hdrSZ);
2885 TRACEP(FSIO,
"fh=" <<currFH<<
" readV "<< xfrSZ <<
'@'<<rdVec[i].offset);
2907 int XrdXrootdProtocol::do_Rm()
2937 int XrdXrootdProtocol::do_Rmdir()
2967 int XrdXrootdProtocol::do_Set()
2974 if (!setargs.GetLine() || !(val = setargs.GetToken(&rest)))
2983 if (!strcmp(
"appid", val))
2984 {
while(*rest && *rest ==
' ') rest++;
2988 else if (!strcmp(
"monitor", val))
return do_Set_Mon(setargs);
2989 else if (!strcmp(
"cache", val))
return do_Set_Cache(setargs);
3006 char *cmd, *cargs, *opaque =
nullptr;
3007 const char *myArgs[2];
3016 if (!(cmd = setargs.
GetToken(&cargs)))
3021 if (cargs && *cargs ==
'/')
3022 {
if (rpCheck(cargs, &opaque))
return rpEmsg(
"Setting", cargs);
3023 if (!Squash(cargs))
return vpEmsg(
"Setting", cargs);
3024 myData.ArgP = myArgs; myData.
Arg2Len = -2;
3028 myData.Arg2 = opaque; myData.
Arg2Len = (opaque ? strlen(opaque) : 0);
3035 TRACEP(FS,
"rc=" <<rc <<
"set cache " <<myData.
Arg1 <<
' ' <<cargs);
3037 return fsError(rc, 0, myError, 0, 0);
3053 if (!(val = setargs.
GetToken(&appid)))
3060 if (!strcmp(val,
"info"))
3062 {
while(*appid && *appid ==
' ') appid++;
3063 if (strlen(appid) > 1024) appid[1024] =
'\0';
3071 if (!strcmp(val,
"on"))
3074 {
while(*appid && *appid ==
' ') appid++;
3083 if (!strcmp(val,
"off"))
3085 {
while(*appid && *appid ==
' ') appid++;
3101 int XrdXrootdProtocol::do_Stat()
3107 char *opaque, xxBuff[1024];
3126 "stat does not refer to an open file");
3130 StatGen(buf,xxBuff,
sizeof(xxBuff)));
3153 memmove(&
argp->
buff[n+1], opaque, strlen(opaque)+1);
3163 StatGen(buf,xxBuff,
sizeof(xxBuff)));
3172 int XrdXrootdProtocol::do_Statx()
3176 char *path, *opaque, *respinfo =
argp->
buff;
3187 while((path = pathlist.GetLine()))
3188 {
if (rpCheck(path, &opaque))
return rpEmsg(
"Stating", path);
3189 if (!Squash(path))
return vpEmsg(
"Stating", path);
3191 TRACEP(FS,
"rc=" <<rc <<
" stat " <<path);
3194 else {
if (mode == (mode_t)-1) *respinfo = (char)
kXR_offline;
3195 else if (S_ISDIR(mode)) *respinfo = (
char)
kXR_isDir;
3210 int XrdXrootdProtocol::do_Sync()
3245 int XrdXrootdProtocol::do_Truncate()
3250 long long theOffset;
3269 "trunc does not refer to an open file");
3275 TRACEP(FS,
"fh=" <<fh.
handle <<
" trunc rc=" <<rc <<
" sz=" <<theOffset);
3296 TRACEP(FS,
"rc=" <<rc <<
" trunc " <<theOffset <<
' ' <<
argp->
buff);
3310 int XrdXrootdProtocol::do_Write()
3326 return do_WriteNone(pathID);
3333 "Write length is negative");
3352 {
if (pathID)
return do_Offload(&XrdXrootdProtocol::do_WriteAio,pathID);
3353 return do_WriteAio();
3361 if (pathID)
return do_Offload(&XrdXrootdProtocol::do_WriteAll, pathID);
3365 return do_WriteAll();
3376 int XrdXrootdProtocol::do_WriteAio()
3386 return do_WriteAll();
3402 int XrdXrootdProtocol::do_WriteAll()
3409 {
if ((rc = getBuff(0, Quantum)) <= 0)
return rc;}
3417 {
Resume = &XrdXrootdProtocol::do_WriteCont;
3424 return do_WriteNone();
3426 IO.Offset += Quantum;
IO.
IOLen -= Quantum;
3444 int XrdXrootdProtocol::do_WriteCont()
3452 return do_WriteNone();
3458 if (
IO.
IOLen > 0)
return do_WriteAll();
3466 int XrdXrootdProtocol::do_WriteNone()
3468 char *buff, dbuff[4096];
3478 blen =
sizeof(dbuff);
3487 if (rlen < 0)
return Link->
setEtext(
"link read error");
3491 Resume = &XrdXrootdProtocol::do_WriteNone;
3499 return do_WriteNoneMsg();
3504 int XrdXrootdProtocol::do_WriteNone(
int pathID,
XErrorCode ec,
3512 else do_WriteNoneMsg();
3528 return do_WriteNone();
3535 int XrdXrootdProtocol::do_WriteNoneMsg()
3589 return do_WriteNone();
3595 if (
IO.
IOLen > 0)
return do_WriteAll();
3603 int XrdXrootdProtocol::do_WriteV()
3621 long long totSZ, maxSZ;
3627 wrVecNum = wrVecLen / wveSZ;
3628 if ( (wrVecLen <= 0) || (wrVecNum*wveSZ != wrVecLen) )
3654 totSZ = 0; maxSZ = 0; k = 0; Quantum =
maxTransz; curFH = 0;
3655 for (
int i = 0; i < wrVecNum; i++)
3656 {
if (wrLst[i].
wlen == 0)
continue;
3657 memcpy(&wrVec[k].info, wrLst[i].
fhandle,
sizeof(
int));
3658 wrVec[k].
size = ntohl(wrLst[i].
wlen);
3659 if (wrVec[k].size < 0)
3663 if (wrVec[k].size > Quantum)
3668 if (wrVec[k].info == curFH) totSZ += wrVec[k].
size;
3669 else {
if (maxSZ < totSZ) maxSZ = totSZ;
3670 totSZ = wrVec[k].
size;
3677 if (maxSZ < totSZ) maxSZ = totSZ;
3688 else Quantum =
static_cast<int>(maxSZ);
3692 if ((Quantum < halfBSize && Quantum > 1024) || Quantum >
argp->
bsize)
3693 {
if (getBuff(0, Quantum) <= 0)
return -1;}
3722 freeInfo.doit =
false;
3731 int XrdXrootdProtocol::do_WriteVec()
3744 {
if (rc < 0)
return rc;
3746 Resume = &XrdXrootdProtocol::do_WriteVec;
3754 done = newfile =
false;
3774 if (done || newfile)
3791 if (xfrSZ< 0)
break;
3857 for (i = 1; i < sfvnum; i++) xframt += sfvec[i].sendsz;
3858 if (xframt >
IO.
IOLen)
return 1;
3874 else IO.
File->fdNum = fildes;
3884 int XrdXrootdProtocol::fsError(
int rc,
char opC,
XrdOucErrInfo &myError,
3885 const char *
Path,
char *Cgi)
3887 int ecode, popt, rs;
3899 return fsOvrld(opC,
Path, Cgi);
3909 if (Cgi) rs = fsRedirNoEnt(
eMsg, Cgi, popt);
3932 <<
eMsg <<
':' <<ecode);
3949 if (ecode <= 0) ecode = 1800;
3954 return (rc ? rc : 1);
3990 sprintf(buff,
"%d", rc);
4002 int XrdXrootdProtocol::fsOvrld(
char opC,
const char *
Path,
char *Cgi)
4004 static const char *prot =
"root://";
4005 static int negOne = -1;
4006 static char quest =
'?', slash =
'/';
4008 struct iovec rdrResp[8];
4009 char *destP=0, dest[512];
4010 int iovNum=0, pOff, port;
4018 { rdrResp[1].iov_base = (
char *)&negOne;
4019 rdrResp[1].iov_len =
sizeof(negOne);
4020 rdrResp[2].iov_base = (
char *)prot;
4021 rdrResp[2].iov_len = 7;
4022 rdrResp[3].iov_base = (
char *)dest;
4023 rdrResp[3].iov_len = strlen(dest);
4024 rdrResp[4].iov_base = (
char *)&slash;
4025 rdrResp[4].iov_len = (*
Path ==
'/' ? 1 : 0);
4026 rdrResp[5].iov_base = (
char *)(
Path+pOff);
4027 rdrResp[5].iov_len = strlen(
Path+pOff);
4029 {rdrResp[6].iov_base = (
char *)?
4030 rdrResp[6].iov_len =
sizeof(quest);
4031 rdrResp[7].iov_base = (
char *)Cgi;
4032 rdrResp[7].iov_len = strlen(Cgi);
4072 int XrdXrootdProtocol::fsRedirNoEnt(
const char *
eMsg,
char *Cgi,
int popt)
4074 struct iovec ioV[4];
4075 char *tried, *trend, *ptried = 0;
4082 {
do {
if (!(tried = strstr(Cgi,
"tried=")))
break;
4083 if (tried == trend || *(tried-1) ==
'&')
4084 {
if (!ptried || (*(tried+6) && *(tried+6) !=
'&')) ptried=tried;}
4085 Cgi = index(tried+6,
'&');
4092 if ((tried = ptried))
4094 while(*(tried+1) && *(tried+1) ==
',') tried++;
4095 trend = index(tried,
'&');
4096 if (trend) {tlen = trend - tried; *trend = 0;}
4097 else tlen = strlen(tried);
4104 if ((trend = tried) &&
eMsg)
4105 do {
if ((trend = strstr(trend,
myCName)))
4108 trend = index(trend+
myCNlen,
',');
4116 if (!tried || !tlen || tlen > 16384)
4124 ioV[1].iov_base = (
char *)&pnum;
4125 ioV[1].iov_len =
sizeof(pnum);
4128 ioV[3].iov_base = tried;
4129 ioV[3].iov_len = tlen;
4151 int XrdXrootdProtocol::fsRedirPI(
const char *trg,
int port,
int trglen)
4153 std::string outTarget;
4171 << outTarget.c_str()
4172 <<
" portarg=" << newPort);
4174 outTarget.c_str(), outTarget.size());
4180 snprintf(mbuff,
sizeof(mbuff),
"Redirect failed; %s", errMsg.c_str());
4194 int XrdXrootdProtocol::getBuff(
const int isRead,
int Quantum)
4213 "insufficient memory to read file" :
4214 "insufficient memory to write file"));
4225 char *XrdXrootdProtocol::getCksType(
char *opaque,
char *cspec,
int cslen)
4231 if (opaque && *opaque)
4233 if ((cksT = jobEnv.Get(
"cks.type")))
4235 while(tP && strcasecmp(tP->
text, cksT)) tP = tP->
next;
4236 if (!tP && cspec) snprintf(cspec, cslen,
"%s", cksT);
4237 return (tP ? tP->
text : 0);
4250 bool XrdXrootdProtocol::logLogin(
bool xauth)
4252 const char *uName, *ipName, *tMsg, *zMsg =
"";
4253 char lBuff[512], pBuff[512];
4269 if (*tMsg) zMsg =
" ";
4273 snprintf(lBuff,
sizeof(lBuff),
"%s %s %s%slogin%s%s",
4276 (xauth ?
" as " :
""),
4277 (uName ? uName :
""));
4282 {snprintf(pBuff,
sizeof(pBuff),
"via %s auth for %s",
4300 eDest.
Emsg(
"Xeq",
"session requires TLS but",
Link->
ID,
"is incapable.");
4324 #define Map_Mode(x,y) if (Mode & kXR_ ## x) newmode |= S_I ## y
4326 int XrdXrootdProtocol::mapMode(
int Mode)
4348 const char *bP = Buff;
4351 else {snprintf(Buff,
sizeof(Buff),
4352 "&p=%s&n=%s&h=%s&o=%s&r=%s&g=%s&m=%s%s&I=%c",
4374 int XrdXrootdProtocol::rpCheck(
char *fn,
char **opaque)
4383 if (!(cp = index(fn,
'?'))) *opaque = 0;
4384 else {*cp =
'\0'; *opaque = cp+1;
4385 if (!**opaque) *opaque = 0;
4388 if (*fn !=
'/')
return 0;
4390 while ((cp = index(fn,
'/')))
4392 if (fn[0] ==
'.' && fn[1] ==
'.' && (fn[2] ==
'/' || fn[2] ==
'\0'))
4402 int XrdXrootdProtocol::rpEmsg(
const char *op,
char *fn)
4405 snprintf(buff,
sizeof(buff)-1,
"%s relative path '%s' is disallowed.",op,fn);
4406 buff[
sizeof(buff)-1] =
'\0';
4424 else if (theFile->fdNum >= 0) theFile->
sfEnabled = 1;
4435 int XrdXrootdProtocol::Squash(
char *fn)
4437 char *ofn, *ifn = fn;
4444 || (*(ifn+1) ==
'.' && *(ifn+1) && *(ifn+2) ==
'/'))
break;
4451 while(*ifn) {*ofn = *ifn++;
4453 {
while(*ifn ==
'/') ifn++;
4454 if (ifn[0] ==
'.' && ifn[1] ==
'/') ifn += 2;
4468 int XrdXrootdProtocol::vpEmsg(
const char *op,
char *fn)
4471 snprintf(buff,
sizeof(buff)-1,
"%s path '%s' is disallowed.",op,fn);
4472 buff[
sizeof(buff)-1] =
'\0';
struct ClientTruncateRequest truncate
#define kXR_ShortProtRespLen
struct ClientCloseRequest close
struct ClientMkdirRequest mkdir
struct ClientAuthRequest auth
#define kXR_PROTSIGNVERSION
struct ClientDirlistRequest dirlist
struct ClientOpenRequest open
struct ClientRequestHdr header
struct ClientWriteVRequest writev
struct ClientLoginRequest login
struct ClientChmodRequest chmod
struct ClientQueryRequest query
struct ClientReadRequest read
struct ClientMvRequest mv
struct ClientBindRequest bind
#define kXR_PROTOCOLVERSION
struct ClientEndsessRequest endsess
struct ClientSyncRequest sync
struct ClientPrepareRequest prepare
struct ClientStatRequest stat
struct ClientWriteRequest write
ServerResponseReqs_Protocol secreq
struct ClientProtocolRequest protocol
struct ClientLocateRequest locate
struct ClientCloneRequest clone
int emsg(int rc, char *msg)
const char * Arg1
PLUGFS, PLUGIN, PLUGIO, PLUGXC.
int Arg2Len
Length or -count of args in extension.
char * notify
Notification path or 0.
XrdOucTList * paths
List of paths.
XrdOucTList * oinfo
1-to-1 correspondence of opaque info
long long XrdSfsFileOffset
< SFS_FSCTL_PLUGIN/PLUGIO/PLUGXC/PLUGFS parms
const char * XrdSysE2T(int errcode)
XrdOucString * XrdXrootdCF
const kXR_char XROOTD_MON_OPENW
const kXR_char XROOTD_MON_STAT
const kXR_char XROOTD_MON_REDLOCAL
const kXR_char XROOTD_MON_PREP
const kXR_char XROOTD_MON_OPENC
const kXR_char XROOTD_MON_TRUNC
const kXR_char XROOTD_MON_CLOSE
const kXR_char XROOTD_MON_CHMOD
const kXR_char XROOTD_MON_LOCATE
const kXR_char XROOTD_MON_OPENR
const kXR_char XROOTD_MON_MV
const kXR_char XROOTD_MON_RMDIR
const kXR_char XROOTD_MON_RM
const kXR_char XROOTD_MON_OPENDIR
const kXR_char XROOTD_MON_QUERY
const kXR_char XROOTD_MON_MKDIR
XrdSysTrace XrdXrootdTrace
#define STATIC_REDIRECT(xfnc)
static const char * errName(kXR_int32 errCode)
static int mapError(int rc)
void Release(XrdBuffer *bp)
XrdBuffer * Obtain(int bsz)
static const int ValuSize
static const int NameSize
static XrdCryptoLite_BFecb * Instance(const unsigned char *key=0, unsigned int klen=0)
void Decrypt(const unsigned char *in8, unsigned char *out8)
void Encrypt(const unsigned char *in8, unsigned char *out8)
static bool GetAssumeV4()
static XrdLink * fd2link(int fd)
static bool RegisterCloseRequestCb(XrdLink *lp, XrdProtocol *pp, bool(*cb)(void *), void *cbarg)
void Serialize()
Wait for all outstanding requests to be completed on the link.
int setEtext(const char *text)
bool setTLS(bool enable, XrdTlsContext *ctx=0)
Enable or disable TLS on the link.
int Recv(char *buff, int blen)
const char * Host() const
int Terminate(const char *owner, int fdnum, unsigned int inst)
void setID(const char *userid, int procid)
XrdNetAddrInfo * AddrInfo()
char * ID
Pointer to the client's link identity.
void setProtName(const char *name)
void setLocation(XrdNetAddrInfo::LocInfo &loc)
unsigned int Inst() const
bool isIPType(IPType ipType) const
bool getEA(int &ec, int &ac)
static bool getEA(const char *cgi, int &ecode, int &acode)
virtual Handle * Begin(XrdSecEntity &Client, const char *path=0, const char *cgi=0, const char *app=0)=0
virtual void Done(int &Result, XrdOucErrInfo *eInfo, const char *Path=0)=0
void setErrCB(XrdOucEICB *cb, unsigned long long cbarg=0)
const char * getErrText()
int setErrInfo(int code, const char *emsg)
void setUCap(int ucval)
Set user capabilties.
void Reset()
Reset object to no message state. Call this method to release appendages.
char * ID(char *buff, int blen)
char * isMine(char *reqid, int &hport, char *hname, int hlen)
const char * c_str() const
char * GetToken(char **rest=0, int lowcase=0)
static void Sanitize(char *instr, char subc='_')
static int isFWD(const char *path, int *port=0, char *hBuff=0, int hBLen=0, bool pTrim=false)
static std::string UrlEncode(const std::string &input)
void Schedule(XrdJob *jp)
bool Add(XrdSecAttr &attr)
XrdSecAttr * Get(const void *sigkey)
char * vorg
Entity's virtual organization(s)
const char * pident
Trace identifier (originator)
XrdNetAddrInfo * addrInfo
Entity's connection details.
XrdSecEntityAttr * eaAPI
non-const API to attributes
const char * tident
Trace identifier always preset.
char prot[XrdSecPROTOIDSIZE]
Auth protocol used (e.g. krb5)
XrdSecMonitor * secMon
If !0 security monitoring enabled.
char * grps
Entity's group name(s)
char * name
Entity's name.
unsigned int ueid
Unique ID of entity instance.
char * role
Entity's role(s)
void Display(XrdSysError &mDest)
char * moninfo
Information for monitoring.
char * host
Entity's host name dnr dependent.
virtual XrdSecProtect * New4Server(XrdSecProtocol &aprot, int plvl)
virtual int ProtResp(ServerResponseReqs_Protocol &resp, XrdNetAddrInfo &nai, int pver)
virtual void Delete()=0
Delete the protocol object. DO NOT use C++ delete() on this object.
virtual int Authenticate(XrdSecCredentials *cred, XrdSecParameters **parms, XrdOucErrInfo *einfo=0)=0
virtual const char * getParms(int &size, XrdNetAddrInfo *endPoint=0)=0
virtual bool PostProcess(XrdSecEntity &entity, XrdOucErrInfo &einfo)
virtual XrdSecProtocol * getProtocol(const char *host, XrdNetAddrInfo &endPoint, const XrdSecCredentials *cred, XrdOucErrInfo &einfo)=0
virtual int autoStat(struct stat *buf)
virtual const char * nextEntry()=0
virtual int open(const char *path, const XrdSecEntity *client=0, const char *opaque=0)=0
virtual XrdSfsDirectory * newDir(char *user=0, int MonID=0)=0
virtual void Connect(const XrdSecEntity *client=0)
virtual int chmod(const char *path, XrdSfsMode mode, XrdOucErrInfo &eInfo, const XrdSecEntity *client=0, const char *opaque=0)=0
virtual int fsctl(const int cmd, const char *args, XrdOucErrInfo &eInfo, const XrdSecEntity *client=0)=0
virtual int rename(const char *oPath, const char *nPath, XrdOucErrInfo &eInfo, const XrdSecEntity *client=0, const char *opaqueO=0, const char *opaqueN=0)=0
virtual int mkdir(const char *path, XrdSfsMode mode, XrdOucErrInfo &eInfo, const XrdSecEntity *client=0, const char *opaque=0)=0
virtual int FSctl(const int cmd, XrdSfsFSctl &args, XrdOucErrInfo &eInfo, const XrdSecEntity *client=0)
virtual int truncate(const char *path, XrdSfsFileOffset fsize, XrdOucErrInfo &eInfo, const XrdSecEntity *client=0, const char *opaque=0)=0
virtual int chksum(csFunc Func, const char *csName, const char *path, XrdOucErrInfo &eInfo, const XrdSecEntity *client=0, const char *opaque=0)
virtual int remdir(const char *path, XrdOucErrInfo &eInfo, const XrdSecEntity *client=0, const char *opaque=0)=0
virtual int prepare(XrdSfsPrep &pargs, XrdOucErrInfo &eInfo, const XrdSecEntity *client=0)=0
virtual int stat(const char *Name, struct stat *buf, XrdOucErrInfo &eInfo, const XrdSecEntity *client=0, const char *opaque=0)=0
virtual XrdSfsFile * newFile(char *user=0, int MonID=0)=0
virtual int rem(const char *path, XrdOucErrInfo &eInfo, const XrdSecEntity *client=0, const char *opaque=0)=0
virtual XrdSfsXferSize writev(XrdOucIOVec *writeV, int wdvCnt)
virtual int SendData(XrdSfsDio *sfDio, XrdSfsFileOffset offset, XrdSfsXferSize size)
virtual int open(const char *fileName, XrdSfsFileOpenMode openMode, mode_t createMode, const XrdSecEntity *client=0, const char *opaque=0)=0
virtual XrdSfsXferSize read(XrdSfsFileOffset offset, XrdSfsXferSize size)=0
virtual XrdSfsXferSize readv(XrdOucIOVec *readV, int rdvCnt)
virtual int Clone(XrdSfsFile &srcFile)
virtual int truncate(XrdSfsFileOffset fsize)=0
virtual const char * FName()=0
virtual int getCXinfo(char cxtype[4], int &cxrsz)=0
virtual int stat(struct stat *buf)=0
virtual void setXio(XrdSfsXio *xioP)
virtual int fctl(const int cmd, const char *args, XrdOucErrInfo &eInfo)=0
virtual XrdSfsXferSize write(XrdSfsFileOffset offset, const char *buffer, XrdSfsXferSize size)=0
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)
void Log(int mask, const char *esfx, const char *text1, const char *text2=0, const char *text3=0)
static void Snooze(int seconds)
virtual void numLocks(const char *path, int &rcnt, int &wcnt)=0
virtual int Unlock(const char *path, char mode)=0
virtual int Lock(const char *path, char mode, bool force)=0
void rvOps(int rsz, int ssz)
void wvOps(int wsz, int ssz)
int Add(XrdXrootdFile *fp)
XrdXrootdFile * Get(int fnum)
XrdXrootdFile * Del(XrdXrootdMonitor *monP, int fnum, bool dodel=true)
int Schedule(const char *jkey, const char **args, XrdXrootdResponse *resp, int Opts=0)
int Cancel(const char *jkey=0, XrdXrootdResponse *resp=0)
static void Open(XrdXrootdFileStats *fsP, const char *Path, unsigned int uDID, bool isRW)
kXR_unt32 MapInfo(const char *Info)
kXR_unt32 MapPath(const char *Path)
void Register(const char *Uname, const char *Hname, const char *Pname, unsigned int xSID=0)
void Report(const char *Info)
void Add_rv(kXR_unt32 dictid, kXR_int32 rlen, kXR_int16 vcnt, kXR_char vseq, kXR_char vtype)
void Add_rd(kXR_unt32 dictid, kXR_int32 rlen, kXR_int64 offset)
void Add_wr(kXR_unt32 dictid, kXR_int32 wlen, kXR_int64 offset)
void Open(kXR_unt32 dictid, off_t fsize)
int Write(long long offs, int dlen) override
void Read(long long offs, int dlen) override
static XrdXrootdNormAio * Alloc(XrdXrootdProtocol *protP, XrdXrootdResponse &resp, XrdXrootdFile *fP)
int(XrdXrootdProtocol::* ResumePio)()
static XrdXrootdPio * Alloc(int n=1)
void Set(int(XrdXrootdProtocol::*Invoke)(), XrdXrootd::IOParms &io, const kXR_char *theSID)
static int List(XrdXrootdPrepArgs &pargs, char *resp, int resplen)
static void Log(XrdXrootdPrepArgs &pargs)
static void Logdel(char *reqid)
static XrdXrootdStats * SI
int SendFile(int fildes) override
XrdXrootdProtocol * VerifyStream(int &rc, int pID, bool lok=true)
static XrdSfsFileSystem * digFS
int SetSF(kXR_char *fhandle, bool seton=false)
XrdNetPMark::Handle * pmHandle
static XrdNetPMark * PMark
XrdXrootdProtocol * Stream[maxStreams]
static XrdXrootdXPath RPList
static const char Req_TLSGPFile
static bool CloseRequestCb(void *cbarg)
void SetFD(int fildes) override
static const char Req_TLSSess
XrdXrootdFileTable * FTab
static XrdXrootdJob * JobCKS
static XrdSysError & eDest
static unsigned int getSID()
XrdSecProtocol * AuthProt
int getData(gdCallBack *gdcbP, const char *dtype, char *buff, int blen)
XrdXrootdMonitor::User Monitor
static XrdXrootdRedirPI * RedirPI
static const char * myCName
static const char Req_TLSData
static XrdXrootdFileLock * Locker
int(XrdXrootdProtocol::* Resume)()
static const char Req_TLSTPC
static XrdTlsContext * tlsCtx
static XrdXrootdXPath XPList
static XrdScheduler * Sched
static const char Req_TLSLogin
XrdXrootdResponse Response
int(XrdXrootdProtocol::* ResumePio)()
static const int maxStreams
static XrdOucTList * JobCKTLST
static XrdXrootdXPath RQList
static XrdSecProtector * DHS
static XrdBuffManager * BPool
XrdSysSemaphore * boundRecycle
static XrdSecService * CIA
static RAtomic_int srvrAioOps
static uint64_t fsFeatures
static XrdOucReqID * PrepID
static struct XrdXrootdProtocol::RD_Table Route[RD_Num]
static XrdSfsFileSystem * osFS
static Outcome Redirect(const char *trg, int &port, XrdNetAddrInfo &clientAddr, std::string &outTarget, std::string &errMsg)
void setID(unsigned long long id)
unsigned long long getID()
void StreamID(kXR_char *sid)
int Stats(char *buff, int blen, int do_sync=0)
int Validate(const char *pd, const int pl=0)
static const int maxRvecsz
static const int maxClonesz
static const int maxWvecsz
static const uint64_t hasCACH
Feature: Implements a data cache.
static const uint64_t hasSXIO
Feature: Supports SfsXio.
static const uint64_t hasFICL
Feature: Supports file cloning and samefs.
ssize_t Send(int fd, KernelBuffer &buffer)
static const kXR_int32 doSync
char TimeZone
+/- hours from GMT (-128 if not set)
unsigned char Country[2]
Two letter TLD country code.
static const int uRedirFlgs
ucap: Client supports "file://"
static const int uUrlOK
ucap: Supports async responses
static const int uIPv64
ucap: Supports only IPv4 info
static const int uReadR
ucap: Supports multiple protocols
static const int uEcRedir
ucap: Client supports redirect flags
static const int uMProt
ucap: Supports url redirects
static const int uLclF
ucap: Client is on a private net
static const int uAsync
ucap: Extract protocol version
static const int uIPv4
ucap: Supports read redirects
Generic structure to pass security information back and forth.
char * buffer
Pointer to the buffer.
int size
Size of the buffer or length of data in the buffer.
static const int useBasic