int select_mesg_cmp(t_client *client, char *mesg) { #ifdef DEBUG printf("*** select_mesg_cmp: [%s] and [%s]\n", client->buf_read, mesg); #endif /* !DEBUG */ return ((strcmp(select_recv(client), mesg) == 0) ? 0 : -1); }
/** * Receive Loop for Diameter messages. * Decodes the message and calls receive_message(). * @param sock - the socket to receive from * @returns when the socket is closed */ void receive_loop(int sock) { char buf[hdr_len],*msg; int buf_len,length,version,cnt,msg_len; AAAMessage *dmsg; while(!*shutdownx){ buf_len=0; while(buf_len<1){ cnt = select_recv(sock,buf+buf_len,1,0); if (cnt<0) goto error; buf_len+=cnt; } version = (unsigned char)buf[0]; if (version!=1) { LOG(L_ERR,"ERROR:receive_loop():[%d] Recv Unknown version [%d]\n",sock,(unsigned char)buf[0]); continue; } while(buf_len<hdr_len){ cnt = select_recv(sock,buf+buf_len,hdr_len-buf_len,0); if (cnt<0) goto error; buf_len+=cnt; } length = get_3bytes(buf+1); if (length>DP_MAX_MSG_LENGTH){ LOG(L_ERR,"ERROR:receive_loop():[%d] Msg too big [%d] bytes\n",sock,length); goto error; } LOG(L_DBG,"DBG:receive_loop():[%d] Recv Version %d Length %d\n",sock,version,length); msg = shm_malloc(length); if (!msg) { LOG_NO_MEM("shm",length); goto error; } memcpy(msg,buf,hdr_len); msg_len=hdr_len; while(msg_len<length){ cnt = select_recv(sock,msg+msg_len,length-msg_len,0); if (cnt<0) { shm_free(msg); goto error; } msg_len+=cnt; } LOG(L_DBG,"DBG:receive_loop():[%d] Recv message complete\n",sock); dmsg = AAATranslateMessage((unsigned char*)msg,(unsigned int)msg_len,1); /*shm_free(msg);*/ if (dmsg) receive_message(dmsg,sock); else{ shm_free(msg); } } error: if (this_peer) { if (this_peer->I_sock == sock) sm_process(this_peer,I_Peer_Disc,0,0,sock); if (this_peer->R_sock == sock) sm_process(this_peer,R_Peer_Disc,0,0,sock); } LOG(L_ERR,"INFO:receive_loop():[%d] Client closed connection or error... BYE\n",sock); }