38 #include <sys/types.h>
48 struct csTable {
const char *csName;
int csLenC;
int csLenB;} csTab[]
59 static const int csNum =
sizeof(csTab)/
sizeof(csTable);
61 bool LowerCase(
const char *src,
char *dst,
int dstlen)
67 if (n >= dstlen)
return false;
71 memset(dst+n, 0, dstlen-n);
72 for (
int i = 0; i < n; i++) dst[i] = tolower(src[i]);
85 const char *csval, time_t mtime)
87 std::vector<char> cksError;
90 int n = strlen(cstype);
94 if (!LowerCase(cstype, csName,
sizeof(csName)))
95 {errno = ENAMETOOLONG;
return cksError;}
101 for (
int i = 0; i < csNum; i++)
102 {
if (!strcmp(csTab[i].csName, csName) && csTab[i].csLenC != n)
103 {errno = EINVAL;
return cksError;}
108 if (!cksData.
Set(csName)) {errno = ENAMETOOLONG;
return cksError;}
109 if (!cksData.
Set(csval, n)) {errno = EOVERFLOW;
return cksError;}
110 cksData.fmTime = mtime;
111 cksData.
csTime = time(0) - mtime;
115 return std::vector<char>( (
char *)&cksData,
116 ((
char *)&cksData) +
sizeof(cksData));
129 int pfxlen = strlen(nspfx);
134 {
if (!strcmp(cstype,
"adler32"))
return std::string(
"XrdCks.adler32");
135 if (!strcmp(cstype,
"md5" ))
return std::string(
"XrdCks.md5");
136 if (!strcmp(cstype,
"crc32" ))
return std::string(
"XrdCks.crc32");
141 if (!LowerCase(cstype, csName,
sizeof(csName)))
142 {errno = ENAMETOOLONG;
return xaName;}
146 xaName.reserve(strlen(nspfx) + strlen(cstype) + 8);
149 if (nspfx[pfxlen-1] !=
'.') xaName +=
'.';
164 const char *csbuff,
int csblen)
172 if (csblen != (
int)
sizeof(cksData)) {errno = EMSGSIZE;
return csError;}
176 memcpy(&cksData, csbuff,
sizeof(cksData));
181 {errno = ENOENT;
return csError;}
183 {errno = EINVAL;
return csError;}
187 for (
int i = 0; i < csNum; i++)
188 {
if (!strcmp(csTab[i].csName, cstype)
189 && csTab[i].csLenB !=
int(cksData.
Length))
190 {errno = EINVAL;
return csError;}
195 if (!cksData.
Get(csBuff,
sizeof(csBuff)))
196 {errno = EOVERFLOW;
return csError;}
200 return std::string(csBuff);
std::vector< char > XrdCksAttrData(const char *cstype, const char *csval, time_t mtime)
std::string XrdCksAttrName(const char *cstype, const char *nspfx)
std::string XrdCksAttrValue(const char *cstype, const char *csbuff, int csblen)
static const int ValuSize
int Set(const char *csName)
int Get(char *Buff, int Blen)
static const int NameSize