From ee1b2197f110bc84f61319bfc28af30915ccb4b1 Mon Sep 17 00:00:00 2001 From: Ali Gholami Rudi Date: Thu, 14 Apr 2011 23:33:29 +0430 Subject: [PATCH] draw: return 1 from fb_init() and pad_init() if error --- draw.c | 21 ++++++++++----------- draw.h | 2 +- fbpad.c | 10 +++++----- pad.c | 10 ++++++++-- pad.h | 2 +- 5 files changed, 25 insertions(+), 20 deletions(-) diff --git a/draw.c b/draw.c index 46c6f85..8c01e95 100644 --- a/draw.c +++ b/draw.c @@ -64,27 +64,21 @@ void fb_cmap(void) ioctl(fd, FBIOPUTCMAP, &cmap); } -static void xerror(char *msg) -{ - perror(msg); - exit(1); -} - unsigned fb_mode(void) { return (bpp << 16) | (vinfo.red.length << 8) | (vinfo.green.length << 4) | (vinfo.blue.length); } -void fb_init(void) +int fb_init(void) { fd = open(FBDEV_PATH, O_RDWR); if (fd == -1) - xerror("can't open " FBDEV_PATH); + goto failed; if (ioctl(fd, FBIOGET_VSCREENINFO, &vinfo) == -1) - xerror("ioctl failed"); + goto failed; if (ioctl(fd, FBIOGET_FSCREENINFO, &finfo) == -1) - xerror("ioctl failed"); + goto failed; fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); bpp = (vinfo.bits_per_pixel + 7) >> 3; nr = 1 << vinfo.red.length; @@ -92,9 +86,14 @@ void fb_init(void) nb = 1 << vinfo.green.length; fb = mmap(NULL, fb_len(), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (fb == MAP_FAILED) - xerror("can't map the framebuffer"); + goto failed; fb_cmap_save(1); fb_cmap(); + return 0; +failed: + perror("fb_init()"); + close(fd); + return 1; } void fb_free(void) diff --git a/draw.h b/draw.h index b54f53c..4cdd476 100644 --- a/draw.h +++ b/draw.h @@ -6,7 +6,7 @@ #define FBM_COLORS(m) ((m) & 0x0fff) /* main functions */ -void fb_init(void); +int fb_init(void); void fb_free(void); unsigned fb_mode(void); void *fb_mem(int r); diff --git a/fbpad.c b/fbpad.c index 66666ab..edcd869 100644 --- a/fbpad.c +++ b/fbpad.c @@ -1,11 +1,9 @@ /* - * fbpad - a small linux framebuffer virtual terminal + * fbpad - a small framebuffer virtual terminal * * Copyright (C) 2009-2011 Ali Gholami Rudi * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License, as published by the - * Free Software Foundation. + * This program is released under GNU GPL version 2. */ #include #include @@ -274,12 +272,14 @@ int main(void) char *show = "\x1b[?25h"; write(STDOUT_FILENO, clear, strlen(clear)); write(STDIN_FILENO, hide, strlen(hide)); - pad_init(); + if (pad_init()) + goto failed; setupsignals(); fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL) | O_NONBLOCK); mainloop(); pad_free(); +failed: write(STDIN_FILENO, show, strlen(show)); return 0; } diff --git a/pad.c b/pad.c index 21137e4..cb8f130 100644 --- a/pad.c +++ b/pad.c @@ -15,12 +15,18 @@ static unsigned int cd[] = { COLOR12, COLOR13, COLOR14, COLOR15}; static int rows, cols; -void pad_init(void) +int pad_init(void) { - fb_init(); + if (fb_init()) + return 1; + if (sizeof(fbval_t) != FBM_BPP(fb_mode())) { + fprintf(stderr, "pad_init: fbval_t doesn't match fb depth\n"); + return 1; + } font_init(); rows = fb_rows() / font_rows(); cols = fb_cols() / font_cols(); + return 0; } void pad_free(void) diff --git a/pad.h b/pad.h index 5fb2619..6d73848 100644 --- a/pad.h +++ b/pad.h @@ -1,6 +1,6 @@ #define MAXCHARS (1 << 15) -void pad_init(void); +int pad_init(void); void pad_free(void); void pad_put(int ch, int r, int c, int fg, int bg); int pad_rows(void); -- 2.11.4.GIT