aboutsummaryrefslogtreecommitdiff
path: root/miscutils
diff options
context:
space:
mode:
Diffstat (limited to 'miscutils')
-rw-r--r--miscutils/beep.c4
-rw-r--r--miscutils/fbsplash.c74
-rw-r--r--miscutils/microcom.c4
3 files changed, 40 insertions, 42 deletions
diff --git a/miscutils/beep.c b/miscutils/beep.c
index c17cbfdad..b0ee7ea25 100644
--- a/miscutils/beep.c
+++ b/miscutils/beep.c
@@ -79,11 +79,11 @@ int beep_main(int argc, char **argv)
79 } 79 }
80 while (rep) { 80 while (rep) {
81//bb_info_msg("rep[%d] freq=%d, length=%d, delay=%d", rep, freq, length, delay); 81//bb_info_msg("rep[%d] freq=%d, length=%d, delay=%d", rep, freq, length, delay);
82 xioctl(speaker, KIOCSOUND, (void*)(long)tickrate_div_freq); 82 xioctl(speaker, KIOCSOUND, (void*)(uintptr_t)tickrate_div_freq);
83 usleep(1000 * length); 83 usleep(1000 * length);
84 ioctl(speaker, KIOCSOUND, (void*)0); 84 ioctl(speaker, KIOCSOUND, (void*)0);
85 if (--rep) 85 if (--rep)
86 usleep(delay); 86 usleep(1000 * delay);
87 } 87 }
88 } 88 }
89 89
diff --git a/miscutils/fbsplash.c b/miscutils/fbsplash.c
index 4560bb2e9..5974006bb 100644
--- a/miscutils/fbsplash.c
+++ b/miscutils/fbsplash.c
@@ -84,7 +84,7 @@ static void fb_open(const char *strfb_device)
84 // map the device in memory 84 // map the device in memory
85 G.addr = mmap(NULL, 85 G.addr = mmap(NULL,
86 G.scr_var.xres * G.scr_var.yres 86 G.scr_var.xres * G.scr_var.yres
87 * BYTES_PER_PIXEL /*(G.scr_var.bits_per_pixel / 8)*/ , 87 * BYTES_PER_PIXEL /*(G.scr_var.bits_per_pixel / 8)*/,
88 PROT_WRITE, MAP_SHARED, fbfd, 0); 88 PROT_WRITE, MAP_SHARED, fbfd, 0);
89 if (G.addr == MAP_FAILED) 89 if (G.addr == MAP_FAILED)
90 bb_perror_msg_and_die("mmap"); 90 bb_perror_msg_and_die("mmap");
@@ -121,7 +121,7 @@ static void fb_drawrectangle(void)
121 // vertical lines 121 // vertical lines
122 ptr1 = (DATA*)(G.addr + (G.nbar_posy * G.scr_var.xres + G.nbar_posx) * BYTES_PER_PIXEL); 122 ptr1 = (DATA*)(G.addr + (G.nbar_posy * G.scr_var.xres + G.nbar_posx) * BYTES_PER_PIXEL);
123 ptr2 = (DATA*)(G.addr + (G.nbar_posy * G.scr_var.xres + G.nbar_posx + G.nbar_width - 1) * BYTES_PER_PIXEL); 123 ptr2 = (DATA*)(G.addr + (G.nbar_posy * G.scr_var.xres + G.nbar_posx + G.nbar_width - 1) * BYTES_PER_PIXEL);
124 cnt = G.nbar_height - 1 /* HUH?! G.nbar_posy + G.nbar_height - 1 - G.nbar_posy*/; 124 cnt = G.nbar_height - 1;
125 do { 125 do {
126 *ptr1 = thispix; ptr1 += G.scr_var.xres; 126 *ptr1 = thispix; ptr1 += G.scr_var.xres;
127 *ptr2 = thispix; ptr2 += G.scr_var.xres; 127 *ptr2 = thispix; ptr2 += G.scr_var.xres;
@@ -216,70 +216,69 @@ static void fb_drawprogressbar(unsigned percent)
216 */ 216 */
217static void fb_drawimage(void) 217static void fb_drawimage(void)
218{ 218{
219 char *head, *ptr;
220 FILE *theme_file; 219 FILE *theme_file;
220 char *read_ptr;
221 unsigned char *pixline; 221 unsigned char *pixline;
222 unsigned i, j, width, height, line_size; 222 unsigned i, j, width, height, line_size;
223 223
224 if (LONE_DASH(G.image_filename)) 224 if (LONE_DASH(G.image_filename)) {
225 theme_file = stdin; 225 theme_file = stdin;
226 else { 226 } else {
227 int fd = open_zipped(G.image_filename); 227 int fd = open_zipped(G.image_filename);
228 if (fd < 0) 228 if (fd < 0)
229 bb_simple_perror_msg_and_die(G.image_filename); 229 bb_simple_perror_msg_and_die(G.image_filename);
230 theme_file = xfdopen_for_read(fd); 230 theme_file = xfdopen_for_read(fd);
231 } 231 }
232 head = xmalloc(256);
233 232
234 /* parse ppm header 233 /* Parse ppm header:
235 * - A ppm image’s magic number is the two characters "P6". 234 * - Magic: two characters "P6".
236 * - Whitespace (blanks, TABs, CRs, LFs). 235 * - Whitespace (blanks, TABs, CRs, LFs).
237 * - A width, formatted as ASCII characters in decimal. 236 * - A width, formatted as ASCII characters in decimal.
238 * - Whitespace. 237 * - Whitespace.
239 * - A height, again in ASCII decimal. 238 * - A height, ASCII decimal.
240 * - Whitespace. 239 * - Whitespace.
241 * - The maximum color value (Maxval), again in ASCII decimal. Must be 240 * - The maximum color value, ASCII decimal, in 0..65535
242 * less than 65536.
243 * - Newline or other single whitespace character. 241 * - Newline or other single whitespace character.
242 * (we support newline only)
244 * - A raster of Width * Height pixels in triplets of rgb 243 * - A raster of Width * Height pixels in triplets of rgb
245 * in pure binary by 1 (or not implemented 2) bytes. 244 * in pure binary by 1 or 2 bytes. (we support only 1 byte)
246 */ 245 */
246#define concat_buf bb_common_bufsiz1
247 read_ptr = concat_buf;
247 while (1) { 248 while (1) {
248 if (fgets(head, 256, theme_file) == NULL 249 int w, h, max_color_val;
249 /* do not overrun the buffer */ 250 int rem = concat_buf + sizeof(concat_buf) - read_ptr;
250 || strlen(bb_common_bufsiz1) >= sizeof(bb_common_bufsiz1) - 256) 251 if (rem < 2
252 || fgets(read_ptr, rem, theme_file) == NULL
253 ) {
251 bb_error_msg_and_die("bad PPM file '%s'", G.image_filename); 254 bb_error_msg_and_die("bad PPM file '%s'", G.image_filename);
252 255 }
253 ptr = memchr(skip_whitespace(head), '#', 256); 256 read_ptr = strchrnul(read_ptr, '#');
254 if (ptr != NULL) 257 *read_ptr = '\0'; /* ignore #comments */
255 *ptr = 0; /* ignore comments */ 258 if (sscanf(concat_buf, "P6 %u %u %u", &w, &h, &max_color_val) == 3
256 strcat(bb_common_bufsiz1, head); 259 && max_color_val <= 255
257 // width, height, max_color_val 260 ) {
258 if (sscanf(bb_common_bufsiz1, "P6 %u %u %u", &width, &height, &i) == 3 261 width = w; /* w is on stack, width may be in register */
259 && i <= 255) 262 height = h;
260 break; 263 break;
261 /* If we do not find a signature throughout the whole file then 264 }
262 we will diagnose this via EOF on read in the head of the loop. */
263 } 265 }
264 266
265 if (ENABLE_FEATURE_CLEAN_UP)
266 free(head);
267 if (width != G.scr_var.xres || height != G.scr_var.yres)
268 bb_error_msg_and_die("PPM %dx%d does not match screen %dx%d",
269 width, height, G.scr_var.xres, G.scr_var.yres);
270 line_size = width*3; 267 line_size = width*3;
268 pixline = xmalloc(line_size);
269
271 if (width > G.scr_var.xres) 270 if (width > G.scr_var.xres)
272 width = G.scr_var.xres; 271 width = G.scr_var.xres;
273 if (height > G.scr_var.yres) 272 if (height > G.scr_var.yres)
274 height = G.scr_var.yres; 273 height = G.scr_var.yres;
275
276 pixline = xmalloc(line_size);
277 for (j = 0; j < height; j++) { 274 for (j = 0; j < height; j++) {
278 unsigned char *pixel = pixline; 275 unsigned char *pixel;
279 DATA *src = (DATA *)(G.addr + j * G.scr_fix.line_length); 276 DATA *src;
280 277
281 if (fread(pixline, 1, line_size, theme_file) != line_size) 278 if (fread(pixline, 1, line_size, theme_file) != line_size)
282 bb_error_msg_and_die("bad PPM file '%s'", G.image_filename); 279 bb_error_msg_and_die("bad PPM file '%s'", G.image_filename);
280 pixel = pixline;
281 src = (DATA *)(G.addr + j * G.scr_fix.line_length);
283 for (i = 0; i < width; i++) { 282 for (i = 0; i < width; i++) {
284 unsigned thispix; 283 unsigned thispix;
285 thispix = (((unsigned)pixel[0] << 8) & 0xf800) 284 thispix = (((unsigned)pixel[0] << 8) & 0xf800)
@@ -289,8 +288,7 @@ static void fb_drawimage(void)
289 pixel += 3; 288 pixel += 3;
290 } 289 }
291 } 290 }
292 if (ENABLE_FEATURE_CLEAN_UP) 291 free(pixline);
293 free(pixline);
294 fclose(theme_file); 292 fclose(theme_file);
295} 293}
296 294
@@ -301,7 +299,7 @@ static void fb_drawimage(void)
301 */ 299 */
302static void init(const char *cfg_filename) 300static void init(const char *cfg_filename)
303{ 301{
304 static const char const param_names[] ALIGN1 = 302 static const char param_names[] ALIGN1 =
305 "BAR_WIDTH\0" "BAR_HEIGHT\0" 303 "BAR_WIDTH\0" "BAR_HEIGHT\0"
306 "BAR_LEFT\0" "BAR_TOP\0" 304 "BAR_LEFT\0" "BAR_TOP\0"
307 "BAR_R\0" "BAR_G\0" "BAR_B\0" 305 "BAR_R\0" "BAR_G\0" "BAR_B\0"
@@ -312,7 +310,7 @@ static void init(const char *cfg_filename)
312 char *token[2]; 310 char *token[2];
313 parser_t *parser = config_open2(cfg_filename, xfopen_stdin); 311 parser_t *parser = config_open2(cfg_filename, xfopen_stdin);
314 while (config_read(parser, token, 2, 2, "#=", 312 while (config_read(parser, token, 2, 2, "#=",
315 (PARSE_NORMAL | PARSE_MIN_DIE) & ~(PARSE_TRIM | PARSE_COLLAPSE))) { 313 (PARSE_NORMAL | PARSE_MIN_DIE) & ~(PARSE_TRIM | PARSE_COLLAPSE))) {
316 unsigned val = xatoi_u(token[1]); 314 unsigned val = xatoi_u(token[1]);
317 int i = index_in_strings(param_names, token[0]); 315 int i = index_in_strings(param_names, token[0]);
318 if (i < 0) 316 if (i < 0)
diff --git a/miscutils/microcom.c b/miscutils/microcom.c
index 9a7a41d53..0fb51d2e8 100644
--- a/miscutils/microcom.c
+++ b/miscutils/microcom.c
@@ -119,7 +119,7 @@ int microcom_main(int argc UNUSED_PARAM, char **argv)
119 nfd = 2; 119 nfd = 2;
120 // Not safe_poll: we want to exit on signal 120 // Not safe_poll: we want to exit on signal
121 while (!bb_got_signal && poll(pfd, nfd, timeout) > 0) { 121 while (!bb_got_signal && poll(pfd, nfd, timeout) > 0) {
122 if (nfd > 1 && (pfd[1].revents & POLLIN)) { 122 if (nfd > 1 && pfd[1].revents) {
123 char c; 123 char c;
124 // read from stdin -> write to device 124 // read from stdin -> write to device
125 if (safe_read(STDIN_FILENO, &c, 1) < 1) { 125 if (safe_read(STDIN_FILENO, &c, 1) < 1) {
@@ -143,7 +143,7 @@ int microcom_main(int argc UNUSED_PARAM, char **argv)
143 safe_poll(pfd, 1, delay); 143 safe_poll(pfd, 1, delay);
144skip_write: ; 144skip_write: ;
145 } 145 }
146 if (pfd[0].revents & POLLIN) { 146 if (pfd[0].revents) {
147#define iobuf bb_common_bufsiz1 147#define iobuf bb_common_bufsiz1
148 ssize_t len; 148 ssize_t len;
149 // read from device -> write to stdout 149 // read from device -> write to stdout