126{
128 char WorkBuff[4096], *hList, *wP = WorkBuff;
129 int n, dataLen;
130
131
132
134
135
136
137 n = sendData(Link, Data);
140
141
142
143 if ((n = Link->
RecvAll((
char *)&LIHdr,
sizeof(LIHdr), timeout)) < 0)
144 return Emsg(Link, (n == -ETIMEDOUT ? "timed out" : "rejected"));
145
146
147
148 if ((dataLen = static_cast<int>(ntohs(LIHdr.datalen))))
149 {if (dataLen > (int)sizeof(WorkBuff))
150 return Emsg(Link, "login reply too long");
151 if (Link->
RecvAll(WorkBuff, dataLen, timeout) < 0)
152 return Emsg(Link, "login receive error");
153 }
154
155
156
160 dataLen = static_cast<int>(ntohs(LIHdr.datalen));
161 if (dataLen > (int)sizeof(WorkBuff))
162 return Emsg(Link, "login reply too long");
163 }
164
165
166
170 return Emsg(Link, "malformed try host data");
175 }
176
177
178
180 {unsigned int eRC;
182 return Emsg(Link, "invalid error reply");
184 memcpy(&eRC, WorkBuff, sizeof(eRC));
185 eRC = ntohl(eRC);
187 }
188
189
190
192 || !Parser.
Parse(&Data, WorkBuff, WorkBuff+dataLen))
193 return Emsg(Link, "invalid login response");
194
195
196
199 return 0;
200}
static int Identify(XrdLink *Link, XrdCms::CmsRRHdr &inHdr, char *authBuff, int abLen)
int RecvAll(char *buff, int blen, int timeout=-1)
static int Unpack(char **buff, const char *bend, char **data, int &dlen)