1 18824b58 2008-08-03 rsc #include "a.h"
3 18824b58 2008-08-03 rsc // This code is almost certainly wrong.
5 18824b58 2008-08-03 rsc typedef struct Icache Icache;
9 18824b58 2008-08-03 rsc HTTPHeader hdr;
10 18824b58 2008-08-03 rsc char *tmpfile;
12 18824b58 2008-08-03 rsc Icache *next;
13 18824b58 2008-08-03 rsc Icache *prev;
14 18824b58 2008-08-03 rsc Icache *hash;
19 18824b58 2008-08-03 rsc MAXCACHE = 128,
21 18824b58 2008-08-03 rsc static struct {
22 18824b58 2008-08-03 rsc Icache *hash[NHASH];
23 18824b58 2008-08-03 rsc Icache *head;
24 18824b58 2008-08-03 rsc Icache *tail;
28 18824b58 2008-08-03 rsc static Icache*
29 18824b58 2008-08-03 rsc icachefind(char *url)
34 18824b58 2008-08-03 rsc h = hash(url) % NHASH;
35 18824b58 2008-08-03 rsc for(ic=icache.hash[h]; ic; ic=ic->hash){
36 18824b58 2008-08-03 rsc if(strcmp(ic->url, url) == 0){
37 18824b58 2008-08-03 rsc /* move to front */
38 18824b58 2008-08-03 rsc if(ic->prev) {
39 18824b58 2008-08-03 rsc ic->prev->next = ic->next;
41 18824b58 2008-08-03 rsc ic->next->prev = ic->prev;
43 18824b58 2008-08-03 rsc icache.tail = ic->prev;
44 18824b58 2008-08-03 rsc ic->prev = nil;
45 18824b58 2008-08-03 rsc ic->next = icache.head;
46 18824b58 2008-08-03 rsc icache.head->prev = ic;
47 18824b58 2008-08-03 rsc icache.head = ic;
55 18824b58 2008-08-03 rsc static Icache*
56 18824b58 2008-08-03 rsc icacheinsert(char *url, HTTPHeader *hdr, char *file, int fd)
59 18824b58 2008-08-03 rsc Icache *ic, **l;
61 18824b58 2008-08-03 rsc if(icache.n == MAXCACHE){
62 18824b58 2008-08-03 rsc ic = icache.tail;
63 18824b58 2008-08-03 rsc icache.tail = ic->prev;
65 18824b58 2008-08-03 rsc ic->prev->next = nil;
67 18824b58 2008-08-03 rsc icache.head = ic->prev;
68 18824b58 2008-08-03 rsc h = hash(ic->url) % NHASH;
69 18824b58 2008-08-03 rsc for(l=&icache.hash[h]; *l; l=&(*l)->hash){
70 18824b58 2008-08-03 rsc if(*l == ic){
71 18824b58 2008-08-03 rsc *l = ic->hash;
72 18824b58 2008-08-03 rsc goto removed;
75 18824b58 2008-08-03 rsc sysfatal("cannot find ic in cache");
77 18824b58 2008-08-03 rsc free(ic->url);
78 18824b58 2008-08-03 rsc close(ic->fd);
79 18824b58 2008-08-03 rsc remove(ic->file);
80 18824b58 2008-08-03 rsc free(ic->file);
82 18824b58 2008-08-03 rsc ic = emalloc(sizeof *ic);
86 18824b58 2008-08-03 rsc ic->url = estrdup(url);
87 18824b58 2008-08-03 rsc ic->fd = dup(fd, -1);
88 18824b58 2008-08-03 rsc ic->file = estrdup(file);
89 18824b58 2008-08-03 rsc ic->hdr = *hdr;
90 18824b58 2008-08-03 rsc h = hash(url) % NHASH;
91 18824b58 2008-08-03 rsc ic->hash = icache.hash[h];
92 18824b58 2008-08-03 rsc icache.hash[h] = ic;
93 18824b58 2008-08-03 rsc ic->prev = nil;
94 18824b58 2008-08-03 rsc ic->next = icache.head;
96 18824b58 2008-08-03 rsc ic->next->prev = ic;
98 18824b58 2008-08-03 rsc icache.tail = ic;
103 18824b58 2008-08-03 rsc icacheflush(char *substr)
105 18824b58 2008-08-03 rsc Icache **l, *ic;
107 18824b58 2008-08-03 rsc for(l=&icache.head; (ic=*l); ) {
108 18824b58 2008-08-03 rsc if(substr == nil || strstr(ic->url, substr)) {
110 18824b58 2008-08-03 rsc *l = ic->next;
111 18824b58 2008-08-03 rsc free(ic->url);
112 18824b58 2008-08-03 rsc close(ic->fd);
113 18824b58 2008-08-03 rsc remove(ic->file);
114 18824b58 2008-08-03 rsc free(ic->file);
117 18824b58 2008-08-03 rsc l = &ic->next;
120 18824b58 2008-08-03 rsc if(icache.head) {
121 18824b58 2008-08-03 rsc icache.head->prev = nil;
122 18824b58 2008-08-03 rsc for(ic=icache.head; ic; ic=ic->next){
123 18824b58 2008-08-03 rsc if(ic->next)
124 18824b58 2008-08-03 rsc ic->next->prev = ic;
126 18824b58 2008-08-03 rsc icache.tail = ic;
129 18824b58 2008-08-03 rsc icache.tail = nil;
133 18824b58 2008-08-03 rsc urlfetch(char *url, HTTPHeader hdr)
136 18824b58 2008-08-03 rsc char buf[50], *host, *path, *p;
137 18824b58 2008-08-03 rsc int fd, len;
139 18824b58 2008-08-03 rsc ic = icachefind(url);
140 18824b58 2008-08-03 rsc if(ic != nil){
141 18824b58 2008-08-03 rsc *hdr = ic->hdr;
142 18824b58 2008-08-03 rsc return dup(ic->fd, -1);
145 18824b58 2008-08-03 rsc if(memcmp(url, "http://", 7) != 0){
146 18824b58 2008-08-03 rsc werrstr("non-http url");
149 18824b58 2008-08-03 rsc p = strchr(url+7, '/');
150 18824b58 2008-08-03 rsc if(p == nil)
151 18824b58 2008-08-03 rsc p = url+strlen(url);
152 18824b58 2008-08-03 rsc len = p - (url+7);
153 18824b58 2008-08-03 rsc host = emalloc(len+1);
154 18824b58 2008-08-03 rsc memmove(host, url+7, len);
155 18824b58 2008-08-03 rsc host[len] = 0;
159 18824b58 2008-08-03 rsc strcpy(buf, "/var/tmp/smugfs.XXXXXX");
160 18824b58 2008-08-03 rsc fd = opentemp(buf, ORDWR|ORCLOSE);
163 18824b58 2008-08-03 rsc if(httptofile(http, host, req, &hdr, fd) < 0){
168 18824b58 2008-08-03 rsc icacheinsert(url, &hdr, buf, fd);