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); }
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; }