--- /acme/mail/src/dat.h Wed Jan 20 00:37:34 2010 +++ /acme/mail/src/dat.h Tue Sep 17 23:37:33 2013 @@ -118,7 +118,6 @@ extern void mkreply(Message*, char*, char*, Plumbattr*, char*); extern void delreply(Message*); -extern int write2(int, int, char*, int, int); extern int mesgadd(Message*, char*, Dir*, char*); extern void mesgmenu(Window*, Message*); --- /acme/mail/src/mesg.c Wed Jan 20 00:44:18 2010 +++ /acme/mail/src/mesg.c Tue Sep 17 23:37:33 2013 @@ -571,10 +571,12 @@ } free(t); - all = emalloc(n+2); - memmove(all, raw, n); - memmove(all+n, "\n", 1); - n++; + all = emalloc(k+n+1); + memmove(all, unixheader, k); + memmove(all+k, raw, n); + memmove(all+k+n, "\n", 1); + n += k+1; + free(unixheader); free(raw); ret = 1; s = estrdup(s); @@ -584,12 +586,10 @@ if(ofd < 0){ fprint(2, "Mail: can't open %s: %r\n", s); ret = 0; - }else if(seek(ofd, 0LL, 2) < 0 || write(ofd, unixheader, k) != k || - write2(-1, ofd, all, n, 1) < n){ + }else if(seek(ofd, 0LL, 2)<0 || write(ofd, all, n)!=n){ fprint(2, "Mail: save failed: can't write %s: %r\n", s); ret = 0; } - free(unixheader); free(all); close(ofd); free(s); --- /sys/include/ape/stddef.h Thu Jul 21 22:19:15 2005 +++ /sys/include/ape/stddef.h Tue Sep 17 23:03:23 2013 @@ -8,7 +8,9 @@ #define NULL ((void*)0) #endif #endif +#ifndef offsetof #define offsetof(ty,mem) ((size_t) &(((ty *)0)->mem)) +#endif typedef long ptrdiff_t; #ifndef _SIZE_T --- /sys/src/9/bcm/etherusb.c Tue Jan 29 23:07:29 2013 +++ /sys/src/9/bcm/etherusb.c Wed Sep 18 01:37:40 2013 @@ -414,10 +414,22 @@ edev->ctlr = ctlr; edev->irq = -1; edev->mbps = 100; /* TODO: get this from usbether */ + + /* + * Linkage to the generic ethernet driver. + */ edev->attach = etherusbattach; edev->transmit = etherusbtransmit; + edev->interrupt = nil; edev->ifstat = etherusbifstat; edev->ctl = etherusbctl; + + edev->arg = edev; + /* TODO: promiscuous, multicast (for ipv6), shutdown (for reboot) */ +// edev->promiscuous = etherusbpromiscuous; +// edev->shutdown = etherusbshutdown; +// edev->multicast = etherusbmulticast; + return 0; } --- /sys/src/ape/lib/ap/386/vlop.s Thu Feb 28 19:46:30 2002 +++ /sys/src/ape/lib/ap/386/vlop.s Tue Sep 17 22:28:09 2013 @@ -13,16 +13,24 @@ MOVL BX, 4(CX) RET +/* + * _mul64by32(uint64 *r, uint64 a, uint32 b) + * sets *r = low 64 bits of 96-bit product a*b; returns high 32 bits. + */ TEXT _mul64by32(SB), $0 MOVL r+0(FP), CX MOVL a+4(FP), AX MULL b+12(FP) - MOVL AX, 0(CX) - MOVL DX, BX + MOVL AX, 0(CX) /* *r = low 32 bits of a*b */ + MOVL DX, BX /* BX = high 32 bits of a*b */ + MOVL a+8(FP), AX - MULL b+12(FP) - ADDL AX, BX - MOVL BX, 4(CX) + MULL b+12(FP) /* hi = (a>>32) * b */ + ADDL AX, BX /* BX += low 32 bits of hi */ + ADCL $0, DX /* DX = high 32 bits of hi + carry */ + MOVL BX, 4(CX) /* *r |= (high 32 bits of a*b) << 32 */ + + MOVL DX, AX /* return hi>>32 */ RET TEXT _div64by32(SB), $0 --- /sys/src/ape/lib/ap/386/vlrt.c Thu Feb 28 19:46:30 2002 +++ /sys/src/ape/lib/ap/386/vlrt.c Tue Sep 17 22:28:09 2013 @@ -125,7 +125,7 @@ } ulong _div64by32(Vlong, ulong, ulong*); -void _mul64by32(Vlong*, Vlong, ulong); +int _mul64by32(Vlong*, Vlong, ulong); static void dodiv(Vlong num, Vlong den, Vlong *qp, Vlong *rp) @@ -148,8 +148,8 @@ if(den.hi != 0){ q.hi = 0; n = num.hi/den.hi; - _mul64by32(&x, den, n); - if(x.hi > num.hi || (x.hi == num.hi && x.lo > num.lo)){ + if(_mul64by32(&x, den, n) || x.hi > num.hi || + (x.hi == num.hi && x.lo > num.lo)){ n--; _mul64by32(&x, den, n); } --- /sys/src/cmd/dial/at.c Mon Jul 21 14:19:11 2003 +++ /sys/src/cmd/dial/at.c Tue Sep 17 23:48:59 2013 @@ -13,15 +13,15 @@ int ok; } tab[] = { - { "ok", 1 }, - { "connect", 1 }, - { "no carrier", 0 }, - { "no dialtone", 0 }, - { "error", 0 }, - { "busy", 0 }, - { "no answer", 0 }, - { "delayed", 0 }, - { "blacklisted", 0 }, + { "ok\n", 1 }, + { "connect\n", 1 }, + { "no carrier\n", 0 }, + { "no dialtone\n", 0 }, + { "error\n", 0 }, + { "busy\n", 0 }, + { "no answer\n", 0 }, + { "delayed\n", 0 }, + { "blacklisted\n", 0 }, }; int @@ -98,7 +98,7 @@ if(!quiet) writewithoutcr(consfd, buf, i); for(i = 0; i < nelem(tab); i++) - if(cistrstr(buf, tab[i].resp)){ + if(cistrcmp(buf, tab[i].resp) == 0){ if(tab[i].ok) goto out; else --- /sys/src/cmd/ip/snoopy/ip.c Sat Jun 9 23:49:41 2007 +++ /sys/src/cmd/ip/snoopy/ip.c Tue Sep 17 22:58:23 2013 @@ -191,7 +191,8 @@ static int p_seprint(Msg *m) { - int f, len; + int f, len, hl; + uchar *p; Hdr *h; if(m->pe - m->ps < IPHDR) @@ -210,11 +211,22 @@ m->pe = m->ps + len; /* next header */ - m->ps += (h->vihl &0xf) << 2; + hl = (h->vihl &0xf) << 2; - m->p = seprint(m->p, m->e, "s=%V d=%V id=%4.4ux frag=%4.4ux ttl=%3d pr=%d ln=%d", + m->p = seprint(m->p, m->e, "s=%V d=%V id=%4.4ux frag=%4.4ux ttl=%3d pr=%d ln=%d hl=%d", h->src, h->dst, NetS(h->id), NetS(h->frag), h->ttl, h->proto, - NetS(h->length)); + NetS(h->length), + (h->vihl & 0xf) << 2); + + m->ps += hl; + p = (uchar *)(h + 1); + if(p < m->ps){ + m->p = seprint(m->p, m->e, " opts=("); + while(p < m->ps) + m->p = seprint(m->p, m->e, "%.2ux", *p++); + m->p = seprint(m->p, m->e, ")"); + } + return 0; } --- /sys/src/cmd/ip/snoopy/main.c Tue Oct 2 20:38:46 2007 +++ /sys/src/cmd/ip/snoopy/main.c Tue Sep 17 22:57:01 2013 @@ -149,7 +149,7 @@ snprint(buf, Blen, "%s!-1", file); fd = dial(buf, 0, 0, &cfd); if(fd < 0) - sysfatal("dialing %s", buf); + sysfatal("dialing %s: %r", buf); if(pflag && fprint(cfd, prom, strlen(prom)) < 0) sysfatal("setting %s", prom); } else if((!tiflag) && strstr(file, "ipifc")){ --- /sys/src/cmd/ip/telnet.c Thu Apr 23 00:03:32 2009 +++ /sys/src/cmd/ip/telnet.c Tue Sep 17 23:24:14 2013 @@ -161,7 +161,7 @@ fromkbd(net); if(notkbd) for(;;) - sleep(0); + sleep(1000); // sleep(0) is a cpuhog if (svc) remove(svc); sendnote(netpid, "die"); --- /sys/src/cmd/page/filter.c Tue Nov 25 21:57:36 2003 +++ /sys/src/cmd/page/filter.c Tue Sep 17 23:23:24 2013 @@ -97,7 +97,8 @@ Document* inittroff(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf) { - return initfilt(b, argc, argv, buf, nbuf, "troff", "lp -dstdout", 1); + /* Added -H to eliminate header page [sape] */ + return initfilt(b, argc, argv, buf, nbuf, "troff", "lp -H -dstdout", 1); } Document* --- /sys/src/cmd/plumb/match.c Thu Sep 18 05:16:23 2003 +++ /sys/src/cmd/plumb/match.c Tue Sep 17 23:22:39 2013 @@ -389,7 +389,7 @@ { NARGS = 100, NARGCHAR = 8*1024, - EXECSTACK = 4096+(NARGS+1)*sizeof(char*)+NARGCHAR + EXECSTACK = 8192+(NARGS+1)*sizeof(char*)+NARGCHAR }; /* copy argv to stack and free the incoming strings, so we don't leak argument vectors */ --- /sys/src/cmd/replica/db.c Sun Apr 21 00:02:45 2002 +++ /sys/src/cmd/replica/db.c Tue Sep 17 23:22:07 2013 @@ -58,10 +58,12 @@ entrycmp(Avl *a, Avl *b) { Entry *ea, *eb; + int r; ea = (Entry*)a; eb = (Entry*)b; - return strcmp(ea->name, eb->name); + r = strcmp(ea->name, eb->name); + return r > 0 ? 1 : r < 0 ? -1 : 0; } Db* --- /sys/src/cmd/stats.c Mon Jul 12 19:53:25 2010 +++ /sys/src/cmd/stats.c Tue Sep 17 23:14:33 2013 @@ -15,7 +15,7 @@ { int colindex; Rectangle r; - int *data; + uvlong *data; int ndata; char *label; void (*newvalue)(Machine*, uvlong*, uvlong*, int); @@ -358,10 +358,13 @@ y = (y+2.)/3.; } } - p.y = g->r.max.y - Dy(g->r)*y - Dot; - if(p.y < g->r.min.y) - p.y = g->r.min.y; - if(p.y > g->r.max.y-Dot) + if(y < 0x7fffffff){ /* avoid floating overflow */ + p.y = g->r.max.y - Dy(g->r)*y - Dot; + if(p.y < g->r.min.y) + p.y = g->r.min.y; + if(p.y > g->r.max.y-Dot) + p.y = g->r.max.y-Dot; + }else p.y = g->r.max.y-Dot; return p; } @@ -430,7 +433,7 @@ readnums(Machine *m, int n, uvlong *a, int spanlines) { int i; - char *p, *ep; + char *p, *q, *ep; if(spanlines) ep = m->ebufp; @@ -444,7 +447,8 @@ p++; if(p == ep) break; - a[i] = strtoull(p, &p, 10); + a[i] = strtoull(p, &q, 10); + p = q; } if(ep < m->ebufp) ep++; @@ -1199,9 +1203,9 @@ /* allocate data */ ondata = g->ndata; g->ndata = Dx(machr)+1; /* may be too many if label will be drawn here; so what? */ - g->data = erealloc(g->data, g->ndata*sizeof(ulong)); + g->data = erealloc(g->data, g->ndata*sizeof(g->data[0])); if(g->ndata > ondata) - memset(g->data+ondata, 0, (g->ndata-ondata)*sizeof(ulong)); + memset(g->data+ondata, 0, (g->ndata-ondata)*sizeof(g->data[0])); /* set geometry */ g->r = machr; g->r.min.y = y; --- /sys/src/cmd/tbl/t6.c Sat May 31 20:37:21 2008 +++ /sys/src/cmd/tbl/t6.c Tue Sep 17 23:48:44 2013 @@ -192,7 +192,12 @@ if (boxflg || allflg || dboxflg) Bprint(&tabout, ".nr TW +((%d*\\n(%d)/2)\n", tsep, TMP); Bprint(&tabout, - ".if t .if (\\n(TW+\\n(.o)>7.65i .tm Table at line %d file %s is too wide - \\n(TW units\n", iline - 1, ifile); + ".if t .if (\\n(TW>\\n(.l .tm Table at line %d file %s is too wide - \\n(TW units\n", iline - 1, ifile); +/* + * Used to be: + ".if t .if (\\n(TW+\\n(.o)>7.65i .tm Table at line %d file %s is too wide - \\n(TW units\n", iline - 1, ifile); + * but that gives warnings where none are necessary (or desired) [sape] + */ } --- /sys/src/cmd/tcs/tcs.c Wed Jul 14 22:04:28 2010 +++ /sys/src/cmd/tcs/tcs.c Tue Sep 17 23:14:47 2013 @@ -503,6 +503,10 @@ { "ebcdic", "EBCDIC", Table, (void *)tabebcdic }, /* 6f is recommended bad map */ { "euc-k", "Korean EUC: ASCII+KS C 5601 1987", From|Func, 0, (Fnptr)uksc_in }, { "euc-k", "Korean EUC: ASCII+KS C 5601 1987", Func, 0, (Fnptr)uksc_out }, + { "euc-kr", "Korean EUC: ASCII+KS C 5601 1987", From|Func, 0, (Fnptr)uksc_in }, + { "euc-kr", "Korean EUC: ASCII+KS C 5601 1987", Func, 0, (Fnptr)uksc_out }, + { "ks_c_5601-1987", "Korean EUC: ASCII+KS C 5601 1987", From|Func, 0, (Fnptr)uksc_in }, + { "ks_c_5601-1987", "Korean EUC: ASCII+KS C 5601 1987", Func, 0, (Fnptr)uksc_out }, { "gb2312", "GB2312-80 (Chinese)", From|Func, 0, (Fnptr)gb_in }, { "gb2312", "GB2312-80 (Chinese)", Func, 0, (Fnptr)gb_out }, { "gbk", "GBK (Chinese)", From|Func, 0, (Fnptr)gbk_in }, --- /sys/src/cmd/usb/ether/asix.c Wed Nov 14 01:09:31 2012 +++ /sys/src/cmd/usb/ether/asix.c Wed Sep 18 01:43:34 2013 @@ -425,7 +425,7 @@ { int rxctl; - deprint(2, "%s: aixprompiscuous %d\n", argv0, on); + deprint(2, "%s: asixpromiscuous %d\n", argv0, on); rxctl = getrxctl(e->dev); if(on != 0) rxctl |= Rxctlprom; --- /sys/src/cmd/usb/ether/smsc.c Wed Nov 14 01:15:22 2012 +++ /sys/src/cmd/usb/ether/smsc.c Wed Sep 18 01:50:47 2013 @@ -320,6 +320,43 @@ return n; } +static int +smscpromiscuous(Ether *e, int on) +{ + USED(on, e); +#ifdef TODO /* copied from asix */ + int rxctl; + + deprint(2, "%s: smscpromiscuous %d\n", argv0, on); + rxctl = getrxctl(e->dev); + if(on != 0) + rxctl |= Rxctlprom; + else + rxctl &= ~Rxctlprom; + return wr(e->dev, Cwrxctl, rxctl); +#endif + return -1; +} + +static int +smscmulticast(Ether *e, uchar *addr, int on) +{ + USED(addr, on, e); +#ifdef TODO /* needed for ipv6; copied from asix */ + int rxctl; + + /* BUG: should write multicast filter */ + rxctl = getrxctl(e->dev); + if(e->nmcasts != 0) + rxctl |= Rxctlamall; + else + rxctl &= ~Rxctlamall; + deprint(2, "%s: smscmulticast %d\n", argv0, e->nmcasts); + return wr(e->dev, Cwrxctl, rxctl); +#endif + return -1; +} + static void smscfree(Ether *ether) { @@ -354,6 +391,8 @@ ether->free = smscfree; ether->bread = smscbread; ether->bwrite = smscbwrite; + ether->promiscuous = smscpromiscuous; + ether->multicast = smscmulticast; ether->mbps = 100; /* BUG */ return 0; } --- /sys/src/cmd/usb/serial/serial.c Thu Feb 14 22:49:20 2013 +++ /sys/src/cmd/usb/serial/serial.c Tue Sep 17 23:50:09 2013 @@ -464,7 +464,7 @@ } enum { - Serbufsize = 255, + Serbufsize = 256, }; static long @@ -494,6 +494,7 @@ case Qdata: if(count > ser->maxread) count = ser->maxread; + dsprint(2, "serial: reading from data\n"); do { err[0] = 0; --- /sys/src/libc/386/vlop.s Sat Nov 1 21:35:35 2003 +++ /sys/src/libc/386/vlop.s Tue Sep 17 22:27:58 2013 @@ -13,16 +13,24 @@ MOVL BX, 4(CX) RET +/* + * _mul64by32(uint64 *r, uint64 a, uint32 b) + * sets *r = low 64 bits of 96-bit product a*b; returns high 32 bits. + */ TEXT _mul64by32(SB), $0 MOVL r+0(FP), CX MOVL a+4(FP), AX MULL b+12(FP) - MOVL AX, 0(CX) - MOVL DX, BX + MOVL AX, 0(CX) /* *r = low 32 bits of a*b */ + MOVL DX, BX /* BX = high 32 bits of a*b */ + MOVL a+8(FP), AX - MULL b+12(FP) - ADDL AX, BX - MOVL BX, 4(CX) + MULL b+12(FP) /* hi = (a>>32) * b */ + ADDL AX, BX /* BX += low 32 bits of hi */ + ADCL $0, DX /* DX = high 32 bits of hi + carry */ + MOVL BX, 4(CX) /* *r |= (high 32 bits of a*b) << 32 */ + + MOVL DX, AX /* return hi>>32 */ RET TEXT _div64by32(SB), $0 --- /sys/src/libc/386/vlrt.c Sat Nov 1 22:44:13 2003 +++ /sys/src/libc/386/vlrt.c Tue Sep 17 22:27:58 2013 @@ -114,7 +114,7 @@ } ulong _div64by32(Vlong, ulong, ulong*); -void _mul64by32(Vlong*, Vlong, ulong); +int _mul64by32(Vlong*, Vlong, ulong); static void slowdodiv(Vlong num, Vlong den, Vlong *q, Vlong *r) @@ -199,8 +199,8 @@ if(den.hi != 0){ q.hi = 0; n = num.hi/den.hi; - _mul64by32(&x, den, n); - if(x.hi > num.hi || (x.hi == num.hi && x.lo > num.lo)) + if(_mul64by32(&x, den, n) || x.hi > num.hi || + (x.hi == num.hi && x.lo > num.lo)) slowdodiv(num, den, &q, &r); else { q.lo = n; --- /sys/src/libc/port/cleanname.c Sun Feb 20 23:17:41 2005 +++ /sys/src/libc/port/cleanname.c Tue Sep 17 22:41:13 2013 @@ -8,56 +8,90 @@ char* cleanname(char *name) { - char *p, *q, *dotdot; - int rooted, erasedprefix; + char *s; /* source of copy */ + char *d; /* destination of copy */ + char *d0; /* start of path afer the root name */ + Rune r; + int rooted; - rooted = name[0] == '/'; - erasedprefix = 0; + if(name[0] == 0) + return strcpy(name, "."); + rooted = 0; + d0 = name; + if(d0[0] == '#'){ + if(d0[1] == 0) + return d0; + d0 += 1 + chartorune(&r, d0+1); /* ignore slash: #/ */ + while(!SEP(*d0)) + d0 += chartorune(&r, d0); + if(d0 == 0) + return name; + d0++; /* keep / after # */ + rooted = 1; + }else if(d0[0] == '/'){ + rooted = 1; + d0++; + } + + s = d0; + if(rooted){ + /* skip extra '/' at root name */ + for(; *s == '/'; s++) + ; + } + /* remove dup slashes */ + for(d = d0; *s != 0; s++){ + *d++ = *s; + if(*s == '/') + while(s[1] == '/') + s++; + } + *d = 0; - /* - * invariants: - * p points at beginning of path element we're considering. - * q points just past the last path element we wrote (no slash). - * dotdot points just past the point where .. cannot backtrack - * any further (no slash). - */ - p = q = dotdot = name+rooted; - while(*p) { - if(p[0] == '/') /* null element */ - p++; - else if(p[0] == '.' && SEP(p[1])) { - if(p == name) - erasedprefix = 1; - p += 1; /* don't count the separator in case it is nul */ - } else if(p[0] == '.' && p[1] == '.' && SEP(p[2])) { - p += 2; - if(q > dotdot) { /* can backtrack */ - while(--q > dotdot && *q != '/') - ; - } else if(!rooted) { /* /.. is / but ./../ is .. */ - if(q != name) - *q++ = '/'; - *q++ = '.'; - *q++ = '.'; - dotdot = q; + d = d0; + s = d0; + while(*s != 0){ + if(s[0] == '.' && SEP(s[1])){ + if(s[1] == 0) + break; + s+= 2; + continue; + } + if(s[0] == '.' && s[1] == '.' && SEP(s[2])){ + if(d == d0){ + if(rooted){ + /* /../x -> /x */ + if(s[2] == 0) + break; + s += 3; + continue; + }else{ + /* ../x -> ../x; and never collect ../ */ + d0 += 3; + } + } + if(d > d0){ + /* a/../x -> x */ + assert(d-2 >= d0 && d[-1] == '/'); + for(d -= 2; d > d0 && d[-1] != '/'; d--) + ; + if(s[2] == 0) + break; + s += 3; + continue; } - if(q == name) - erasedprefix = 1; /* erased entire path via dotdot */ - } else { /* real path element */ - if(q != name+rooted) - *q++ = '/'; - while((*q = *p) != '/' && *q != 0) - p++, q++; } + while(!SEP(*s)) + *d++ = *s++; + if(*s == 0) + break; + + *d++ = *s++; } - if(q == name) /* empty string is really ``.'' */ - *q++ = '.'; - *q = '\0'; - if(erasedprefix && name[0] == '#'){ - /* this was not a #x device path originally - make it not one now */ - memmove(name+2, name, strlen(name)+1); - name[0] = '.'; - name[1] = '/'; - } + *d = 0; + if(d-1 > name && d[-1] == '/') /* thanks to #/ */ + *--d = 0; + if(name[0] == 0) + strcpy(name, "."); return name; } --- /sys/src/libndb/ndbopen.c Mon Mar 12 23:07:31 2007 +++ /sys/src/libndb/ndbopen.c Tue Sep 17 23:52:35 2013 @@ -22,7 +22,7 @@ Ndbs s; Ndbtuple *t, *nt; - if(file == 0) + if(file == nil && (file = getenv("NDBFILE")) == nil) file = deffile; db = doopen(file); if(db == 0) --- /sys/src/libthread/threadimpl.h Mon May 3 14:01:29 2010 +++ /sys/src/libthread/threadimpl.h Tue Sep 17 23:50:34 2013 @@ -180,6 +180,8 @@ void _threadsignal(void); void _threadsysfatal(char*, va_list); void** _workerdata(void); +void _xinc(long*); +long _xdec(long*); extern int _threaddebuglevel; extern char* _threadexitsallstatus;