We have a packet capture function which is as below. The issue now each of the hex value of packet I read and concat into a char *hex2Value using this code below. I would like to know is this the most efficienct method to concat all into one single string ? Secondly now this one long string I want to reach each 2 value into isprint function to print the readable character how best to do this?

   char *hex2Value="";        
    while(*p) {
  //printf("\n\nstr: %s\n", p);
  asprintf(&hexValue,"%s%02x",hex2Value,p);
  //asprintf(&hexValue,"%s%02x",hexValue,p);

  p++;
}








void dummyProcesssPacket(const struct pfring_pkthdr *h, 
             const u_char *p, const u_char *user_bytes) {
  long threadId = (long)user_bytes;
  printf("\nIN Dummy\n");
  numPkts[threadId]++, numBytes[threadId] += h->len+24 /* 8 Preamble + 4 CRC + 12 IFG */;

#ifdef ENABLE_BPF
  if (userspace_bpf && bpf_filter(filter.bf_insns, p, h->caplen, h->len) == 0)
    return; /* rejected */

  numPktsFiltered[threadId]++;
#endif

  if(touch_payload) {
    volatile int __attribute__ ((unused)) i;

    i = p[12] + p[13];
  }

  if(verbose) {
    printf("\nverbose :");
    struct ether_header *ehdr;
    char buf1[32], buf2[32];
    struct ip *ip;
    int s;
    uint usec;
    uint nsec=0;


    int i=0;
    int j=0,line=0,packSize=h->caplen;
    char *hexValue="";
    while(j<packSize/16)
    {
      printf("%06x: ",line++);
        for(i=0;i<16;i++)
        {
          printf("%02x ",p[j*16+i]);
          asprintf(&hexValue,"%s%02x",hexValue,p[j*16+i]);
        }
        printf("   |");
        /*for(i=0;i<16;i++)
        {
           if(isprint(p[j*16+i]))
             printf("%c",p[j*16+i]);
           else
             printf(".");
        }*/
        printf("|\n");
        j++;
    }
    printf("\nTotal hex value is %s",hexValue);




    if(h->ts.tv_sec == 0) {
      memset((void*)&h->extended_hdr.parsed_pkt, 0, sizeof(struct pkt_parsing_info));
      pfring_parse_pkt((u_char*)p, (struct pfring_pkthdr*)h, 5, 1, 1);
    }

    s = (h->ts.tv_sec + thiszone) % 86400;

    if(h->extended_hdr.timestamp_ns) {
      if (pd->dna.dna_dev.mem_info.device_model != intel_igb_82580 /* other than intel_igb_82580 */)
        s = ((h->extended_hdr.timestamp_ns / 1000000000) + thiszone) % 86400;
      /* "else" intel_igb_82580 has 40 bit ts, using gettimeofday seconds:
       * be careful with drifts mixing sys time and hw timestamp */
      usec = (h->extended_hdr.timestamp_ns / 1000) % 1000000;
      nsec = h->extended_hdr.timestamp_ns % 1000;
    } else {
      usec = h->ts.tv_usec;
    }

    printf("%02d:%02d:%02d.%06u%03u ",
       s / 3600, (s % 3600) / 60, s % 60,
       usec, nsec);

    ehdr = (struct ether_header *) p;
    printf("\n\nBefore Extexted :%d",use_extended_pkt_header);
    if(use_extended_pkt_header) {
      printf("\nafter USE EXE");
      printf("%s[if_index=%d]",
        h->extended_hdr.rx_direction ? "[RX]" : "[TX]",
        h->extended_hdr.if_index);

      printf("[%s -> %s] ",
         etheraddr_string(h->extended_hdr.parsed_pkt.smac, buf1),
         etheraddr_string(h->extended_hdr.parsed_pkt.dmac, buf2));    

      if(h->extended_hdr.parsed_pkt.offset.vlan_offset)
    printf("[vlan %u] ", h->extended_hdr.parsed_pkt.vlan_id);

      if (h->extended_hdr.parsed_pkt.eth_type == 0x0800 /* IPv4*/ || h->extended_hdr.parsed_pkt.eth_type == 0x86DD /* IPv6*/) {

        if(h->extended_hdr.parsed_pkt.eth_type == 0x0800 /* IPv4*/ ) {
      printf("[IPv4][%s:%d ", intoa(h->extended_hdr.parsed_pkt.ipv4_src), h->extended_hdr.parsed_pkt.l4_src_port);
      printf("-> %s:%d] ", intoa(h->extended_hdr.parsed_pkt.ipv4_dst), h->extended_hdr.parsed_pkt.l4_dst_port);




                    char sql_lite[1500];
                    int lastID = mysql_insert_id(conn);
                    printf("\n\n\nLAT IS %d",lastID);
                    char *hexValue="";
                    while(p) {
                  printf("\n\nstr: %s\n", p);
                  asprintf(&hexValue,"%s%02x",hexValue,p);
                  p++;
               }
                    //printf("\n\n char size : p size %lu ",sizeof(p));
                    sprintf(sql_lite, "insert into tblPL1 values ('%d','%s','%s')",'2013-05-11 20:20:20',p[0]);
              puts(sql_lite);
              //error = sqlite3_exec(conn, sql_lite, 0, 0, 0);




        } else {
          printf("[IPv6][%s:%d ",    in6toa(h->extended_hdr.parsed_pkt.ipv6_src), h->extended_hdr.parsed_pkt.l4_src_port);
          printf("-> %s:%d] ", in6toa(h->extended_hdr.parsed_pkt.ipv6_dst), h->extended_hdr.parsed_pkt.l4_dst_port);
        }

    printf("[l3_proto=%s]", proto2str(h->extended_hdr.parsed_pkt.l3_proto));

    if(h->extended_hdr.parsed_pkt.tunnel.tunnel_id != NO_TUNNEL_ID) {
      printf("[TEID=0x%08X][tunneled_proto=%s]", 
         h->extended_hdr.parsed_pkt.tunnel.tunnel_id,
         proto2str(h->extended_hdr.parsed_pkt.tunnel.tunneled_proto));

      if(h->extended_hdr.parsed_pkt.eth_type == 0x0800 /* IPv4*/ ) {
        printf("[IPv4][%s:%d ",
           intoa(h->extended_hdr.parsed_pkt.tunnel.tunneled_ip_src.v4),
           h->extended_hdr.parsed_pkt.tunnel.tunneled_l4_src_port);
        printf("-> %s:%d] ", 
           intoa(h->extended_hdr.parsed_pkt.tunnel.tunneled_ip_dst.v4),
           h->extended_hdr.parsed_pkt.tunnel.tunneled_l4_dst_port);
      } else {
        printf("[IPv6][%s:%d ", 
           in6toa(h->extended_hdr.parsed_pkt.tunnel.tunneled_ip_src.v6),
           h->extended_hdr.parsed_pkt.tunnel.tunneled_l4_src_port);
        printf("-> %s:%d] ",
           in6toa(h->extended_hdr.parsed_pkt.tunnel.tunneled_ip_dst.v6),
           h->extended_hdr.parsed_pkt.tunnel.tunneled_l4_dst_port);
      }   
    }

    printf("[hash=%u][tos=%d][tcp_seq_num=%u]",
      h->extended_hdr.pkt_hash,
          h->extended_hdr.parsed_pkt.ipv4_tos, 
      h->extended_hdr.parsed_pkt.tcp.seq_num);

      } else {
    if(h->extended_hdr.parsed_pkt.eth_type == 0x0806 /* ARP */)
      printf("[ARP]");
    else
      printf("[eth_type=0x%04X]", h->extended_hdr.parsed_pkt.eth_type);
      }

      printf(" [caplen=%d][len=%d][parsed_header_len=%d][eth_offset=%d][l3_offset=%d][l4_offset=%d][payload_offset=%d]\n",
        h->caplen, h->len, h->extended_hdr.parsed_header_len,
        h->extended_hdr.parsed_pkt.offset.eth_offset,
        h->extended_hdr.parsed_pkt.offset.l3_offset,
        h->extended_hdr.parsed_pkt.offset.l4_offset,
        h->extended_hdr.parsed_pkt.offset.payload_offset);

    } else {
      printf("[%s -> %s][eth_type=0x%04X][caplen=%d][len=%d] (use -m for details)\n",
         etheraddr_string(ehdr->ether_shost, buf1),
         etheraddr_string(ehdr->ether_dhost, buf2), 
         ntohs(ehdr->ether_type),
         h->caplen, h->len);
    }
  }

  if(verbose == 2) {
      int i;

      for(i = 0; i < h->caplen; i++)
        printf("%02X ", p[i]);
      printf("\n");
  }

  if(unlikely(add_drop_rule)) {
    if(h->ts.tv_sec == 0)
      pfring_parse_pkt((u_char*)p, (struct pfring_pkthdr*)h, 4, 0, 1);

    drop_packet_rule(h);
  }
}
  char *hex2Value="";        
    while(*p) {
  //printf("\n\nstr: %s\n", p);
  asprintf(&hexValue,"%s%02x",hex2Value,p);

And just how do you expect the above to work? hex2Values is just a pointer that points to a single byte of read-only memory. I don't know what asprintf() does (it must be a non-standard function) but it certainly can't successfully write anything to tha pointer.

Hi,
What I expect is that to put the whole of the *p array into 1 single string. What is the correct way to achive on this ?

After googling for asprintf() I see that function is a GNU-extension to the C language, meaning that it not supported by any other compiler in the whole wide world. Other than that problem the function does allocate the memory needed, so my previous comment is not valid.

So is my usage os asprintf is correct then ? What about reading back the whole of the string and processing it via ispritf. I need to process every 2 characters?

I don't know if they are correct or not, I never used those functions. You'll just have to test them yourself -- and read about them in online docs -- to see if your program is correct or not.

Thank you where I am going add each of the 2 hex digit and there after I need to retrieve is and parse via the ispritf function. What do you suggest should add a delimiter during asprintf function?

This article has been dead for over six months. Start a new discussion instead.