コード例 #1
0
ファイル: echoclient-gconn.c プロジェクト: GNOME/gnet
/* Read line from stdin asynchronously */
static gboolean
ob_in_iofunc (GIOChannel* iochannel, GIOCondition condition, 
	      gpointer data)
{
  GConn* conn = (GConn*) data;

  /* Check for socket error */
  if (condition & G_IO_ERR)
    {
      fprintf (stderr, "Error: Socket error\n");
      goto error;
    }

  /* Check for data to be read (or if the stdin was closed (?)) */
  if (condition & G_IO_IN)
    {
      GIOError error;
      gchar buffer[1024];
      gsize bytes_read;

      /* Read the data into our buffer */
      error = gnet_io_channel_readline (iochannel, buffer, 
					sizeof(buffer), &bytes_read);

      /* Check for stdin error */
      if (error != G_IO_ERROR_NONE)
	{
	  fprintf (stderr, "Read error (%d)\n", error);
	  goto error;
	}

      /* Check for EOF */
      else if (bytes_read == 0)
	{
	  if (lines_pending == 0)
	    exit (EXIT_SUCCESS);
	  else
	    read_eof = TRUE;
	  return FALSE;
	}

      /* Otherwise, we read something */
      else
	{
	  gnet_conn_write (conn, buffer, bytes_read);
	  lines_pending++;
	}
    }

  return TRUE;

 error:
  exit (EXIT_FAILURE);
  return FALSE;
}
コード例 #2
0
ファイル: server.c プロジェクト: far-rel/voyager1
void
handle_client(GTcpSocket *client) {
  RequestHeader *request_header;
  GIOChannel *ioclient;
  GInetAddr *addr;
  GIOError error;
  GPtrArray *request_query;

  gchar* name;
  gint port;

  gchar read_buffer[1024];
  gchar write_buffer[1024];

  gsize read_buffer_n;
  gsize write_buffer_n;

  
  ioclient = gnet_tcp_socket_get_io_channel(client);
  g_assert (ioclient);

  addr = gnet_tcp_socket_get_remote_inetaddr(client);
  g_assert (addr);
  name = gnet_inetaddr_get_canonical_name (addr);
  g_assert (name);
  port = gnet_inetaddr_get_port (addr);
  g_print ("Accepted connection from %s:%d\n", name, port);
  g_free(name);
  
  request_query = g_ptr_array_new();

  while ((error = gnet_io_channel_readline(ioclient, 
                                            read_buffer, 
                                            sizeof(read_buffer), 
                                            &read_buffer_n)) == G_IO_ERROR_NONE && (read_buffer_n > 0))
  {
    if(g_strcmp0(read_buffer, BLANK_LINE) == 0) {
      break;
    }else {
      g_ptr_array_add(request_query, g_strdup(read_buffer));
    }
  }

  request_header = voy_request_header_initialize();
  voy_request_header_create(request_query, request_header);
  voy_request_header_print(request_header);
   
  g_stpcpy(write_buffer, "HTTP/1.0 200 OK\r\nContent-type: text/html; charset=utf-8\r\n\r\n<h1>Hello from server!</h1>");
  write_buffer_n = strlen(write_buffer);
  gnet_io_channel_writen(ioclient, write_buffer, write_buffer_n, &write_buffer_n);
  g_ptr_array_free(request_query, TRUE);
  gnet_inetaddr_delete (addr);
  voy_request_header_free(request_header);
}
コード例 #3
0
ファイル: echoserver-unix.c プロジェクト: GNOME/gnet
static void
normal_echoserver(gchar *path, gboolean abstract)
{
  GUnixSocket *client = NULL;
  gchar buffer[1024];
  gsize n;
  GIOChannel *ioclient = NULL;
  GIOError e;

  g_assert(path != NULL);
  /* Create the server */
  if (abstract)
    server = gnet_unix_socket_server_new_abstract(path);
  else
    server = gnet_unix_socket_server_new(path);
  g_assert(server != NULL);

  while ((client = gnet_unix_socket_server_accept(server)) != NULL) {
    ioclient = gnet_unix_socket_get_io_channel(client);
    g_assert(ioclient != NULL);

    while ((e = gnet_io_channel_readline(ioclient, buffer,
					 sizeof(buffer), &n))
	   == G_IO_ERROR_NONE && (n > 0)) {
      e = gnet_io_channel_writen(ioclient, buffer, n, &n);
      if (e != G_IO_ERROR_NONE)
	break;
      if (fwrite(buffer, n, 1, stdout) != 1) {
       fprintf (stderr, "Error: fwrite to stdout failed: %s\n", g_strerror (errno));
      }
    }
    if (e != G_IO_ERROR_NONE)
      fprintf(stderr,
	      "\nRecieved error %d (closing socket).\n",
	      e);
    gnet_unix_socket_delete (client);
  }
}
コード例 #4
0
ファイル: xmlrpc-client.c プロジェクト: GNOME/gnet
int gnet_xmlrpc_client_call(GNetXmlRpcClient *_client,
                            const gchar *method,
                            const gchar *param,
                            // output
                            gchar **reply)
{
  GNetXmlRpcClientPrivate *client = (GNetXmlRpcClientPrivate*)_client;
  gchar *xmlrpc_message = build_xmlrpc_message(method, param);
  gchar *msg_start, *msg_end;
  gchar *p;
  GString *xmlrpc_string = g_string_new("");
  GString *reply_string = g_string_new("");
  gsize n;
  gchar buffer[1024];
  gint error;
  
  n = strlen(xmlrpc_message);
  //  printf("Writing...\n"); fflush(stdout);
  error = gnet_io_channel_writen (client->client.gnet_channel,
                                  xmlrpc_message, n, &n);
  // printf("error = %d\n", error); fflush(stdout);
  if (error != G_IO_ERROR_NONE)
      return -1;

  // fprintf(stderr, "entering while loop\n");
  while (gnet_io_channel_readline (client->client.gnet_channel, buffer, sizeof(buffer), &n) == G_IO_ERROR_NONE)
    {
      if (client->in_header)
        {
          // Check for a valid response
          if (client->header_lineno == 0)
            {
              // If we don't have HTTP we've got a problem
              if (g_strstr_len(buffer, 5, "HTTP") == NULL)
                {
                  return -1;
                }
            }
          else if (n==1)
            {
              client->in_header = FALSE;
            }
          else
            {
              // Look for the content-length string case independant.
              char *p;
              
              // Lower case buf
              p = buffer;
              while(*p)
                {
                  *p = g_ascii_tolower(*p);
                  p++;
                }
              
              // Search for string
              if ((p = g_strstr_len(buffer, n-1,
                                    "content-length:")) != NULL)
                {
                  p += strlen("Content-length:");
                  client->message_size = atoi(p);
                }
            }
          client->header_lineno++;
        }
      // If we are not in the header then append the line to the xmlrpc string.
      else
        {
          g_string_append_len(xmlrpc_string, buffer, n-1);
          g_string_append_c(xmlrpc_string, '\n');
        }
      
      // Check if we are finished
      if (xmlrpc_string->len
          && xmlrpc_string->len >= client->message_size)
        {
          // Quit and reset parsing for next message
          client->in_header = 1;
          client->header_lineno = 0;
          break;
        }
    }

  // Extract the response. Should be exchanged to some more robust
  // XML parsing.
  msg_start = g_strstr_len(xmlrpc_string->str,
                           xmlrpc_string->len,
                           "<value><string>");
  if (msg_start == NULL)
    return -1;
  
  msg_start += strlen("<value><string>");
  msg_end = g_strrstr(msg_start, "</string></value>");

  // Decode the response
  p = msg_start;
  while(*p != '<')
    {
      gchar c = *p++;

      if (c == '&')
        {
          if (g_strstr_len(p, 4, "amp;") == p)
            {
              g_string_append_c(reply_string, '&');
              p+= 4;
            }
          else if (g_strstr_len(p, 3, "lt;") == p)
            {
              g_string_append_c(reply_string, '<');
              p+= 3;
            }
          else if (g_strstr_len(p, 3, "gt;") == p)
            {
              g_string_append_c(reply_string, '>');
              p+= 3;
            }
          else
            {
              // Don't know what to do. Just add the ampersand..
              g_string_append_c(reply_string, '&');
            }
        }
      else
        g_string_append_c(reply_string, c);
    }
  *reply = reply_string->str;
  g_string_free(reply_string, FALSE);
  g_string_free(xmlrpc_string, TRUE);

  return 0;
}