./ MultiCS.r82 / pipe.c
#include "pipe.h"
int frcc_pipe[2]; // newcamd server recv pipe
int dcwpipe[2];
// to check for EINTR
int pipe_read( int fd, uint8_t *buf, int len )
{
int readlen;
while (1) {
readlen = read( fd, buf, len);
if (readlen==-1) {
if ( (errno==EINTR)||(errno==EWOULDBLOCK)||(errno==EAGAIN) ) {
usleep(1);
continue;
}
else {
flag_debugfile = 1;
debugf(getdbgflag(DBG_ERROR,0,0)," pipe(%d): read failed (errno=%d)\n", fd, errno);
prg.restart = 1;
return -1;
}
}
break;
}
return readlen;
}
// to check for EINTR
int pipe_write( int fd, uint8_t *buf, int len )
{
int writelen;
while (1) {
writelen = write( fd, buf, len);
if (writelen==-1) {
if ( (errno==EINTR)||(errno==EWOULDBLOCK)||(errno==EAGAIN) ) {
usleep(1);
continue;
}
else {
flag_debugfile = 1;
debugf(getdbgflag(DBG_ERROR,0,0)," pipe(%d): write failed (errno=%d)\n", fd, errno);
prg.restart = 1;
return -1;
}
}
break;
}
return writelen;
}
int pipe_purge( int fd )
{
uint8_t rbuf[1024];
while(1) {
fd_set readfds;
FD_ZERO(&readfds);
FD_SET( fd, &readfds);
struct timeval timeout;
timeout.tv_usec = 0;
timeout.tv_sec = 0;
int retval = select(fd+1, &readfds, NULL, NULL,&timeout);
if ( retval>0 ) {
retval = read( fd, rbuf, sizeof(rbuf) );
}
else break;
}
return 0;
}
// offset size desc
// 0 1 0xFF
// 1 1 Data CRC
// 2 2 Data Length
int pipe_recv( int fd, uint8_t *buf )
{
uint8_t rbuf[1024];
int rlen;
rlen = pipe_read( fd, rbuf, 4);
if (rlen!=4) {
debugf(getdbgflag(DBG_ERROR,0,0)," pipe(%d): header recv error (rlen=%d)\n",fd,rlen);
pipe_purge(fd); // wrong data --> purge
return 0;
}
if (rbuf[0]!=0xFF) {
debugf(getdbgflag(DBG_ERROR,0,0)," pipe(%d): recv error, wrong id %02X\n", fd,rbuf[0]);
pipe_purge(fd); // wrong data --> purge
return 0;
}
int len = (rbuf[2]<<8)|rbuf[3];
rlen += pipe_read( fd, rbuf+4, len);
if ( rlen!= len+4 ) {
debugf(getdbgflag(DBG_ERROR,0,0), " pipe(%d): recv error (rlen=%d)\n",fd,rlen);
pipe_purge(fd); // wrong data --> purge
return 0;
}
//Checksum
/* int i;
uint8_t sum =0;
for(i=4; i<rlen; i++) sum ^= rbuf[i];
if (sum!=rbuf[1]) {
debugf(getdbgflag(DBG_ERROR,0,0)," pipe(%d): recv error, wrong checksum\n",fd);
pipe_purge(fd); // wrong data --> purge
return 0;
}*/
memcpy(buf, rbuf+4, len);
//debugf(getdbgflag(DBG_ERROR,0,0)," pipe(%d): recv data\n"); debughex(rbuf, rlen);
return len;
}
int pipe_send( int fd, uint8_t *buf, int len )
{
uint8_t wbuf[1024];
//ID (check for errors)
wbuf[0] = 0xFF;
//Checksum
/* int i;
uint8_t sum =0;
for(i=0; i<len; i++) sum ^= buf[i];
wbuf[1] = sum;*/
//LENGTH
wbuf[2] = (len>>8)&0x0f;
wbuf[3] = len&0xff;
// DATA
int wlen = 4+len;
memcpy(wbuf+4, buf, len);
//debugf(0," pipe(%d): write data\n",fd); debughex(buf, len);
return pipe_write( fd, wbuf, wlen);
}
void pipe_cmd( int pfd, int cmd )
{
uint8_t buf[2];
buf[0] = cmd;
buf[1] = 0;
pipe_send( pfd, buf, 2);
}
void pipe_lock( int pfd )
{
uint8_t buf[2];
buf[0] = PIPE_LOCK;
buf[1] = 0;
pipe_send( pfd, buf, 2);
}
void pipe_wakeup( int pfd )
{
uint8_t buf[2];
buf[0] = PIPE_WAKEUP;
buf[1] = 0;
pipe_send( pfd, buf, 2);
}
void pipe_pointer( int pfd, int cmd, void *ptr )
{
uint8_t buf[16];
buf[0] = cmd;
memcpy( buf+1, &ptr, sizeof(void*) );
//debugf(0," pipe_pointer(%d): %p\n", pfd, ptr); debughex(buf, 1+sizeof(void*));
pipe_send( pfd, buf, 1+sizeof(void*) );
}