예제 #1
0
void journald_foreach_data(Journald *self, FOREACH_DATA_CALLBACK func, gpointer user_data)
{
  const void *data;
  size_t l = 0;
  JOURNALD_FOREACH_DATA(self, data, l)
  {
    gchar *key;
    gchar *value;
    __parse_data((gchar *)data, l, &key, &value);
    func(key, value, user_data);
    g_free(key);
    g_free(value);
  }
예제 #2
0
파일: sgrpc.c 프로젝트: dulton/grpc
static void *__sgrpc_web_process(void *param)
{
	unsigned int port = SGRPC_PORT;
	int ret;
	int sl;//sock listen
	int sc;//sock client
	struct sockaddr_in addrl, addrc;
	int addrlen;

	pthreadinfo_add(__func__);
	sl = socket(AF_INET, SOCK_STREAM, 0);
	if (sl == -1)
	{
		Debug(0, "create socket failed: %s\n", strerror(errno));
		return NULL;
	}

    int sock_opt = 1;
   /* reuse socket addr */
    if ((setsockopt(sl, SOL_SOCKET, SO_REUSEADDR, (void *) &sock_opt,
                    sizeof (sock_opt))) == -1) {
    	Debug(0, "setsockopt\n");
    }


	addrl.sin_family = AF_INET;
	addrl.sin_port = htons(port);
	addrl.sin_addr.s_addr = INADDR_ANY;
	if (0 != bind(sl, (const struct sockaddr *)&addrl, sizeof(struct sockaddr)))
	{
		Debug(0, "bind error: %s\n", strerror(errno));
		return NULL;
	}
	if (0 != listen(sl, 10))
	{
		Debug(0, "listen error: %s\n", strerror(errno));
		return NULL;
	}

	while(sGrpcInfo.bRunning)
	{
		fd_set rfds;
		struct timeval tv;

		FD_ZERO(&rfds);
		FD_SET(sl, &rfds);

		tv.tv_sec = 1;
		tv.tv_usec = 0;

		ret = select(sl+1, &rfds, NULL, NULL, &tv);
		/* Don't rely on the value of tv now! */

		if (ret == -1)
		   perror("select()");
		else if (ret == 0)
		{
//			printf("No data within five seconds.\n");
		}
		else
		{
//			printf("Data is available now: ret: %d.\n", ret);
			if (FD_ISSET(sl, &rfds))
			{
				int receved;
				char buffer[50*1024];
				addrlen = sizeof(struct sockaddr);
				memset(&addrc, 0, addrlen);
				sc = accept(sl, (struct sockaddr *)&addrc, (socklen_t*)&addrlen);
				if (sc == -1)
				{
					Printf("ERROR: accept failed: %s\n", strerror(errno));
					return NULL;
				}
				int contentLen = 0;
				int offset = 0;
				while(1)
				{
					ret = recv(sc, &buffer[offset], sizeof(buffer)-offset, 0);
					if (ret == -1)
					{
						Debug(0, "error: recv failed : %s\n", strerror(errno));
						return NULL;
					}
					else if (ret == 0)
					{
						Debug(0, "socket is closed\n");
//						close(sc);
						break;
					}
					offset += ret;
					buffer[offset] = '\0';
//					Debug(3, "received: %d, %s\n", ret, buffer);
					if (contentLen == 0)
					{
						contentLen = __get_content_length(buffer);
					}
//					Debug(3, "received: %d, conteltlen: %d\n", offset, contentLen);
					if (contentLen == 0 || contentLen <= offset)
						break;
//					CPrintf("data not received enough\n");
				}
				if (offset != 0)
				{
					Debug(3, "[RECEIVED]:\n%s\n", buffer);
					ret = __parse_data(buffer);
					if(ret < 0)
					{
						__build_resp(404, NULL, buffer);
						ret = strlen(buffer);
					}

					Debug(3, "[TO-SEND]:\n%s\n", buffer);
					send(sc, buffer, ret, 0);

				}
				close(sc);
			}
		}
	}

	close(sl);

	return NULL;
}