removed fgets usage, increment offset until a line is read, dwm will drop all lines read in one call, except the first!!! one (previously it preferred the last) - but the current approach is simplier and works better for general purpose in conjunction with the offset handling 0e98090d
Anselm R. Garbe · 2007-11-03 20:43 1 file(s) · +27 −7
dwm.c +27 −7
1145 1145
	readin = running = False;
1146 1146
}
1147 1147
1148 +
1148 1149
void
1149 1150
resize(Client *c, int x, int y, int w, int h, Bool sizehints) {
1150 1151
	XWindowChanges wc;
1280 1281
1281 1282
void
1282 1283
run(void) {
1284 +
	char *p;
1283 1285
	fd_set rd;
1284 -
	int xfd;
1286 +
	int r, xfd;
1287 +
	unsigned int len, offset;
1285 1288
	XEvent ev;
1286 1289
1287 1290
	/* main event loop, also reads status text from stdin */
1288 1291
	XSync(dpy, False);
1289 1292
	xfd = ConnectionNumber(dpy);
1290 1293
	readin = True;
1291 -
	stext[sizeof stext - 1] = '\0'; /* 0-terminator is never touched */
1294 +
	offset = 0;
1295 +
	len = sizeof stext - 1;
1296 +
	stext[len] = '\0'; /* 0-terminator is never touched */
1292 1297
	while(running) {
1293 1298
		FD_ZERO(&rd);
1294 1299
		if(readin)
1300 1305
			eprint("select failed\n");
1301 1306
		}
1302 1307
		if(FD_ISSET(STDIN_FILENO, &rd)) {
1303 -
			if((readin = (stext == fgets(stext, sizeof stext - 1, stdin))))
1304 -
				stext[strlen(stext) - 1] = '\0'; /* remove tailing '\n' */
1305 -
			else if(feof(stdin))
1308 +
			switch((r = read(STDIN_FILENO, stext + offset, len - offset))) {
1309 +
			case -1:
1310 +
				strncpy(stext, strerror(errno), len);
1311 +
				readin = False;
1312 +
				break;
1313 +
			case 0:
1306 1314
				strncpy(stext, "EOF", 4);
1307 -
			else /* error occured */
1308 -
				strncpy(stext, strerror(errno), sizeof stext - 1);
1315 +
				readin = False;
1316 +
				break;
1317 +
			default:
1318 +
				stext[offset + r] = '\0';
1319 +
				for(p = stext; *p && *p != '\n'; p++);
1320 +
				if(*p == '\n') {
1321 +
					*p = '\0';
1322 +
					offset = 0;
1323 +
				}
1324 +
				else if(offset + r < len - 1)
1325 +
					offset += r;
1326 +
				else
1327 +
					offset = 0;
1328 +
			}
1309 1329
			drawbar();
1310 1330
		}
1311 1331
		while(XPending(dpy)) {