diff --git a/rc/bin/cpurc b/rc/bin/cpurc index ccd5fb090..6a348b833 100755 --- a/rc/bin/cpurc +++ b/rc/bin/cpurc @@ -65,7 +65,7 @@ if(test -r /net/ipselftab){ # try /lib/ndb first, then do dhcp/slaac ip/ipconfig -6 ether $ether ip/ipconfig -N ether $ether >[2]/dev/null || @{ - ip/ipconfig ether $ether ra6 recvra 1 & + test -e /env/nora6 || ip/ipconfig ether $ether ra6 recvra 1 & ip/ipconfig -h $sysname ether $ether & wait } diff --git a/rc/bin/inst/startether b/rc/bin/inst/startether index 852b2f4c3..69408312b 100755 --- a/rc/bin/inst/startether +++ b/rc/bin/inst/startether @@ -21,7 +21,7 @@ case go ip/ipconfig -g $gwaddr ether $netdev $ipaddr $ipmask >>[2]/srv/log case automatic >>[2]/srv/log @{ - ip/ipconfig ra6 recvra 1 & + test -e /env/nora6 || ip/ipconfig ra6 recvra 1 & ip/ipconfig & wait } diff --git a/rc/bin/termrc b/rc/bin/termrc index 14b473c2c..ca5af3442 100755 --- a/rc/bin/termrc +++ b/rc/bin/termrc @@ -66,7 +66,7 @@ if(test -r /net/ipselftab){ # try /lib/ndb first, then do dhcp/slaac ip/ipconfig -6 ether $ether ip/ipconfig -N ether $ether >[2]/dev/null || @{ - ip/ipconfig ether $ether ra6 recvra 1 & + test -e /env/nora6 || ip/ipconfig ether $ether ra6 recvra 1 & ip/ipconfig -h $sysname ether $ether & wait } diff --git a/sys/include/dtracy.h b/sys/include/dtracy.h index 438a8d1e7..92f458657 100644 --- a/sys/include/dtracy.h +++ b/sys/include/dtracy.h @@ -241,7 +241,7 @@ void dtsync(void); DTProbe *dtpnew(char *, DTProvider *, void *aux); int dtpmatch(char *, DTProbe ***); int dtplist(DTProbe ***); -void dtptrigger(DTProbe *, int, DTTrigInfo *); +void dtptrigger(DTProbe *, DTTrigInfo *); /* expression functions */ int dteverify(DTExpr *); @@ -285,7 +285,7 @@ uvlong dttime(void); /* return current timestamp */ void *dtrealloc(void *, ulong); void dtfree(void *); void *dtmalloc(ulong); -void dtmachlock(int); /* lock the per-cpu lock */ +int dtmachlock(int); /* lock the per-cpu lock */ void dtmachunlock(int); /* unlock the per-cpu lock */ void dtcoherence(void); /* memory barrier */ uvlong dtgetvar(int); /* return the value of a variable */ diff --git a/sys/lib/dist/mkfile b/sys/lib/dist/mkfile index 6fb040377..faae876f8 100644 --- a/sys/lib/dist/mkfile +++ b/sys/lib/dist/mkfile @@ -146,4 +146,5 @@ binds:V: bind mail/lib /n/src9/mail/lib bind ndb /n/src9/lib/ndb bind -a adm/timezone /n/src9/adm/timezone + aux/stub -d /n/src9/usr bind usr /n/src9/usr diff --git a/sys/man/1/walk b/sys/man/1/walk new file mode 100644 index 000000000..74d24b371 --- /dev/null +++ b/sys/man/1/walk @@ -0,0 +1,122 @@ +.TH WALK 1 +.SH NAME +walk \- walk a path +.SH SYNOPSIS +.B walk +[ +.B -dftxu +] [ +.B -n +.I mind,maxd +] [ +.B -e +.I ststr +] [ +.I name ... +] +.SH DESCRIPTION +.I Walk +recursively descends any directory arguments, +printing the name of each file on a separate line. +When no arguments are given, the current directory +is assumed. +Non-directory arguments are checked for existence, +then printed, if so. +.PP +Options are: +.TP +.B -d +Print only directories. +.TP +.B -f +Print only non-directories. +.TP +.B -t +Print a file only if it has the temporary flag set. +.TP +.B -x +Print a file only if it has any executable bits set. +.TP +.B -u +Unbuffered output. +.TP +.B -n min,max +Set the inclusive range of depths for filtering in results. +Both +.I min +and +.I max +are optional. +.TP +.B -e statfmt +Setting the statfmt string allows specifying the data +.B walk +should print. +It takes a string of characters, each corresponding +to some piece of information about the file being +traversed, and prints them separated by spaces. +.PP +The statfmt characters are as follows: +.TF . +.TP +.B U +owner name (uid) +.TP +.B G +group name (gid) +.TP +.B M +name of last user to modify (muid) +.TP +.B a +last access time (atime) +.TP +.B m +last modification time (mtime) +.TP +.B n +final path element (name) +.TP +.B p +path +.TP +.B q +qid path.version.type (see +.IR stat (2)) +.TP +.B s +size in bytes +.TP +.B x +permissions +.PD +.PP +The default statfmt is simply, +.IR p . +.SH EXAMPLES +List files in a directory, sorted by modification time. +.IP +.EX +walk -femp catpics | sort -n | sed 's/^[^ ]+ //' +.EE +.PP +Print the size and path of files (excluding dirs) +in the working directory. +.IP +.EX +walk -fn1 -esp +.EE +.PD +.SH SOURCE +.B /sys/src/cmd/walk.c +.SH SEE ALSO +.IR ls (1), +.IR du (1) +.SH BUGS +Statfmt character `x' displays permissions as an integer. +.PP +Manipulating ifs is a nuisance. +.PP +File names are assumed to not contain newlines. +.PP +Correct invocation requires too much thought. diff --git a/sys/man/8/plan9.ini b/sys/man/8/plan9.ini index 9e1565a2f..96ff418fd 100644 --- a/sys/man/8/plan9.ini +++ b/sys/man/8/plan9.ini @@ -443,6 +443,8 @@ to be present on attach in or .B /boot. See iwl section above for configuration details. +.SS \fLnora6= +Disable automatic IPv6 configuration from incoming router advertisements. .SS DISKS, TAPES (S)ATA controllers are autodetected. .SS \fL*nodma=\fP @@ -865,6 +867,18 @@ The main feature of the interface is the ability to watch battery life (see .IR stats (8)). It is not on by default because it causes problems on some laptops. +.SS USB +.SS \fL*nousbprobe=\fP +Disable USB host controller detection. +.SS \fL*nousbohci=\fP +.SS \fL*nousbuhci=\fP +.SS \fL*nousbehci=\fP +.SS \fL*nousbxhci=\fP +Disable specific USB host controller types. +.SS \fLnousbrc=\fP +Disable +.IR nusbrc (8) +startup at boot time. .SS \fLnousbhname=\fP When defined, .IR nusbrc (8) diff --git a/sys/src/9/boot/net.rc b/sys/src/9/boot/net.rc index 79c0b81fa..1a194dd84 100755 --- a/sys/src/9/boot/net.rc +++ b/sys/src/9/boot/net.rc @@ -15,9 +15,9 @@ fn confignet{ } } - if(~ $1 ether && ~ $#* 2) @{ + if(~ $1 ether gbe && ~ $#* 2) @{ ip/ipconfig -6 $* - ip/ipconfig $* ra6 recvra 1 & + test -e /env/nora6 || ip/ipconfig $* ra6 recvra 1 & ip/ipconfig -p $* & wait } diff --git a/sys/src/9/port/devdtracy.c b/sys/src/9/port/devdtracy.c index 018bad624..19a321cc5 100644 --- a/sys/src/9/port/devdtracy.c +++ b/sys/src/9/port/devdtracy.c @@ -512,10 +512,18 @@ dtrealloc(void *v, ulong n) return v; } -void +int dtmachlock(int i) { + while(i < 0) { + i = dtmachlock(m->machno); + if(i == m->machno) + return i; + dtmachunlock(i); + i = -1; + } ilock(&machlocks[i]); + return i; } void diff --git a/sys/src/9/port/dtracysys.c b/sys/src/9/port/dtracysys.c index 367f4738b..1b19d6d9e 100644 --- a/sys/src/9/port/dtracysys.c +++ b/sys/src/9/port/dtracysys.c @@ -20,10 +20,10 @@ extern Syscall *systab[]; uintptr rc;\ DTTrigInfo info;\ memset(&info, 0, sizeof(info));\ - dtptrigger(dtpsysentry[y], m->machno, &info);\ + dtptrigger(dtpsysentry[y], &info);\ rc = z(va);\ info.arg[9] = (uvlong) rc;\ - dtptrigger(dtpsysreturn[y], m->machno, &info);\ + dtptrigger(dtpsysreturn[y], &info);\ return rc;\ } #define WRAP1(x,y,z,type0)\ @@ -33,10 +33,10 @@ extern Syscall *systab[]; DTTrigInfo info;\ memset(&info, 0, sizeof(info));\ info.arg[0] = (uvlong) va_arg(vb, type0);\ - dtptrigger(dtpsysentry[y], m->machno, &info);\ + dtptrigger(dtpsysentry[y], &info);\ rc = z(va);\ info.arg[9] = (uvlong) rc;\ - dtptrigger(dtpsysreturn[y], m->machno, &info);\ + dtptrigger(dtpsysreturn[y], &info);\ return rc;\ } #define WRAP2(x,y,z,type0,type1)\ @@ -47,10 +47,10 @@ extern Syscall *systab[]; memset(&info, 0, sizeof(info));\ info.arg[0] = (uvlong) va_arg(vb, type0);\ info.arg[1] = (uvlong) va_arg(vb, type1);\ - dtptrigger(dtpsysentry[y], m->machno, &info);\ + dtptrigger(dtpsysentry[y], &info);\ rc = z(va);\ info.arg[9] = (uvlong) rc;\ - dtptrigger(dtpsysreturn[y], m->machno, &info);\ + dtptrigger(dtpsysreturn[y], &info);\ return rc;\ } #define WRAP3(x,y,z,type0,type1,type2)\ @@ -62,10 +62,10 @@ extern Syscall *systab[]; info.arg[0] = (uvlong) va_arg(vb, type0);\ info.arg[1] = (uvlong) va_arg(vb, type1);\ info.arg[2] = (uvlong) va_arg(vb, type2);\ - dtptrigger(dtpsysentry[y], m->machno, &info);\ + dtptrigger(dtpsysentry[y], &info);\ rc = z(va);\ info.arg[9] = (uvlong) rc;\ - dtptrigger(dtpsysreturn[y], m->machno, &info);\ + dtptrigger(dtpsysreturn[y], &info);\ return rc;\ } #define WRAP4(x,y,z,type0,type1,type2,type3)\ @@ -78,10 +78,10 @@ extern Syscall *systab[]; info.arg[1] = (uvlong) va_arg(vb, type1);\ info.arg[2] = (uvlong) va_arg(vb, type2);\ info.arg[3] = (uvlong) va_arg(vb, type3);\ - dtptrigger(dtpsysentry[y], m->machno, &info);\ + dtptrigger(dtpsysentry[y], &info);\ rc = z(va);\ info.arg[9] = (uvlong) rc;\ - dtptrigger(dtpsysreturn[y], m->machno, &info);\ + dtptrigger(dtpsysreturn[y], &info);\ return rc;\ } /*TODO*/ @@ -96,10 +96,10 @@ extern Syscall *systab[]; info.arg[2] = (uvlong) va_arg(vb, type2);\ info.arg[3] = (uvlong) va_arg(vb, type3);\ info.arg[4] = (uvlong) va_arg(vb, type4);\ - dtptrigger(dtpsysentry[y], m->machno, &info);\ + dtptrigger(dtpsysentry[y], &info);\ rc = z(va);\ info.arg[9] = (uvlong) rc;\ - dtptrigger(dtpsysreturn[y], m->machno, &info);\ + dtptrigger(dtpsysreturn[y], &info);\ return rc;\ } diff --git a/sys/src/9/port/dtracytimer.c b/sys/src/9/port/dtracytimer.c index 0c39a1042..7ca89c1a6 100644 --- a/sys/src/9/port/dtracytimer.c +++ b/sys/src/9/port/dtracytimer.c @@ -17,7 +17,7 @@ dtracytimer(void *) memset(&info, 0, sizeof(info)); for(;;){ tsleep(&up->sleep, return0, nil, 1000); - dtptrigger(timerprobe, m->machno, &info); + dtptrigger(timerprobe, &info); } } diff --git a/sys/src/9/port/portmkfile b/sys/src/9/port/portmkfile index af9647f53..5af9e0b7f 100644 --- a/sys/src/9/port/portmkfile +++ b/sys/src/9/port/portmkfile @@ -80,6 +80,7 @@ devpipe.$O: ../port/netif.h netif.$O: ../port/netif.h devuart.$O: ../port/netif.h devbridge.$O: ../port/netif.h ../ip/ip.h ../ip/ipv6.h +devdtracy.$O dtracysys.$O dtracytimer.$O: /sys/include/dtracy.h devdraw.$O: screen.h /sys/include/draw.h /sys/include/memdraw.h /sys/include/memlayer.h /sys/include/cursor.h devmouse.$O: screen.h /sys/include/draw.h /sys/include/memdraw.h /sys/include/cursor.h swcursor.$O: screen.h /sys/include/draw.h /sys/include/memdraw.h /sys/include/cursor.h diff --git a/sys/src/cmd/5c/peep.c b/sys/src/cmd/5c/peep.c index c7f52512b..8ae41af6c 100644 --- a/sys/src/cmd/5c/peep.c +++ b/sys/src/cmd/5c/peep.c @@ -337,7 +337,7 @@ subprop(Reg *r0) break; case AMOVM: - t = 1<reg; + t = (1<reg) | (1<reg); if((p->from.type == D_CONST && (p->from.offset&t)) || (p->to.type == D_CONST && (p->to.offset&t))) return 0; diff --git a/sys/src/cmd/upas/fs/mbox.c b/sys/src/cmd/upas/fs/mbox.c index b83014ec0..5a23419db 100644 --- a/sys/src/cmd/upas/fs/mbox.c +++ b/sys/src/cmd/upas/fs/mbox.c @@ -76,8 +76,10 @@ syncmbox(Mailbox *mb, int doplumb) a = mb->root->subname; if(rdidxfile(mb) == -2) wridxfile(mb); - if(s = mb->sync(mb)) + if(s = mb->sync(mb)){ + mb->syncing = 0; return s; + } n = 0; d = 0; y = 0; diff --git a/sys/src/cmd/walk.c b/sys/src/cmd/walk.c new file mode 100644 index 000000000..856cedc5f --- /dev/null +++ b/sys/src/cmd/walk.c @@ -0,0 +1,321 @@ +#include +#include +#include +#include + +int Cflag = 0; +int uflag = 0; +String *stfmt; + +/* should turn these flags into a mask */ +int dflag = 1; +int fflag = 1; +int tflag = 0; +int xflag = 0; +long maxdepth = ~(1<<31); +long mindepth = 0; + +char *dotpath = "."; +Dir *dotdir = nil; + +Biobuf *bout; + +int seen(Dir*); + +void +warn(char *fmt, ...) +{ + va_list arg; + char buf[1024]; /* arbitrary */ + int n; + + if((n = snprint(buf, sizeof(buf), "%s: ", argv0)) < 0) + sysfatal("snprint: %r"); + va_start(arg, fmt); + vseprint(buf+n, buf+sizeof(buf), fmt, arg); + va_end(arg); + + Bflush(bout); + fprint(2, "%s\n", buf); +} + +void +dofile(char *path, Dir *f, int pathonly) +{ + char *p; + + if( + (f == dotdir) + || (tflag && ! (f->qid.type & QTTMP)) + || (xflag && ! (f->mode & DMEXEC)) + ) + return; + + for(p = s_to_c(stfmt); *p != '\0'; p++){ + switch(*p){ + case 'U': Bwrite(bout, f->uid, strlen(f->uid)); break; + case 'G': Bwrite(bout, f->gid, strlen(f->gid)); break; + case 'M': Bwrite(bout, f->muid, strlen(f->muid)); break; + case 'a': Bprint(bout, "%uld", f->atime); break; + case 'm': Bprint(bout, "%uld", f->mtime); break; + case 'n': Bwrite(bout, f->name, strlen(f->name)); break; + case 'p': + if(path != dotpath) + Bwrite(bout, path, strlen(path)); + if(! (f->qid.type & QTDIR) && !pathonly){ + if(path != dotpath) + Bputc(bout, '/'); + Bwrite(bout, f->name, strlen(f->name)); + } + break; + case 'q': Bprint(bout, "%ullx.%uld.%.2uhhx", f->qid.path, f->qid.vers, f->qid.type); break; + case 's': Bprint(bout, "%lld", f->length); break; + case 'x': Bprint(bout, "%ulo", f->mode); break; + default: + abort(); + } + + if(*(p+1) != '\0') + Bputc(bout, ' '); + } + + Bputc(bout, '\n'); + + if(uflag) + Bflush(bout); +} + +void +walk(char *path, Dir *cf, long depth) +{ + String *file; + Dir *dirs, *f, *fe; + int fd; + long n; + + if(cf == nil){ + warn("path: %s: %r", path); + return; + } + + if(depth >= maxdepth) + goto nodescend; + + if((fd = open(path, OREAD)) < 0){ + warn("couldn't open %s: %r", path); + return; + } + + while((n = dirread(fd, &dirs)) > 0){ + fe = dirs+n; + for(f = dirs; f < fe; f++){ + if(seen(f)) + continue; + if(! (f->qid.type & QTDIR)){ + if(fflag && depth >= mindepth) + dofile(path, f, 0); + } else if(strcmp(f->name, ".") == 0 || strcmp(f->name, "..") == 0){ + warn(". or .. named file: %s/%s", path, f->name); + } else{ + if(depth+1 > maxdepth){ + dofile(path, f, 0); + continue; + } else if(path == dotpath){ + if((file = s_new()) == nil) + sysfatal("s_new: %r"); + } else{ + if((file = s_copy(path)) == nil) + sysfatal("s_copy: %r"); + if(s_len(file) != 1 || *s_to_c(file) != '/') + s_putc(file, '/'); + } + s_append(file, f->name); + + walk(s_to_c(file), f, depth+1); + s_free(file); + } + } + free(dirs); + } + close(fd); + if(n < 0) + warn("%s: %r", path); + +nodescend: + depth--; + if(dflag && depth >= mindepth) + dofile(path, cf, 0); +} + +char* +slashslash(char *s) +{ + char *p, *q; + + for(p=q=s; *q; q++){ + if(q>s && *q=='/' && *(q-1)=='/') + continue; + if(p != q) + *p = *q; + p++; + } + do{ + *p-- = '\0'; + } while(p>s && *p=='/'); + + return s; +} + +long +estrtol(char *as, char **aas, int base) +{ + long n; + char *p; + + n = strtol(as, &p, base); + if(p == as || *p != '\0') + sysfatal("estrtol: bad input '%s'", as); + else if(aas != nil) + *aas = p; + + return n; +} + +void +elimdepth(char *p){ + char *q; + + if(strlen(p) == 0) + sysfatal("empty depth argument"); + + if(q = strchr(p, ',')){ + *q = '\0'; + if(p != q) + mindepth = estrtol(p, nil, 0); + p = q+1; + if(*p == '\0') + return; + } + + maxdepth = estrtol(p, nil, 0); +} + +void +usage(void) +{ + fprint(2, "usage: %s [-udftx] [-n mind,maxd] [-e statfmt] [file ...]\n", argv0); + exits("usage"); +} + +/* + Last I checked (commit 3dd6a31881535615389c24ab9a139af2798c462c), + libString calls sysfatal when things go wrong; in my local + copy of libString, failed calls return nil and errstr is set. + + There are various nil checks in this code when calling libString + functions, but since they are a no-op and libString needs + a rework, I left them in - BurnZeZ +*/ + +void +main(int argc, char **argv) +{ + long i; + Dir *d; + + stfmt = nil; + ARGBEGIN{ + case 'C': Cflag++; break; /* undocumented; do not cleanname() the args */ + case 'u': uflag++; break; /* unbuffered output */ + + case 'd': dflag++; fflag = 0; break; /* only dirs */ + case 'f': fflag++; dflag = 0; break; /* only non-dirs */ + case 't': tflag++; break; /* only tmp files */ + case 'x': xflag++; break; /* only executable permission */ + + case 'n': elimdepth(EARGF(usage())); break; + case 'e': + if((stfmt = s_reset(stfmt)) == nil) + sysfatal("s_reset: %r"); + s_append(stfmt, EARGF(usage())); + i = strspn(s_to_c(stfmt), "UGMamnpqsx"); + if(i != s_len(stfmt)) + sysfatal("bad stfmt: %s\n", s_to_c(stfmt)); + break; + default: + usage(); + }ARGEND; + + if((bout = Bfdopen(1, OWRITE)) == nil) + sysfatal("Bfdopen: %r"); + Blethal(bout, nil); + if(stfmt == nil){ + if((stfmt = s_new()) == nil) + sysfatal("s_new: %r"); + s_putc(stfmt, 'p'); + s_terminate(stfmt); + } + if(maxdepth != ~(1<<31)) + maxdepth++; + if(argc == 0){ + dotdir = dirstat("."); + walk(dotpath, dotdir, 1); + } else for(i=0; iqid.type & QTDIR)){ + if(fflag && !seen(d) && mindepth < 1) + dofile(argv[i], d, 1); + } else + walk(argv[i], d, 1); + free(d); + } + Bterm(bout); + + exits(nil); +} + +/* below pilfered from /sys/src/cmd/du.c + * NOTE: I did not check for bugs */ + +#define NCACHE 256 /* must be power of two */ + +typedef struct +{ + Dir* cache; + int n; + int max; +} Cache; +Cache cache[NCACHE]; + +int +seen(Dir *dir) +{ + Dir *dp; + int i; + Cache *c; + + c = &cache[dir->qid.path&(NCACHE-1)]; + dp = c->cache; + for(i=0; in; i++, dp++) + if(dir->qid.path == dp->qid.path && + dir->type == dp->type && + dir->dev == dp->dev) + return 1; + if(c->n == c->max){ + if (c->max == 0) + c->max = 8; + else + c->max += c->max/2; + c->cache = realloc(c->cache, c->max*sizeof(Dir)); + if(c->cache == nil) + sysfatal("realloc: %r"); + } + c->cache[c->n++] = *dir; + return 0; +} diff --git a/sys/src/cmd/webfs/fns.h b/sys/src/cmd/webfs/fns.h index 67301005d..b754802fa 100644 --- a/sys/src/cmd/webfs/fns.h +++ b/sys/src/cmd/webfs/fns.h @@ -15,10 +15,12 @@ char* unquote(char *s, char **ps); #pragma varargck type "U" Url* #pragma varargck type "E" Str2 #pragma varargck type "N" char* +#pragma varargck type "]" char* int Efmt(Fmt*); int Nfmt(Fmt*); int Ufmt(Fmt*); +int Mfmt(Fmt*); char* Upath(Url *); Url* url(char *s, Url *b); Url* saneurl(Url *u); diff --git a/sys/src/cmd/webfs/fs.c b/sys/src/cmd/webfs/fs.c index 6b4f4990d..e4e08670d 100644 --- a/sys/src/cmd/webfs/fs.c +++ b/sys/src/cmd/webfs/fs.c @@ -766,6 +766,7 @@ main(int argc, char *argv[]) quotefmtinstall(); fmtinstall('U', Ufmt); fmtinstall('N', Nfmt); + fmtinstall(']', Mfmt); fmtinstall('E', Efmt); fmtinstall('[', encodefmt); fmtinstall('H', encodefmt); diff --git a/sys/src/cmd/webfs/http.c b/sys/src/cmd/webfs/http.c index 907035bcc..58a0df91c 100644 --- a/sys/src/cmd/webfs/http.c +++ b/sys/src/cmd/webfs/http.c @@ -637,7 +637,7 @@ http(char *m, Url *u, Key *shdr, Buq *qbody, Buq *qpost) ru.path = Upath(u); ru.query = u->query; } - n = snprint(buf, sizeof(buf), "%s %U HTTP/1.1\r\nHost: %s%s%s\r\n", + n = snprint(buf, sizeof(buf), "%s %U HTTP/1.1\r\nHost: %]%s%s\r\n", method, &ru, host, u->port ? ":" : "", u->port ? u->port : ""); if(n >= sizeof(buf)-64){ werrstr("request too large"); @@ -649,7 +649,7 @@ http(char *m, Url *u, Key *shdr, Buq *qbody, Buq *qpost) break; } if(h->tunnel){ - n = snprint(buf, sizeof(buf), "CONNECT %s:%s HTTP/1.1\r\nHost: %s:%s\r\n", + n = snprint(buf, sizeof(buf), "CONNECT %]:%s HTTP/1.1\r\nHost: %]:%s\r\n", host, u->port ? u->port : "443", host, u->port ? u->port : "443"); } diff --git a/sys/src/cmd/webfs/url.c b/sys/src/cmd/webfs/url.c index 1f460a8cb..870a3cdc2 100644 --- a/sys/src/cmd/webfs/url.c +++ b/sys/src/cmd/webfs/url.c @@ -82,6 +82,14 @@ Nfmt(Fmt *f) return 0; } +int +Mfmt(Fmt *f) +{ + char *s = va_arg(f->args, char*); + fmtprint(f, (*s != '[' && strchr(s, ':') != nil)? "[%s]" : "%s", s); + return 0; +} + int Ufmt(Fmt *f) { @@ -101,7 +109,7 @@ Ufmt(Fmt *f) fmtprint(f, "@"); } if(u->host){ - fmtprint(f, strchr(u->host, ':') ? "[%s]" : "%s", u->host); + fmtprint(f, "%]", u->host); if(u->port) fmtprint(f, ":%s", u->port); } diff --git a/sys/src/libdtracy/prog.c b/sys/src/libdtracy/prog.c index 402638f13..831a94b5e 100644 --- a/sys/src/libdtracy/prog.c +++ b/sys/src/libdtracy/prog.c @@ -336,13 +336,12 @@ dtgexec(DTActGr *g, DTTrigInfo *info) } void -dtptrigger(DTProbe *p, int machno, DTTrigInfo *info) +dtptrigger(DTProbe *p, DTTrigInfo *info) { DTEnab *e; info->ts = dttime(); - dtmachlock(machno); - info->machno = machno; + info->machno = dtmachlock(-1); for(e = p->enablist.probnext; e != &p->enablist; e = e->probnext) if(e->gr->chan->state == DTCGO){ info->ch = e->gr->chan; @@ -350,5 +349,5 @@ dtptrigger(DTProbe *p, int machno, DTTrigInfo *info) if(dtgexec(e->gr, info) < 0) e->gr->chan->state = DTCFAULT; } - dtmachunlock(machno); + dtmachunlock(info->machno); }