* Read a packet from a data socket * Returns -1 if error and sets errno. */
| 217 | * Returns -1 if error and sets errno. |
| 218 | */ |
| 219 | int |
| 220 | NgRecvData(int ds, u_char * buf, size_t len, char *hook) |
| 221 | { |
| 222 | u_char frombuf[NG_HOOKSIZ + NGSA_OVERHEAD]; |
| 223 | struct sockaddr_ng *const from = (struct sockaddr_ng *) frombuf; |
| 224 | socklen_t fromlen = sizeof(frombuf); |
| 225 | int rtn, errnosv; |
| 226 | |
| 227 | /* Read packet */ |
| 228 | rtn = recvfrom(ds, buf, len, 0, (struct sockaddr *) from, &fromlen); |
| 229 | if (rtn < 0) { |
| 230 | errnosv = errno; |
| 231 | if (_gNgDebugLevel >= 1) |
| 232 | NGLOG("recvfrom"); |
| 233 | errno = errnosv; |
| 234 | return (-1); |
| 235 | } |
| 236 | |
| 237 | /* Copy hook name */ |
| 238 | if (hook != NULL) |
| 239 | strlcpy(hook, from->sg_data, NG_HOOKSIZ); |
| 240 | |
| 241 | /* Debugging */ |
| 242 | if (_gNgDebugLevel >= 2) { |
| 243 | NGLOGX("READ %s from hook \"%s\" (%d bytes)", |
| 244 | rtn ? "PACKET" : "EOF", from->sg_data, rtn); |
| 245 | if (_gNgDebugLevel >= 3) |
| 246 | _NgDebugBytes(buf, rtn); |
| 247 | } |
| 248 | |
| 249 | /* Done */ |
| 250 | return (rtn); |
| 251 | } |
| 252 | |
| 253 | /* |
| 254 | * Identical to NgRecvData() except buffer is dynamically allocated. |
no test coverage detected