<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv=Content-Type content="text/html; charset=utf8"> <title>/usr/web/sources/contrib/maht/walk.c - Plan 9 from Bell Labs</title> <!-- THIS FILE IS AUTOMATICALLY GENERATED. --> <!-- EDIT sources.tr INSTEAD. --> </meta> </head> <body> <p style="margin-top: 0; margin-bottom: 0.17in"></p> <p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: center;"> <span style="font-size: 10pt"><a href="/plan9/">Plan 9 from Bell Labs</a>’s /usr/web/sources/contrib/maht/walk.c</span></p> <p style="margin-top: 0; margin-bottom: 0.17in"></p> <p style="margin-top: 0; margin-bottom: 0.17in"></p> <center><font size=-1> Copyright © 2009 Alcatel-Lucent.<br /> Distributed under the <a href="/plan9/license.html">Lucent Public License version 1.02</a>. <br /> <a href="/plan9/download.html">Download the Plan 9 distribution.</a> </font> </center> <p style="margin-top: 0; margin-bottom: 0.17in"></p> <table width="100%" cellspacing=0 border=0><tr><td align="center"> <table cellspacing=0 cellpadding=5 bgcolor="#eeeeff"><tr><td align="left"> <pre> <!-- END HEADER --> /* * Walk a directory tree, in the style of du(1), * but with some additional flourishes. * * Dan Cross <cross@math.psu.edu> maht - I added the -t, -p, -f options */ #include <u.h> #include <libc.h> static int mkdepth(int); static char *mkname(char *, int *, char *, char *); static void walk(char *, int, int); static void walkname(char *, int, int); char *dfmt; char *ffmt; int nodirs = 0; int nofiles = 0; void main(int argc, char *argv[]) { char *dir; int depth; Dir *d; int trailing = 0; dir = "."; ffmt = "%s\n"; dfmt = "%s/\n"; depth = -1; ARGBEGIN { case 'd': depth = atoi(ARGF()); break; case 'q': quotefmtinstall(); doquote = needsrcquote; ffmt = "%q\n"; dfmt = "%q/\n"; break; case 't' : trailing = 1; break; case 'f' : nodirs = 1; break; case 'p' : nofiles = 1; break; }ARGEND if(!trailing) dfmt = ffmt; if (argc == 0) walkname(".", depth, 1); else { for (dir = *argv; dir; dir = *++argv) { if ((d = dirstat(dir)) == nil) { fprint(2, "dirstat %s: %r\n", dir); continue; } walkname(dir, depth, d->mode & DMDIR); free(d); } } exits(0); } static void walkname(char *dirname, int depth, int isdir) { int fd; if (isdir) { if (strcmp(dirname, ".") != 0 && strcmp(dirname, "..") != 0) nodirs == 0 && print(dfmt, dirname); fd = open(dirname, OREAD); if (fd < 0) { fprint(2, "open %s: %r\n", dirname); return; } walk(dirname, fd, depth); close(fd); } else { if (strcmp(dirname, ".") != 0 && strcmp(dirname, "..") != 0) nofiles == 0 && print(ffmt, dirname); } } static char * mkname(char *name, int *l, char *basename, char *filename) { char *nname; int t; t = strlen(basename) + 1 + strlen(filename) + 1; if (*l == 0 || name == nil) { *l = t; name = malloc(t); if (name == nil) sysfatal("malloc %d: %r\n", l); } else if (*l < t) { nname = realloc(name, t); if (nname == nil) { free(name); sysfatal("malloc %d: %r\n", l); } *l = t; name = nname; } snprint(name, t, "%s/%s", basename, filename); cleanname(name); return(name); } static int mkdepth(int depth) { return((depth == -1) ? depth : depth - 1); } static void walk(char *dirname, int fd, int depth) { Dir *dir, *dp; char *name, *nname; int i, l, n, t; if (depth == 0) return; l = 0; name = nil; n = dirreadall(fd, &dir); for (dp = dir, i = 0; i < n; dp++, i++) { if (strcmp(dp->name, ".") == 0 || strcmp(dp->name, "..") == 0) continue; name = mkname(name, &l, dirname, dp->name); walkname(name, mkdepth(depth), dp->mode & DMDIR); } free(dir); if (name != nil) free(name); } <!-- BEGIN TAIL --> </pre> </td></tr></table> </td></tr></table> <p style="margin-top: 0; margin-bottom: 0.17in"></p> <p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: center;"> <span style="font-size: 10pt"></span></p> <p style="margin-top: 0; margin-bottom: 0.50in"></p> <p style="margin-top: 0; margin-bottom: 0.33in"></p> <center><table border="0"><tr> <td valign="middle"><a href="http://www.alcatel-lucent.com/"><img border="0" src="/plan9/img/logo_ft.gif" alt="Bell Labs" /> </a></td> <td valign="middle"><a href="http://www.opensource.org"><img border="0" alt="OSI certified" src="/plan9/img/osi-certified-60x50.gif" /> </a></td> <td><img style="padding-right: 45px;" alt="Powered by Plan 9" src="/plan9/img/power36.gif" /> </td> </tr></table></center> <p style="margin-top: 0; margin-bottom: 0.17in"></p> <center> <span style="font-size: 10pt">(<a href="/plan9/">Return to Plan 9 Home Page</a>)</span> </center> <p style="margin-top: 0; margin-bottom: 0.17in"></p> <center><font size=-1> <span style="font-size: 10pt"><a href="http://www.lucent.com/copyright.html">Copyright</a></span> <span style="font-size: 10pt">© 2009 Alcatel-Lucent.</span> <span style="font-size: 10pt">All Rights Reserved.</span> <br /> <span style="font-size: 10pt">Comments to</span> <span style="font-size: 10pt"><a href="mailto:webmaster@plan9.bell-labs.com">webmaster@plan9.bell-labs.com</a>.</span> </font></center> </body> </html>