Code:
/* this will tell start_listening whether clientSocket
exists on PASSTHRU socket */
volatile sig_atomic_t passthruActive = 0;
start_listening(...)
unsigned int passthruClientLen;
int maxfd = (port[REMORA].fd) + 1;
int i, a, k, p;
char input;
int select_value;
char head[4096];
char tempbuf[4096];
int num_bytes;
fd_set watchset;
struct timeval loopdelay;
FILE* comm_file;
...
/* all sockets are open, confirmed via netstat -l and can telnet no problem... */
while (TRUE)
{
strcpy(tempbuf, "");
strcpy(head, "");
.
.
.
loopdelay.tv_sec = 0; //SELECTDELAY;
loopdelay.tv_usec = 0; /* must reset this for each call - select diddles it */
FD_ZERO(&watchset); /* clear all bits in this set */
FD_SET(port[INST].fd, &watchset); /* watch our data instrument */
FD_SET(port[PASSTHRU].fd, &watchset); /* watch the passthru */
if ((select_value = select(maxfd, &watchset, NULL, NULL, &loopdelay)) > 0)
{
if (FD_ISSET(port[PASSTHRU].fd, &watchset))
{
/* we received something from our passthru */
/* this should only happen upon the first connection */
/* first set our flag that passthru has priority until released */
passthruActive = 1;
if (port[PASSTHRU].clientSocket == -1)
{
/* this is our first client connection */
/* Set the size of the in-out parameter */
passthruClientLen = sizeof(port[PASSTHRU].clientAddress);
/* we've received data from the passthru port */
if ((port[PASSTHRU].clientSocket = accept(port[PASSTHRU].fd,
(struct sockaddr *) &port[PASSTHRU].clientAddress,
&passthruClientLen)) < 0)
{
;//logger(logfile, "ERROR -- 9 We could not accept the call from the passthru socket");
} /* end if accept... */
else
{
/* now that we've accepted the connection, listen */
FD_SET(port[PASSTHRU].clientSocket, &watchset);
/* must increase maxfd to listen to new client socket */
if (port[PASSTHRU].clientSocket >= maxfd)
{
maxfd = port[PASSTHRU].clientSocket + 1;
} /* end if */
/* now read from new client socket */
num_bytes = read(port[PASSTHRU].clientSocket, head, port[PASSTHRU].size - (port[PASSTHRU].buf_idx + 1));
if (num_bytes > 0)
{
strncpy(tempbuf, head, num_bytes);
tempbuf[num_bytes] = 0x00; //add NULL
//tempbuf is only so I can printf for debugging, actuallly send head
send_passthru_data_to_modem(head, port[INST].fd);
} /* end if */
else
{
/* we couldn't find any data on client socket?? */
;
} /* end else */
} /* end else we could accept() */
} /* end if clientSocket == -1 */
else
{
/* we've been here before, client is waiting... */
/* now read from new client socket */
num_bytes = read(port[PASSTHRU].clientSocket, head, port[PASSTHRU].size - (port[PASSTHRU].buf_idx + 1));
if (num_bytes > 0)
{
strncpy(tempbuf, head, num_bytes);
tempbuf[num_bytes] = 0x00; //add NULL
//tempbuf is only for debugging via printf....actually send head
/* our client socket was previously established */
send_passthru_data_to_modem(head, port[INST].fd);
} /* end if */
} /* end else */
} /* end if PASSTHRU */
if (FD_ISSET(port[INST].fd, &watchset))
{
/* we're told something is waiting from the data device */
num_bytes = read(port[INST].fd, head, port[INST].size - (port[INST].buf_idx - 1));
/* see if we have any data to read */
if (num_bytes > 0)
{
strncpy(tempbuf, head, num_bytes);
tempbuf[num_bytes] = 0x00; //add NULL
/* test to see if must transfer the data untouched, or we can modify it */
if (passthruActive == 1)
{
/* passthru is active, so just send whatever modem sent us */
/* back out thru passthru */
for (a = 0; a < strlen(tempbuf); a++)
{
printf("[%i]:%i ", a, tempbuf[a]);
}
printf(" TO PASTHRU:\n%s\n", tempbuf);
//tempbuf looks good dangit!! send head, which should be just like tempbuf wo/NULL
send_modem_data_to_passthru(head, port[PASSTHRU].clientSocket);
} /* end if passthruActive */
else if (passthruActive == 0)
{
/* write the data we received to our traffic file */
;
} /* end else if passthruActive == 0 */
else
{
/* passthruActive is neither 0 nor 1, which should never happen!! */
;
} /* end else */
} /* end if num_bytes > 0 */
} /* end if FD_ISSET [INST] */
} /* end if select */
} /* end while loop */
} /* end init_data_device() loop */
else
{
logger(logfile, "ERROR -- 8 We could not initialize our data device");
return (FALSE);
} /* end else if data device returned FALSE */
return (TRUE);
} /* end listening(...) */
int send_passthru_data_to_modem(char *input_buffer, int modem_fd)
{
tcdrain(modem_fd);
/* take everything we got from the passthru socket and give it to modem */
return (write(modem_fd, input_buffer, sizeof(input_buffer)));
} /* end send_passthru_data_to_modem(...) */
int send_modem_data_to_passthru(char *input_buffer, int passthruSocket)
{
tcdrain(psthruSocket);
return (write(passthruSocket, input_buffer, sizeof(input_buffer)));
} /* end send_modem_data_to_passthru(...) */