Blame


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