this fixes the maximum filename length restriction of the previous du command. back in the days of kfs and ken's fs it was ok (max length of 28 characters per file name) but now it segfaults badly for big directories: plan9% mkdir `{for (i in `{seq 1 1000}) echo -n $i} plan9% du . du 99198: suicide: sys: trap: fault write addr=0x7ffff000 pc=0x000059b1 plan9% ls 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000 plan9% NOTE: the Strings are created a bit wastefully (each sprint is a malloc now) so please modify the source if you think there's a more elegant way of doing it. Reference: /n/sources/patch/applied/du-char-overflow Date: Sun Aug 1 18:59:44 CES 2004 --- /sys/src/cmd/du.c Sun Aug 1 18:59:44 2004 +++ /sys/src/cmd/du.c Sun Aug 1 18:59:44 2004 @@ -1,5 +1,6 @@ #include #include +#include extern vlong du(char*, Dir*); extern vlong k(vlong); @@ -74,7 +75,7 @@ { int fd, i, n; Dir *buf, *d; - char file[256]; + String *file; vlong nk, t; if(dir == nil) @@ -95,7 +96,9 @@ t = k(d->length); nk += t; if(aflag) { - sprint(file, "%s/%s", name, d->name); + file = s_copy(name); + s_append(file, "/"); + s_append(file, d->name); if(tflag) { t = d->mtime; if(uflag) @@ -103,7 +106,8 @@ } if(qflag) t = d->qid.path; - print(fmt, t, file); + print(fmt, t, s_to_c(file)); + s_free(file); } continue; } @@ -111,8 +115,10 @@ strcmp(d->name, "..") == 0 || seen(d)) continue; - sprint(file, "%s/%s", name, d->name); - t = du(file, d); + file = s_copy(name); + s_append(file, "/"); + s_append(file, d->name); + t = du(s_to_c(file), d); nk += t; if(tflag) { t = d->mtime; @@ -122,7 +128,8 @@ if(qflag) t = d->qid.path; if(!sflag) - print(fmt, t, file); + print(fmt, t, s_to_c(file)); + s_free(file); } free(buf); }