diff c33588da6fc879d6c355cd1df29b4c1a8f75f854 uncommitted --- a//sys/src/cmd/kbremap.c +++ b//sys/src/cmd/kbremap.c @@ -10,6 +10,8 @@ { int i, fd, ofd; char buf[8192]; + int n; + char *p; if((fd = open(file, OREAD)) < 0) sysfatal("cannot open %s: %r", file); @@ -17,9 +19,22 @@ if((ofd = open("/dev/kbmap", OWRITE)) < 0) sysfatal("cannot open /dev/kbmap: %r"); - while((i = read(fd, buf, sizeof buf)) > 0) - if(write(ofd, buf, i) != i) + n = 0; + while((i = read(fd, buf + n, sizeof buf - 1 - n)) > 0){ + buf[i + n] = '\0'; + p = strrchr(buf, '\n'); + if(p == nil){ + n = i + n; + if(n == sizeof buf - 1) + sysfatal("line too long"); + continue; + } + p++; + if(write(ofd, buf, p - buf) != p - buf) sysfatal("writing /dev/kbmap: %r"); + memmove(buf, p, i - (p - buf)); + n = i - (p - buf); + } fprint(ofd, "%s\t%s\t0x%X\n", mod, key, Kswitch); close(fd); @@ -66,7 +81,7 @@ for(p = buf; p < buf+n; p += strlen(p) + 1){ chartorune(&r, p+1); if(*p != 'c' || r != Kswitch){ - write(1, p, strlen(p)); + write(1, p, strlen(p) + 1); continue; } index++;