#include <fcntl.h>
#include <sys/param.h>
#include <sys/errno.h>
#include <netat/appletalk.h>
#include <netat/ddp.h>
#include <netat/pap.h>
#include "at_proto.h"
#define SET_ERRNO(e) errno = e
extern struct pap_state *paps[];
extern int papm[];
int
pap_read(int fd, u_char *data, int len)
{
register int i;
register struct pap_state *papp;
int userdata;
u_char *puserdata = (u_char *)&userdata;
at_resp_t resp;
at_retry_t retry;
at_inet_t dest;
if (fd < 0 || data == 0)
return -1;
if (len <= 0)
return(0);
papp = paps[papm[fd]];
if (papp == NULL) {
SET_ERRNO(EINVAL);
return -1;
}
if (papp->pap_eof)
return 0;
dest = papp->pap_to;
puserdata[0] = papp->pap_connID;
puserdata[1] = AT_PAP_TYPE_SEND_DATA;
papp->pap_send_count++;
if (papp->pap_send_count == 0)
papp->pap_send_count = 1;
*(u_short *)&puserdata[2] = papp->pap_send_count;
retry.interval = 2;
retry.retries = 5;
for (i = 0; i < 8; i++) {
if (len > AT_PAP_DATA_SIZE) {
resp.resp[i].iov_base = data;
resp.resp[i].iov_len = AT_PAP_DATA_SIZE;
len -= AT_PAP_DATA_SIZE;
data += AT_PAP_DATA_SIZE;
} else {
resp.resp[i].iov_base = data;
resp.resp[i].iov_len = len;
break;
}
}
resp.bitmap = (1 << (i + 1)) - 1;
if (atp_sendreq(fd, &dest, 0, 0, userdata, 1, 0, 0, &resp, &retry, 0) < 0)
return -1;
for (len=0, i=0; i < ATP_TRESP_MAX; i++) {
if (resp.bitmap & (1 << i))
len += resp.resp[i].iov_len;
}
return len;
}