Ejemplo n.º 1
0
void
chunk_info_print_all(const gchar * domain, const gchar * header, GSList * list)
{
	GSList *l;
	gchar str_ci[256];
	(void) domain, (void) header;

	if (!list || !TRACE_ENABLED())
		return;
	for (l = list; l; l = l->next) {
		if (!l->data)
			continue;
		memset(str_ci, 0x00, sizeof(str_ci));
		chunk_info_to_string((chunk_info_t *) (l->data), str_ci, sizeof(str_ci) - 1);
		TRACE_DOMAIN(domain, "%s%s", header, str_ci);
	}
}
Ejemplo n.º 2
0
/* Select on the list of fds.  Returns: -1 = error, 0 = timeout or
   nothing to select, > 0 = number of signaled fds.  */
int
_gpgme_io_select (struct io_select_fd_s *fds, size_t nfds, int nonblock)
{
  int npollfds;
  GPollFD *pollfds;
  int *pollfds_map; 
  int i;
  int j;
  int any;
  int n;
  int count;
  /* Use a 1s timeout.  */
  int timeout = 1000;
  void *dbg_help = NULL;
  TRACE_BEG2 (DEBUG_SYSIO, "_gpgme_io_select", fds,
	      "nfds=%u, nonblock=%u", nfds, nonblock);

  if (nonblock)
    timeout = 0;

  pollfds = calloc (nfds, sizeof *pollfds);
  if (!pollfds)
    return -1;
  pollfds_map = calloc (nfds, sizeof *pollfds_map);
  if (!pollfds_map)
    {
      free (pollfds);
      return -1;
    }
  npollfds = 0;

  TRACE_SEQ (dbg_help, "select on [ ");
  any = 0;
  for (i = 0; i < nfds; i++)
    {
      GIOChannel *chan = NULL;

      if (fds[i].fd == -1) 
	continue;

      if ((fds[i].for_read || fds[i].for_write)
          && !(chan = find_channel (fds[i].fd)))
        {
          TRACE_ADD1 (dbg_help, "[BAD0x%x ", fds[i].fd);
          TRACE_END (dbg_help, "]"); 
          assert (!"see log file");
        }
      else if (fds[i].for_read )
	{
          assert(chan);
          g_io_channel_win32_make_pollfd (chan, G_IO_IN, pollfds + npollfds);
          pollfds_map[npollfds] = i;
	  TRACE_ADD2 (dbg_help, "r0x%x<%d> ", fds[i].fd, pollfds[npollfds].fd);
          npollfds++;
	  any = 1;
        }
      else if (fds[i].for_write)
	{
          assert(chan);
          g_io_channel_win32_make_pollfd (chan, G_IO_OUT, pollfds + npollfds);
          pollfds_map[npollfds] = i;
	  TRACE_ADD2 (dbg_help, "w0x%x<%d> ", fds[i].fd, pollfds[npollfds].fd);
          npollfds++;
	  any = 1;
        }
      fds[i].signaled = 0;
    }
  TRACE_END (dbg_help, "]"); 
  if (!any)
    {
      count = 0;
      goto leave;
    }


  count = g_io_channel_win32_poll (pollfds, npollfds, timeout);
  if (count < 0)
    {
      int saved_errno = errno;
      errno = saved_errno;
      goto leave;
    }

  TRACE_SEQ (dbg_help, "select OK [ ");
  if (TRACE_ENABLED (dbg_help))
    {
      for (i = 0; i < npollfds; i++)
	{
	  if ((pollfds[i].revents & G_IO_IN))
	    TRACE_ADD1 (dbg_help, "r0x%x ", fds[pollfds_map[i]].fd);
          if ((pollfds[i].revents & G_IO_OUT))
            TRACE_ADD1 (dbg_help, "w0x%x ", fds[pollfds_map[i]].fd);
        }
      TRACE_END (dbg_help, "]");
    }
    
  /* COUNT is used to stop the lop as soon as possible.  */
  for (n = count, i = 0; i < npollfds && n; i++)
    {
      j = pollfds_map[i];
      assert (j >= 0 && j < nfds);
      if (fds[j].fd == -1)
	;
      else if (fds[j].for_read)
	{
	  if ((pollfds[i].revents & G_IO_IN))
	    {
	      fds[j].signaled = 1;
	      n--;
            }
        }
      else if (fds[j].for_write)
	{
	  if ((pollfds[i].revents & G_IO_OUT))
	    {
	      fds[j].signaled = 1;
	      n--;
            }
        }
    }

leave:
  free (pollfds);
  free (pollfds_map);
  return TRACE_SYSRES (count);
}
void print_pkt_hdr(char *pkt, size_t len)
{
   char str[128];
   uint16_t l;
   uint8_t t, m;
   size_t c = 0;
   unsigned int is_tx;
   unsigned int hsize;

   const char *const*table;
   size_t table_size;

   if (len < 8) {
      DE_TRACE_INT(TR_DATA, "Short packet (" TR_FSIZE_T " bytes)\n", 
                   TR_ASIZE_T(len));
      return;
   }
   l = HIC_MESSAGE_LENGTH_GET(pkt);
   t = HIC_MESSAGE_TYPE(pkt); 
   m = HIC_MESSAGE_ID(pkt);
   hsize = HIC_MESSAGE_HDR_SIZE(pkt);

   if(t == HIC_MESSAGE_TYPE_DATA && !TRACE_ENABLED(TR_DATA_DUMP))
   {
      return;
   }

   c += DE_SNPRINTF(str + c, sizeof(str) - c, "%d,%x.%x", l, t, m);
   c = DE_MIN(sizeof(str), c);

   if(len >= hsize + 4) {
      unsigned int tid = HIC_GET_ULE32(pkt + hsize);
      c += DE_SNPRINTF(str + c, sizeof(str) - c, "[%x]", tid);
      c = DE_MIN(sizeof(str), c);
   }

   is_tx = !(t & MAC_API_MSG_DIRECTION_BIT);
   t &= ~MAC_API_MSG_DIRECTION_BIT;
   m &= ~MAC_API_PRIMITIVE_TYPE_RSP;
   if (l < 8 || l > PACKET_MAX) {
      DE_TRACE_STRING(TR_DATA, "bad size packet %s\n", str);
      return;
   }
   if (t == HIC_MESSAGE_TYPE_AGGREGATION) {
      DE_TRACE_STRING(TR_DATA, "aggregated packet %s\n", str);
      return;
   }

#define X(N)                                            \
      case HIC_MESSAGE_TYPE_##N:                        \
         if(is_tx) {                                    \
            table = N##_tx_table;                       \
            table_size = DE_ARRAY_SIZE(N##_tx_table);   \
         } else {                                       \
            table = N##_rx_table;                       \
            table_size = DE_ARRAY_SIZE(N##_rx_table);   \
         }                                              \
      break;

   switch(t) {
      X(DATA);
      X(MGMT);
      X(MIB);
      X(ECHO);
      X(CONSOLE);
      X(FLASH_PRG);
      X(CTRL);
      X(DLM);
      default:
         DE_TRACE_STRING(TR_DATA, "unknown message type %s\n", str);
         return;
   }
   if(m >= table_size) {
      c += DE_SNPRINTF(str + c, sizeof(str) - c, ": UNKNOWN%d", m);
      c = DE_MIN(sizeof(str), c);
   } else {
      c += DE_SNPRINTF(str + c, sizeof(str) - c, ": %s", table[m]);
      c = DE_MIN(sizeof(str), c);
   }
   if(t == HIC_MESSAGE_TYPE_DATA 
      && m == (HIC_MAC_DATA_CFM & ~MAC_API_PRIMITIVE_TYPE_RSP)
      && len >= hsize + 8) {
      c += DE_SNPRINTF(str + c, sizeof(str) - c, " s%ur%up%xd%u",
                       HIC_DATA_CFM_STATUS(pkt + hsize),
                       HIC_DATA_CFM_RATE_USED(pkt + hsize),
                       HIC_DATA_CFM_RATE_PRIO(pkt + hsize),
                       HIC_DATA_CFM_DISCARDED_RX(pkt + hsize));
      c = DE_MIN(sizeof(str), c);
   }
   DE_TRACE_STRING(TR_DATA, "pkt: %s\n", str);
}