Blame


1 6e527fbc 2005-02-13 devnull #include <u.h>
2 6e527fbc 2005-02-13 devnull #include <libc.h>
3 6e527fbc 2005-02-13 devnull #include <mp.h>
4 6e527fbc 2005-02-13 devnull #include <libsec.h>
5 6e527fbc 2005-02-13 devnull #include "SConn.h"
6 6e527fbc 2005-02-13 devnull
7 6e527fbc 2005-02-13 devnull static long
8 6e527fbc 2005-02-13 devnull ls(char *p, Dir **dirbuf)
9 6e527fbc 2005-02-13 devnull {
10 6e527fbc 2005-02-13 devnull int fd;
11 6e527fbc 2005-02-13 devnull long n;
12 6e527fbc 2005-02-13 devnull Dir *db;
13 6e527fbc 2005-02-13 devnull
14 6e527fbc 2005-02-13 devnull if((db = dirstat(p)) == nil ||
15 6e527fbc 2005-02-13 devnull !(db->qid.type & QTDIR) ||
16 6e527fbc 2005-02-13 devnull (fd = open(p, OREAD)) < 0 )
17 6e527fbc 2005-02-13 devnull return -1;
18 6e527fbc 2005-02-13 devnull free(db);
19 6e527fbc 2005-02-13 devnull n = dirreadall(fd, dirbuf);
20 6e527fbc 2005-02-13 devnull close(fd);
21 6e527fbc 2005-02-13 devnull return n;
22 6e527fbc 2005-02-13 devnull }
23 6e527fbc 2005-02-13 devnull
24 6e527fbc 2005-02-13 devnull static uchar*
25 6e527fbc 2005-02-13 devnull sha1file(char *pfx, char *nm)
26 6e527fbc 2005-02-13 devnull {
27 6e527fbc 2005-02-13 devnull int n, fd, len;
28 6e527fbc 2005-02-13 devnull char *tmp;
29 6e527fbc 2005-02-13 devnull uchar buf[8192];
30 6e527fbc 2005-02-13 devnull static uchar digest[SHA1dlen];
31 6e527fbc 2005-02-13 devnull DigestState *s;
32 6e527fbc 2005-02-13 devnull
33 6e527fbc 2005-02-13 devnull len = strlen(pfx)+1+strlen(nm)+1;
34 6e527fbc 2005-02-13 devnull tmp = emalloc(len);
35 6e527fbc 2005-02-13 devnull snprint(tmp, len, "%s/%s", pfx, nm);
36 6e527fbc 2005-02-13 devnull if((fd = open(tmp, OREAD)) < 0){
37 6e527fbc 2005-02-13 devnull free(tmp);
38 6e527fbc 2005-02-13 devnull return nil;
39 6e527fbc 2005-02-13 devnull }
40 6e527fbc 2005-02-13 devnull free(tmp);
41 6e527fbc 2005-02-13 devnull s = nil;
42 6e527fbc 2005-02-13 devnull while((n = read(fd, buf, sizeof buf)) > 0)
43 6e527fbc 2005-02-13 devnull s = sha1(buf, n, nil, s);
44 6e527fbc 2005-02-13 devnull close(fd);
45 6e527fbc 2005-02-13 devnull sha1(nil, 0, digest, s);
46 6e527fbc 2005-02-13 devnull return digest;
47 6e527fbc 2005-02-13 devnull }
48 6e527fbc 2005-02-13 devnull
49 6e527fbc 2005-02-13 devnull static int
50 6e527fbc 2005-02-13 devnull compare(Dir *a, Dir *b)
51 6e527fbc 2005-02-13 devnull {
52 6e527fbc 2005-02-13 devnull return strcmp(a->name, b->name);
53 6e527fbc 2005-02-13 devnull }
54 6e527fbc 2005-02-13 devnull
55 6e527fbc 2005-02-13 devnull /* list the (name mtime size sum) of regular, readable files in path */
56 6e527fbc 2005-02-13 devnull char *
57 6e527fbc 2005-02-13 devnull dirls(char *path)
58 6e527fbc 2005-02-13 devnull {
59 6e527fbc 2005-02-13 devnull char *list, *date, dig[30], buf[128];
60 6e527fbc 2005-02-13 devnull int m, nmwid, lenwid;
61 6e527fbc 2005-02-13 devnull long i, n, ndir, len;
62 6e527fbc 2005-02-13 devnull Dir *dirbuf;
63 6e527fbc 2005-02-13 devnull
64 6e527fbc 2005-02-13 devnull if(path==nil || (ndir = ls(path, &dirbuf)) < 0)
65 6e527fbc 2005-02-13 devnull return nil;
66 6e527fbc 2005-02-13 devnull
67 6e527fbc 2005-02-13 devnull qsort(dirbuf, ndir, sizeof dirbuf[0], (int (*)(const void *, const void *))compare);
68 6e527fbc 2005-02-13 devnull for(nmwid=lenwid=i=0; i<ndir; i++){
69 6e527fbc 2005-02-13 devnull if((m = strlen(dirbuf[i].name)) > nmwid)
70 6e527fbc 2005-02-13 devnull nmwid = m;
71 6e527fbc 2005-02-13 devnull snprint(buf, sizeof(buf), "%ulld", dirbuf[i].length);
72 6e527fbc 2005-02-13 devnull if((m = strlen(buf)) > lenwid)
73 6e527fbc 2005-02-13 devnull lenwid = m;
74 6e527fbc 2005-02-13 devnull }
75 6e527fbc 2005-02-13 devnull for(list=nil, len=0, i=0; i<ndir; i++){
76 6e527fbc 2005-02-13 devnull date = ctime(dirbuf[i].mtime);
77 cbeb0b26 2006-04-01 devnull date[28] = 0; /* trim newline */
78 6e527fbc 2005-02-13 devnull n = snprint(buf, sizeof buf, "%*ulld %s", lenwid, dirbuf[i].length, date+4);
79 6e527fbc 2005-02-13 devnull n += enc64(dig, sizeof dig, sha1file(path, dirbuf[i].name), SHA1dlen);
80 6e527fbc 2005-02-13 devnull n += nmwid+3+strlen(dirbuf[i].name);
81 6e527fbc 2005-02-13 devnull list = erealloc(list, len+n+1);
82 6e527fbc 2005-02-13 devnull len += snprint(list+len, n+1, "%-*s\t%s %s\n", nmwid, dirbuf[i].name, buf, dig);
83 6e527fbc 2005-02-13 devnull }
84 6e527fbc 2005-02-13 devnull free(dirbuf);
85 6e527fbc 2005-02-13 devnull return list;
86 6e527fbc 2005-02-13 devnull }