void parse_logmsg(FILE *f, int printlog, struct phone2ltable *p2ltable, struct gsmtap_inst *gti) { uint64_t pos; struct xglog_hdr *log_hdr; uint8_t *data; uint16_t len_msg; struct msgb *rmsg; static uint8_t *searchmsg = NULL; pos = ftell(f); if(!(log_hdr = read_logmsg(f, p2ltable->unescape))) return; data = log_hdr->msg.data; len_msg = ntohs(log_hdr->len) - sizeof(struct xglog_msg); rmsg = NULL; switch(log_hdr->type) { case 0x01: if(printlog) { data[len_msg] = 0; printf("LOG:>>%s<<\n", data); } break; case 0x04: rmsg = parse_radiomsg(data, len_msg, p2ltable->ltable, &searchmsg); break; case 0x0a: rmsg = parse_rawmsg(data, len_msg, &searchmsg); break; default: break; } if(rmsg) { if(searchmsg) DBG(2, printf("** logging new msg even though still searching for msg\n")); send_rmsg(gti, rmsg); } DBG(7, printf("--header:\n"); hexdump_addr((uint8_t *) log_hdr, sizeof(struct xglog_hdr), pos); printf("--data:\n"); hexdump_addr(data, ntohs(log_hdr->len), pos + sizeof(struct xglog_hdr))); }
int GetPacket(SOCKET sockfd, char *pPacket, int *size, long timeout) { char buf[81920]; int ret, ret1, bufSize = sizeof(buf); int rcvlen = 0; fd_set rset; struct timeval tv; struct timeval tv_cal; tv_cal.tv_sec = 0; while(timeout >= 1000000) { tv_cal.tv_sec ++; timeout -= 1000000; } tv_cal.tv_usec = timeout; while(1) { FD_ZERO(&rset); FD_SET(sockfd, &rset); errno = 0; if(timeout == -1) { ret = select(sockfd+1, &rset, 0, 0, 0); } else { tv = tv_cal; ret = select(sockfd+1, &rset, 0, 0, &tv); } if(ret <0) { if(errno == EINTR) return -8; return -1; } else if(ret == 0) return 0; else { errno = 0; if((ret = recv(sockfd, buf + rcvlen, bufSize - rcvlen, MSG_PEEK)) < 0 ) { if(errno == EINTR) return -8; return -1; } else if(ret == 0){ /*the connection has been gracefully closed, see VC++ recv help*/ return -9; } else { if((ret1 = parse_rawmsg(buf, rcvlen + ret)) < 0 ) return -2; /*bad format*/ else if (ret1 == 0 ) {/* continue; incomplete*/ if (rcvlen + ret >= bufSize) return -3; errno = 0; ret1 = readn (sockfd, buf + rcvlen, ret); if (ret1 < 0) { if(errno == EINTR) return -8; return -1; } rcvlen += ret1; } else { errno = 0; if(readn(sockfd, buf + rcvlen, ret1 - rcvlen) != ret1 - rcvlen ) { if(errno == EINTR) return -8; return -1; } rcvlen += ret1 - rcvlen; if((*size = decode_rawmsg(pPacket, *size, buf, rcvlen)) < 0 ) return -2; break; } } } } return 1; }