#include #include Dir* s(char*); char *format_s(char *, Dir *); void usage(void) { fprint(2, "usage: stat [-f format] [-9DL] file [file...]\n"); exits("usage"); } void main(int argc, char *argv[]) { int i, errs; char *format; Dir *d; errs = 0; format = nil; ARGBEGIN{ case '9': format = strdup("%9%n"); break; case 'D': format = strdup("%D"); break; case 'f': format = strdup(EARGF(usage())); break; case 'L': format = strdup("%L%n"); break; default: usage(); }ARGEND if (format == nil) format = strdup("%t%n"); if(argc <=0) usage(); quotefmtinstall(); for(i=0; iatime); break; case 'd': outb=smprint("%s%ud", outb, d->dev); break; case 'g': outb=smprint("%s%s", outb, d->gid); break; case 'l': outb=smprint("%s%lld", outb, d->length); break; case 'm': outb=smprint("%s%ulo", outb, d->mode); break; case 'M': outb=smprint("%s%s", outb, d->muid); break; /* n is newline. */ case 'N': outb=smprint("%s%s", outb, d->name); break; case 'o': outb=smprint("%s%s", outb, d->uid); break; case 't': outb=smprint("%s%uld", outb, d->mtime); break; case 'T': outb=smprint("%s%C", outb, d->type); break; /* Qid components. */ case 'p': outb=smprint("%s%ulld", outb, d->qid.path); break; case 'v': outb=smprint("%s%uld", outb, d->qid.vers); break; case 'q': outb=smprint("%s%uhho", outb, d->qid.type); break; /* Composites and pre-formatted types. */ case '9': outb=smprint("%s'%s' '%s' '%s' '%s' q (%.16llux %lud %x) " "m %#luo at %ld mt %ld l %lld t %d d %d", outb, d->name, d->uid, d->gid, d->muid, d->qid.path, d->qid.vers, d->qid.type, d->mode, d->atime, d->mtime, d->length, d->type, d->dev); break; case 'D': outb=smprint("%s%s", outb, format_s("name: %N%n" "type: %T%ndev: %d%nqid: %Q%nmode: %m%n" "atime: %a%nmtime: %t%nlength: %l%n" "uid: %o%ngid: %g%nmuid: %M%n", d)); break; case 'L': outb = smprint("%s%ulo %C %ud %q %q %llud %uld %s", outb, d->mode, d->type, d->dev, d->uid, d->gid, d->length, d->mtime, d->name); break; case 'Q': outb=smprint("%s%s", outb, format_s("%p %v %q", d)); break; /* Literals and others */ case ' ': outb=smprint("%s%s", outb, " "); break; case '%': outb=smprint("%s%s", outb, "%"); break; case 'n': outb=smprint("%s%s", outb, "\n"); break; case '_': outb=smprint("%s%s", outb, " "); break; default: break; } } return outb; }