summaryrefslogtreecommitdiff
path: root/packages/links/files/cookies-save-0.96.patch
blob: a1e35c01ca0b5d8c51c425433fc7c7c5d4302d43 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
diff -ru links-0.96/cookies.c links-0.96+cookies-save/cookies.c
--- links-0.96/cookies.c	Mon Sep  3 07:19:37 2001
+++ links-0.96+cookies-save/cookies.c	Mon Sep  3 07:18:42 2001
@@ -276,15 +276,99 @@
 
 void init_cookies(void)
 {
-	/* !!! FIXME: read cookies */
+	unsigned char in_buffer[MAX_STR_LEN];
+	unsigned char *cookfile, *p, *q;
+	FILE *fp;
+
+	/* must be called after init_home */
+	if (! links_home) return;
+	
+	cookfile = stracpy(links_home);
+	if (! cookfile) return;
+	add_to_strn(&cookfile, "cookies");
+
+	fp = fopen(cookfile, "r");
+	mem_free(cookfile);
+	if (fp == NULL) return;
+	
+	while (fgets(in_buffer, MAX_STR_LEN, fp)) {
+		struct cookie *cookie;
+		
+		if (!(cookie = mem_alloc(sizeof(struct cookie)))) return;
+		memset(cookie, 0, sizeof(struct cookie));
+		
+		q = in_buffer; p = strchr(in_buffer, ' ');
+		if (p == NULL) goto inv;
+		*p++ = '\0';
+		cookie->name = stracpy(q);
+		
+		q = p; p = strchr(p, ' ');
+		if (p == NULL) goto inv;
+		*p++ = '\0';
+		cookie->value = stracpy(q);
+		
+		q = p; p = strchr(p, ' ');
+		if (p == NULL) goto inv;
+		*p++ = '\0';
+		cookie->server = stracpy(q);
+		
+		q = p; p = strchr(p, ' ');
+		if (p == NULL) goto inv;
+		*p++ = '\0';
+		cookie->path = stracpy(q);
+		
+		q = p; p = strchr(p, ' ');
+		if (p == NULL) goto inv;
+		*p++ = '\0';
+		cookie->domain = stracpy(q);
+		
+		q = p; p = strchr(p, ' ');
+		if (p == NULL) goto inv;
+		*p++ = '\0';
+		cookie->expires = atoi(q);
+		
+		cookie->secure = atoi(p);
+		
+		cookie->id = cookie_id++;
+
+		accept_cookie(cookie);
+
+		continue;
+
+inv:
+		free_cookie(cookie);
+		free(cookie);
+	}
+	fclose(fp);
 }
 
 void cleanup_cookies(void)
 {
 	struct cookie *c;
+	unsigned char *cookfile;
+	FILE *fp;
+	
 	free_list(c_domains);
-	/* !!! FIXME: save cookies */
-	foreach (c, cookies) free_cookie(c);
+
+	cookfile = stracpy(links_home);
+	if (! cookfile) return;
+	add_to_strn(&cookfile, "cookies");
+
+	fp = fopen(cookfile, "w");
+	mem_free(cookfile);
+	if (fp == NULL) return;
+	
+	foreach (c, cookies) {
+		if (c->expires && ! cookie_expired(c))
+			fprintf(fp, "%s %s %s %s %s %d %d\n", c->name, c->value,
+			    c->server?c->server:(unsigned char *)"", c->path?c->path:(unsigned char *)"",
+			    c->domain?c->domain:(unsigned char *)"", c->expires, c->secure);
+
+		free_cookie(c);
+	}
+
+	fclose(fp);
+	
 	free_list(cookies);
 }