33 #include <netinet/in.h>
40 #include "XrdSys/XrdWin32.hh"
57 struct iovec *vP = *iovP;
62 vP->iov_base = (
char *)&buff; vP->iov_len =
sizeof(buff); vP++;
65 {dlen =
static_cast<unsigned short>(strlen(data)+1);
67 vP->iov_base = (
char *)data; vP->iov_len = dlen; vP++;
68 }
else {buff = 0; dlen = 0;}
71 return dlen+
sizeof(buff);
81 struct iovec *vP = *iovP;
83 vP->iov_base = (
char *)&buff; vP->iov_len =
sizeof(buff); vP++;
86 {buff = htons(
static_cast<unsigned short>(dlen));
87 vP->iov_base = (
char *)data; vP->iov_len = dlen; vP++;
88 }
else {buff = 0; dlen = 0;}
91 return dlen+
sizeof(buff);
104 {
if (dlen < 0) dlen = strlen(data)+1;
105 xlen = htons(
static_cast<unsigned short>(dlen));
106 memcpy(bp, &xlen,
sizeof(xlen)); bp +=
sizeof(xlen);
107 memcpy(bp, data, dlen);
109 }
else {*bp++ =
'\0'; *bp++ =
'\0'; dlen = 0;}
112 return dlen+
sizeof(xlen);
120 unsigned int netData = htonl(data);
124 {*bp =
static_cast<char>(
PT_int);
125 memcpy(bp+1, &netData,
sizeof(netData));
126 *buff = bp +
sizeof(netData)+1;
127 return sizeof(netData)+1;
130 memcpy(bp, &netData,
sizeof(netData));
131 *buff = bp +
sizeof(netData);
132 return sizeof(netData);
138 char *base,
char *Work)
140 static char Nil[] = {
PT_char,
'\0'};
141 static const int Sz16 =
sizeof(short) + 1;
142 static const int Sz32 =
sizeof(int) + 1;
143 static const int Sz64 =
sizeof(
long long) + 1;
144 struct iovec *vP = iovP;
147 int Dtype, dlen = 0, TotLen = 0;
149 unsigned long long n64;
153 union {
unsigned long long *B64;
159 do {Base.B08 = (
char **)(base + pP->
Doffs);
164 if (!*Base.B08) {vP->iov_base = Nil; vP->iov_len = 2;
165 vP++; TotLen += 2;
break;
167 dlen = (pP->
Dlen < 0 ? strlen(*Base.B08)+1 : pP->
Dlen);
169 return eMsg(
"string too long packing",
int(pP-pup), pP);
171 return eMsg(
"too many args packing",
int(pP-pup), pP);
172 n16 = htons(
static_cast<unsigned short>(dlen));
173 vP->iov_base = wP; vP->iov_len =
sizeof(n16); vP++;
174 memcpy(wP, &n16,
sizeof(n16)); wP +=
sizeof(n16);
175 vP->iov_base = *Base.B08; vP->iov_len = dlen; vP++;
176 TotLen += dlen +
sizeof(n16);
180 n16 = htons(*Base.B16);
182 memcpy(wP+1, &n16,
sizeof(n16));
183 vP->iov_base = wP; vP->iov_len = Sz16; vP++;
184 wP += Sz16; TotLen += Sz16; dlen =
sizeof(n16);
188 n32 = htonl(*Base.B32);
189 *wP =
static_cast<char>(
PT_int);
190 memcpy(wP+1, &n32,
sizeof(n32));
191 vP->iov_base = wP; vP->iov_len = Sz32; vP++;
192 wP += Sz32; TotLen += Sz32; dlen =
sizeof(n32);
196 h2nll(*Base.B64, n64);
198 memcpy(wP+1, &n64,
sizeof(n64));
199 vP->iov_base = wP; vP->iov_len = Sz64; vP++;
200 wP += Sz64; TotLen += Sz64; dlen =
sizeof(n64);
210 *Base.B08 = (
char *)vP;
228 *Base.B16 = htons(
static_cast<unsigned short>(TotLen));
229 return static_cast<int>(vP-iovP);
232 return static_cast<int>(vP-iovP);
238 }
while(vP < iovE || (vP==iovE && Dtype !=
PT_Skip && (Dtype &
PT_MaskD)));
242 return eMsg(
"arg list too long packing",
int(pP-pup), pup);
260 if ((bnxt = bnxt+
sizeof(temp)) > bend)
return 0;
261 memcpy(&temp, *buff,
sizeof(temp));
262 dlen =
static_cast<int>(ntohs(temp));
266 if (dlen) {*data = (
char *)bnxt; bnxt += dlen;}
269 return (bnxt <= bend);
277 const char *bp = buff, *dp;
279 int dlen = 0, Dtype, Aok = 0, Done = 0;
280 union {
unsigned long long b64;
283 unsigned char b08;} Temp;
285 union {
unsigned long long *B64;
292 {Base.B08 = (
char **)(base+uP->
Doffs);
304 {
if (bp == bend && Aok) {Done = 1; uP--;
break;}
305 return eMsg(
"buffer overrun unpacking",
int(uP-pup), uP);
308 {memcpy(&Temp.b16, bp,
sizeof(
unsigned short));
309 dlen =
static_cast<int>(ntohs(Temp.b16));
310 bp +=
sizeof(
unsigned short);
313 return eMsg(
"buffer overrun unpacking",
int(uP-pup), uP);
314 else *Base.B08 = (
char *)bp;
315 else if (!Aok)
break;
318 Dtype =
static_cast<int>(*bp &
PT_MaskT);
319 if ((
unsigned char)Dtype != uP->
Dtype)
320 return eMsg(
"arg/data mismatch unpacking",
int(uP-pup), uP);
321 if (!(dlen = (*bp &
PT_MaskB)>>3)) dlen =
sizeof(
unsigned short);
324 return eMsg(
"buffer overrun unpacking",
int(uP-pup), uP);
325 memcpy(&Temp.b64, dp, dlen);
329 {
case PT_short: *Base.B16 = ntohs(Temp.b16);
break;
331 case PT_int: *Base.B32 = ntohl(Temp.b32);
break;
333 case PT_longlong: *Base.B64 = ntohll(Temp.b64);
break;
344 return static_cast<int>(uP-pup);
345 return eMsg(
"missing arg unpacking",
int(uP-pup), uP);
352 int XrdOucPup::eMsg(
const char *etxt,
int ino,
XrdOucPupArgs *pup)
359 if (!eDest)
return 0;
364 {
case PT_char: dtn =
"char";
break;
365 case PT_short: dtn =
"short";
break;
366 case PT_int: dtn =
"int";
break;
369 default: dtn =
"";
break;
374 sprintf(buff,
"%s arg %d: %s.", dtn, ino,
377 eDest->
Emsg(
"Pup", etxt, buff);
static int Unpack(char **buff, const char *bend, char **data, int &dlen)
static int Pack(struct iovec **, const char *, unsigned short &buff)
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)