URI: 
       tdiff: continue after i/o errors when diffing many files - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit eb5d2a54d5ee79118c8081c7de3409f93e500b54
   DIR parent e84044be84489b6f4f9ce69d0d6eba6cac66a9b6
  HTML Author: Russ Cox <rsc@swtch.com>
       Date:   Mon,  5 Nov 2007 11:09:39 -0500
       
       diff: continue after i/o errors when diffing many files
       
       Diffstat:
         M src/cmd/diff/diffdir.c              |      13 +++++++++----
         M src/cmd/diff/main.c                 |       5 ++++-
       
       2 files changed, 13 insertions(+), 5 deletions(-)
       ---
   DIR diff --git a/src/cmd/diff/diffdir.c b/src/cmd/diff/diffdir.c
       t@@ -19,8 +19,10 @@ scandir(char *name)
                int nitems;
                int fd, n;
        
       -        if ((fd = open(name, OREAD)) < 0)
       -                panic(2, "can't open %s\n", name);
       +        if ((fd = open(name, OREAD)) < 0){
       +                panic(mflag ? 0 : 2, "can't open %s\n", name);
       +                return nil;
       +        }
                cp = 0;
                nitems = 0;
                if((n = dirreadall(fd, &db)) > 0){
       t@@ -63,6 +65,8 @@ diffdir(char *f, char *t, int level)
                dt = scandir(t);
                dirf = df;
                dirt = dt;
       +        if(df == nil || dt == nil)
       +                goto Out;
                while (*df || *dt) {
                        from = *df;
                        to = *dt;
       t@@ -99,9 +103,10 @@ diffdir(char *f, char *t, int level)
                        diff(fb, tb, level+1);
                        df++; dt++;
                }
       -        for (df = dirf; *df; df++)
       +Out:
       +        for (df = dirf; df && *df; df++)
                        FREE(*df);
       -        for (dt = dirt; *dt; dt++)
       +        for (dt = dirt; dt && *dt; dt++)
                        FREE(*dt);
                FREE(dirf);
                FREE(dirt);
   DIR diff --git a/src/cmd/diff/main.c b/src/cmd/diff/main.c
       t@@ -183,7 +183,9 @@ main(int argc, char *argv[])
                char *p;
                int i;
                Dir *fsb, *tsb;
       -
       +        extern int _p9usepwlibrary;
       +        
       +        _p9usepwlibrary = 0;
                Binit(&stdout, 1, OWRITE);
                progname = *argv;
                while (--argc && (*++argv)[0] == '-' && (*argv)[1]) {
       t@@ -208,6 +210,7 @@ main(int argc, char *argv[])
        
                                case 'r':
                                        rflag = 1;
       +                                mflag = 1;
                                        break;
        
                                case 'm':