static int ev_handler(struct mg_connection *conn, enum mg_event ev) { switch (ev) { case MG_AUTH: return MG_TRUE; case MG_REQUEST: return serve_request(conn); default: return MG_FALSE; } }
int RestfulApi::ev_handler(struct mg_connection *conn, enum mg_event ev) { switch (ev) { case MG_AUTH: return check_auth(conn); case MG_REQUEST: return serve_request(conn); default: return MG_FALSE; } }
void serve() { config_msg_t m; int server_sockfd, server_len, client_len = sizeof(struct sockaddr_un), status, on = 1; struct sockaddr_un server_address, client_address; unlink(CONFIGURATION_SOCKET_PATH); server_sockfd = socket(AF_LOCAL, SOCK_DGRAM, 0); if (server_sockfd == -1) { log(E, "Unnale to create socket. Error: %s\n", strerror(errno)); return; } memset(&server_address, 0, sizeof(server_address)); memset(&client_address, 0, sizeof(client_address)); server_address.sun_family = AF_LOCAL; strcpy(server_address.sun_path, CONFIGURATION_SOCKET_PATH); server_len = sizeof(server_address); bind(server_sockfd, (struct sockaddr*) &server_address, server_len); status = setsockopt(server_sockfd, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)); if (status == -1) { log(E, "Setsockopt failed. Error: %s\n", strerror(errno)); return; } while (true) { memset(&m, 0, sizeof(config_msg_t)); status = recvfrom(server_sockfd, &m, sizeof(config_msg_t), 0, (struct sockaddr*) &client_address, &client_len); if (status < 0) { log(E, "Read returned and error. Error: %s\n", strerror(errno)); continue; } serve_request(m, server_sockfd, client_address, client_len); } }
int main() { int client_sock, clilen, i; struct sockaddr_in client; maxfd = getdtablesize(); clilen = sizeof(struct sockaddr_in); init_server(); init_db_connection(); if ((requestP = (request *)malloc(sizeof(request) * maxfd)) == NULL) ERR_EXIT("out of memory allocating all requests"); for (i = 0; i < maxfd; i++) init_request(&requestP[i]); int nfds; fd_set read_set, write_set; struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 100; //accept connection from an incoming client while (1) { FD_ZERO(&read_set); FD_ZERO(&write_set); FD_SET(svrfd, &read_set); for (i = 0; i < maxfd; i++) if (requestP[i].connected == 1) FD_SET(requestP[i].conn_fd, &read_set); nfds = select(maxfd, &read_set, NULL, NULL, &tv); if (nfds > 0) { if (FD_ISSET(svrfd, &read_set)) { if ((client_sock = accept(svrfd, (struct sockaddr *)&client, (socklen_t*)&clilen)) < 0) { perror("accept failed"); continue; } puts("Connection accepted"); requestP[client_sock].conn_fd = client_sock; requestP[client_sock].connected = 1; fprintf(stderr, "getting a new request... fd %d \n", client_sock); nfds--; } for (i = 4; i < maxfd && nfds > 0; i++) { if (FD_ISSET(i, &read_set)) { int len, recvIsDone = 0; requestP[i].buf_len = 0; while (!recvIsDone) { if ((len = recv(i, requestP[i].buf , 1, 0)) > 0) { if(requestP[i].buf[0] == ',') { requestP[i].type[requestP[i].buf_len++] = '\0'; printf("%s\n", requestP[i].type); serve_request(&requestP[i]); recvIsDone = 1; } else requestP[i].type[requestP[i].buf_len++] = requestP[i].buf[0]; } else if (len == 0) { recvIsDone = 1; puts("Client disconnected"); fflush(stdout); free_request(&requestP[i]); } else if (len == -1) { recvIsDone = 1; perror("recv0 failed"); } } nfds--; } } } } free(requestP); mysql_free_result(res); return 0; }