Ejemplo n.º 1
0
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)));
}
Ejemplo n.º 2
0
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;
}