diff --git a/pixelnuke/canvas.c b/pixelnuke/canvas.c index 68e0e1e..b6f4ec1 100644 --- a/pixelnuke/canvas.c +++ b/pixelnuke/canvas.c @@ -52,10 +52,18 @@ static int canvas_do_layout = 0; static CanvasLayer* canvas_layer_alloc(int size, int alpha) { CanvasLayer * layer = malloc(sizeof(CanvasLayer)); + if (layer == NULL) { + puts("Failed to malloc"); + exit(1); + } layer->size = size; layer->format = alpha ? GL_RGBA : GL_RGB; layer->mem = size * size * (alpha ? 4 : 3); layer->data = malloc(sizeof(GLubyte) * layer->mem); + if (layer->data == NULL) { + puts("Failed to malloc"); + exit(1); + } memset(layer->data, 0, layer->mem); return layer; } @@ -217,7 +225,7 @@ static void* canvas_render_loop(void * arg) { glfwSetErrorCallback(glfw_error_callback); if (!glfwInit()) { - puts("GLFW initialization failed"); + puts("Filed to initializate GLFW"); if(canvas_on_close_cb) (*canvas_on_close_cb)(); glfwTerminate(); @@ -228,7 +236,7 @@ static void* canvas_render_loop(void * arg) { int err = glewInit(); if (err != GLEW_OK) { - puts("GLEW initialization failed"); + puts("Failed to initialize GLEW"); printf("Error: %s\n", glewGetErrorString(err)); if(canvas_on_close_cb) (*canvas_on_close_cb)(); @@ -264,8 +272,8 @@ static void* canvas_render_loop(void * arg) { GLuint texSize = canvas_base->size; if(canvas_width > texSize || canvas_height > texSize) { - float scale = ((float) max(canvas_width, canvas_height)) / (float) texSize; - glScalef(scale, scale, 1); + float scale = ((float) max(canvas_width, canvas_height)) / (float) texSize; + glScalef(scale, scale, 1); } canvas_draw_layer(canvas_base); @@ -397,7 +405,7 @@ void canvas_get_px(unsigned int x, unsigned int y, uint32_t *rgba) { void canvas_get_size(unsigned int *w, unsigned int *h) { int texSize = canvas_base->size; if(canvas_width > texSize || canvas_height > texSize) { - float scale = ((float) max(canvas_width, canvas_height)) / texSize; + float scale = ((float) max(canvas_width, canvas_height)) / texSize; *w = min(texSize, canvas_width/scale); *h = min(texSize, canvas_height/scale); } else { diff --git a/pixelnuke/net.c b/pixelnuke/net.c index 2367064..261b037 100644 --- a/pixelnuke/net.c +++ b/pixelnuke/net.c @@ -108,6 +108,7 @@ static void netev_on_write(struct bufferevent *bev, void *arg) { (*netcb_on_close)(client, 0); bufferevent_free(bev); + printf("bufferevent_free: closed\n"); free(client); } } @@ -117,8 +118,11 @@ static void netev_on_error(struct bufferevent *bev, short error, void *arg) { // TODO: Some logging? if (error & BEV_EVENT_EOF) { + printf("error EOF\n"); } else if (error & BEV_EVENT_ERROR) { + printf("error ERROR\n"); } else if (error & BEV_EVENT_TIMEOUT) { + printf("error TIMEOUT\n"); } client->state = NET_CSTATE_CLOSING; @@ -126,6 +130,7 @@ static void netev_on_error(struct bufferevent *bev, short error, void *arg) { (*netcb_on_close)(client, error); bufferevent_free(bev); + printf("bufferevent_free: closed\n"); free(client); } @@ -135,22 +140,23 @@ static void on_accept(evutil_socket_t listener, short event, void *arg) { socklen_t slen = sizeof(ss); int fd = accept(listener, (struct sockaddr*) &ss, &slen); if (fd < 0) { - perror("accept failed"); + perror("Failed to accept"); } else if (fd > FD_SETSIZE) { close(fd); // TODO: verify if this is needed. Only for select()? But libevent uses poll/kqueue? + printf("fd closed\n"); } else { NetClient *client = calloc(1, sizeof(NetClient)); if (client == NULL) { - perror("client malloc failed"); + perror("Failed to calloc client"); close(fd); return; } client->sock_fd = fd; + evutil_make_socket_nonblocking(fd); client->buf_ev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE); - evutil_make_socket_nonblocking(fd); bufferevent_setcb(client->buf_ev, netev_on_read, netev_on_write, netev_on_error, client); bufferevent_setwatermark(client->buf_ev, EV_READ, 0, NET_MAX_BUFFER); @@ -172,7 +178,10 @@ void net_start(int port, net_on_connect on_connect, net_on_read on_read, struct event *listener_event; line_buffer = malloc(sizeof(char)*NET_MAX_LINE); + if (!line_buffer) + err(1, "Failed to malloc"); + event_enable_debug_mode(); evthread_use_pthreads(); //setvbuf(stdout, NULL, _IONBF, 0); @@ -189,17 +198,17 @@ void net_start(int port, net_on_connect on_connect, net_on_read on_read, sin.sin_family = AF_INET; sin.sin_addr.s_addr = 0; - sin.sin_port = htons(1337); + sin.sin_port = htons(port); listener = socket(AF_INET, SOCK_STREAM, 0); evutil_make_socket_nonblocking(listener); evutil_make_listen_socket_reuseable(listener); if (bind(listener, (struct sockaddr*) &sin, sizeof(sin)) < 0) { - err(1, "bind failed"); + err(1, "Failed to bind"); } if (listen(listener, 16) < 0) { - err(1, "listen failed"); + err(1, "Failed to listen"); } listener_event = event_new(base, listener, EV_READ | EV_PERSIST, on_accept, @@ -211,10 +220,12 @@ void net_start(int port, net_on_connect on_connect, net_on_read on_read, void net_stop() { event_base_loopbreak(base); - if(line_buffer) { - free(line_buffer); - line_buffer = NULL; - } + // we cannot free the line_buffer here because it may be needed (doc says + // "will abort the loop *after* the next event is completed"). + //if(line_buffer) { + // free(line_buffer); + // line_buffer = NULL; + //} } void net_send(NetClient *client, const char * msg) { diff --git a/pixelnuke/pixelnuke.c b/pixelnuke/pixelnuke.c index d879328..a3358d6 100644 --- a/pixelnuke/pixelnuke.c +++ b/pixelnuke/pixelnuke.c @@ -72,7 +72,7 @@ void px_on_read(NetClient *client, char *line) { uint32_t x = fast_strtoul10(ptr, &endptr); if (endptr == ptr) { net_err(client, - "Invalid command (expected decimal as first parameter)"); + "Invalid command (expected non-negative decimal as first parameter)"); return; } if (*endptr == '\0') { @@ -85,7 +85,7 @@ void px_on_read(NetClient *client, char *line) { uint32_t y = fast_strtoul10((ptr = endptr), &endptr); if (endptr == ptr) { net_err(client, - "Invalid command (expected decimal as second parameter)"); + "Invalid command (expected non-negative decimal as second parameter)"); return; }