void send_to_mud(const char *messg, ...) { va_list args; if (messg == NULL) return; va_start(args, messg); write_to_channel(1, messg, args); va_end(args); }
/* Send and Recive Packets over USB(HOST) */ portCHAR putDataToUSBChannel(struct device_data* dev, unsigned portCHAR* buffer, unsigned portCHAR blen ) { portCHAR ret = STATUS_OK; OBD2HW_Header *ph = (OBD2HW_Header *)sbi_dev[ dev->index ].putDataToUSBChannel_buffer; OBD2HW_Header *ph_sen = (OBD2HW_Header *)buffer; unsigned portCHAR tmp_buffer[ 150]; unsigned int i, j; unsigned portCHAR send_len = sizeof(OBD2HW_Header)+ph_sen->length ; unsigned long tmp_enc=0, tmp_dec=0; if( USBCHANNEL_BUFFER_SIZE-sbi_dev[ dev->index ].putDataToUSBChannel_buffer_len>send_len) { memcpy(sbi_dev[ dev->index ].putDataToUSBChannel_buffer+sbi_dev[ dev->index ].putDataToUSBChannel_buffer_len, buffer, send_len>blen?blen:send_len); sbi_dev[ dev->index ].putDataToUSBChannel_buffer_len += send_len; if(sbi_dev[ dev->index ].putDataToUSBChannel_buffer_len>= (portLONG)(sizeof(OBD2HW_Header)+ph->length) ) { // can full send tmp_buffer[0] = sbi_dev[ dev->index ].putDataToUSBChannel_buffer[0]; // is 0 j=1; for(i=1; i<sizeof(OBD2HW_Header)+ph->length; i++) { // encoding for usb-channel if( sbi_dev[ dev->index ].putDataToUSBChannel_buffer[i]==0x00 || (sbi_dev[ dev->index ].putDataToUSBChannel_buffer[i]>0x00 && sbi_dev[ dev->index ].putDataToUSBChannel_buffer[i]<ENCODING_PARAMETER) ) { tmp_enc++; tmp_buffer[j] = 0x01; j++; tmp_buffer[j] = sbi_dev[ dev->index ].putDataToUSBChannel_buffer[i]+ENCODING_PARAMETER; } else { tmp_buffer[j] = sbi_dev[ dev->index ].putDataToUSBChannel_buffer[i]; } j++; tmp_enc++; tmp_dec++; } tmp_buffer[j] = 0; j++; if(write_to_channel( (char*)tmp_buffer, j, dev )>0) { dev->stat_data.usb_send_packets++; dev->stat_data.usb_send_enc_bytes+=tmp_enc; dev->stat_data.usb_send_dec_bytes+=tmp_dec; } sbi_dev[ dev->index ].putDataToUSBChannel_buffer_len -= sizeof(OBD2HW_Header)+ph->length; if(sbi_dev[ dev->index ].putDataToUSBChannel_lastpacket<0) sbi_dev[ dev->index ].putDataToUSBChannel_lastpacket = 0; memmove( sbi_dev[ dev->index ].putDataToUSBChannel_buffer, sbi_dev[ dev->index ].putDataToUSBChannel_buffer+sizeof(OBD2HW_Header)+ph->length, sbi_dev[ dev->index ].putDataToUSBChannel_buffer_len ); } } else { dev->stat_data.usb_fail_send_packets; ret=STATUS_ERROR_NO_DATA; } return ret; }
int main(int argc, char const *argv[]) { int channel[2]; pid_t working_process; // first create process to write to pipe // main process will be read from it. if(pipe(channel)){ printf("Pipe creation is failed : %s\n",strerror(errno)); return 0; } working_process = fork(); if(working_process == 0) { // write pipe with child process close(channel[0]); // close read status struct message msg; msg.data = 5; printf("Data write to channel : %d\n",msg.data); write_to_channel(channel[1],&msg); return 0; }else { // read data from pipe with main (parent) process struct message recv; recv.data = 0 ; // just resetting close(channel[1]); read_from_channel(channel[0],&recv); printf("Data recv from channel : %d\n",recv.data); } // then will wait for child process works done! while(working_process = waitpid(-1,NULL,0)){ if(errno == ECHILD) break; } return 0; }