Esempio n. 1
0
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;
	}
}
Esempio n. 2
0
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;
 }
}
Esempio n. 3
0
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);
	}
}
Esempio n. 4
0
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;
}