void send_tcp(int senderid,int sockfd,int datalen,u_char *data,int flags) { sendto_tcp(senderid,sockfd,datalen,data,flags,NULL,0); return; }
void sendmsg_call_handler(unsigned long long uniqueSockID, int threads, unsigned char *buf, ssize_t len) { int index; int datalen; int flags; int msg_flags; int symbol; int controlFlag = 0; u_char *data; socklen_t addrlen; void *msg_control; int msg_controlLength; struct sockaddr_in *addr; u_char *pt; PRINT_DEBUG(""); pt = buf; flags = *(int *) pt; pt += sizeof(int); symbol = *(int *) pt; pt += sizeof(int); if (symbol) { addrlen = *(u_int *) pt; pt += sizeof(u_int); addr = (struct sockaddr_in *) malloc(addrlen); memcpy(addr, pt, addrlen); pt += addrlen; PRINT_DEBUG("addr=%s/%d", inet_ntoa(addr->sin_addr), addr->sin_port); } msg_flags = *(int *) pt; pt += sizeof(int); controlFlag = *(int *) pt; pt += sizeof(int); if (controlFlag) { msg_controlLength = *(u_int *) pt; pt += sizeof(u_int); msg_control = malloc(msg_controlLength); memcpy(msg_control, pt, msg_controlLength); pt += msg_controlLength; } datalen = *(u_int *) pt; pt += sizeof(u_int); if (datalen <= 0) { PRINT_DEBUG("DATA Field is empty!!"); nack_send(uniqueSockID, sendmsg_call); return; } data = (u_char *) malloc(datalen); PRINT_DEBUG(""); memcpy(data, pt, datalen); pt += datalen; if (pt - buf != len) { PRINT_DEBUG("READING ERROR! CRASH, diff=%d len=%d", pt - buf, len); nack_send(uniqueSockID, sendmsg_call); return; } PRINT_DEBUG(""); index = findjinniSocket(uniqueSockID); PRINT_DEBUG(""); if (index == -1) { PRINT_DEBUG( "CRASH !!! socket descriptor not found into jinni sockets SO pipe descriptor to reply is notfound too "); nack_send(uniqueSockID, sendmsg_call); return; } PRINT_DEBUG(""); /** * In case of connected sockets */ if (jinniSockets[index].connection_status > 0) { if (jinniSockets[index].type == SOCK_DGRAM) send_udp(uniqueSockID, sendmsg_call, datalen, data, flags); else if (jinniSockets[index].type == SOCK_STREAM) send_tcp(uniqueSockID, sendmsg_call, datalen, data, flags); else if ((jinniSockets[index].type == SOCK_RAW) && (jinniSockets[index].protocol == IPPROTO_ICMP)) { } else { PRINT_DEBUG("unknown socket type has been read !!!"); nack_send(uniqueSockID, sendmsg_call); } } else { /** * In case of NON-connected sockets, WE USE THE ADDRESS GIVEN BY the APPlication * Process. Check if an address has been passed or not is required */ if (symbol) { // check that the passed address is not NULL if (jinniSockets[index].type == SOCK_DGRAM) sendto_udp(uniqueSockID, sendmsg_call, datalen, data, flags, addr, addrlen); else if (jinniSockets[index].type == SOCK_STREAM) sendto_tcp(uniqueSockID, sendmsg_call, datalen, data, flags, addr, addrlen); else if ((jinniSockets[index].type == SOCK_RAW) && (jinniSockets[index].protocol == IPPROTO_ICMP)) { sendto_icmp(uniqueSockID, sendmsg_call, datalen, data, flags, addr, addrlen); } else { PRINT_DEBUG("unknown target address !!!"); nack_send(uniqueSockID, sendmsg_call); } } else { PRINT_DEBUG("unknown target address !!!"); nack_send(uniqueSockID, sendmsg_call); } } PRINT_DEBUG(); return; }
void sendto_call_handler(unsigned long long uniqueSockID, int threads, unsigned char *buf, ssize_t len) { int index; int datalen; int flags; u_char *data; socklen_t addrlen; struct sockaddr_in *addr; u_char *pt; PRINT_DEBUG(""); pt = buf; datalen = *(int *) pt; pt += sizeof(int); PRINT_DEBUG("passed data len = %d", datalen); if (datalen <= 0) { PRINT_DEBUG("DATA Field is empty!!"); nack_send(uniqueSockID, sendto_call); return; } data = (u_char *) malloc(datalen); PRINT_DEBUG(""); memcpy(data, pt, datalen); pt += datalen; PRINT_DEBUG(""); flags = *(int *) pt; pt += sizeof(int); PRINT_DEBUG(""); addrlen = *(socklen_t *) pt; pt += sizeof(socklen_t); PRINT_DEBUG(""); addr = (struct sockaddr_in *) malloc(addrlen); memcpy(addr, pt, addrlen); pt += addrlen; PRINT_DEBUG(""); if (pt - buf != len) { PRINT_DEBUG("READING ERROR! CRASH, diff=%d len=%d", pt - buf, len); nack_send(uniqueSockID, sendto_call); return; } index = findjinniSocket(uniqueSockID); if (index == -1) { PRINT_DEBUG( "CRASH !!! socket descriptor not found into jinni sockets SO pipe descriptor to reply is notfound too "); nack_send(uniqueSockID, sendto_call); return; } PRINT_DEBUG(""); /** * * In case a connected socket has been called by mistake using sendto * (IGNORE THE ADDRESSES AND USET THE ADDRESS THE SOCKET IS CONNECTED TO IT) */ if (jinniSockets[index].connection_status > 0) { if (jinniSockets[index].type == SOCK_DGRAM) send_udp(uniqueSockID, sendto_call, datalen, data, flags); else if (jinniSockets[index].type == SOCK_STREAM) send_tcp(uniqueSockID, sendto_call, datalen, data, flags); else if (jinniSockets[index].type == SOCK_RAW) { } else { PRINT_DEBUG("unknown socket type has been read !!!"); nack_send(uniqueSockID, sendto_call); } } else { /** * The default case , the socket is not connected socket */ if (jinniSockets[index].type == SOCK_DGRAM) sendto_udp(uniqueSockID, sendto_call, datalen, data, flags, addr, addrlen); else if (jinniSockets[index].type == SOCK_STREAM) sendto_tcp(uniqueSockID, sendto_call, datalen, data, flags, addr, addrlen); else if (jinniSockets[index].type == SOCK_RAW) { } else { PRINT_DEBUG("unknown socket type has been read !!!"); nack_send(uniqueSockID, sendto_call); } } PRINT_DEBUG(); return; } //end of sendto_call_handler()