xref: /plan9-contrib/sys/src/cmd/ip/imap4d/utils.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1*7dd7cddfSDavid du Colombier #include <u.h>
2*7dd7cddfSDavid du Colombier #include <libc.h>
3*7dd7cddfSDavid du Colombier #include <bio.h>
4*7dd7cddfSDavid du Colombier #include "imap4d.h"
5*7dd7cddfSDavid du Colombier 
6*7dd7cddfSDavid du Colombier int
7*7dd7cddfSDavid du Colombier cistrcmp(char *s1, char *s2)
8*7dd7cddfSDavid du Colombier {
9*7dd7cddfSDavid du Colombier 	int c1, c2;
10*7dd7cddfSDavid du Colombier 
11*7dd7cddfSDavid du Colombier 	while(*s1){
12*7dd7cddfSDavid du Colombier 		c1 = *s1++;
13*7dd7cddfSDavid du Colombier 		c2 = *s2++;
14*7dd7cddfSDavid du Colombier 
15*7dd7cddfSDavid du Colombier 		if(c1 >= 'A' && c1 <= 'Z')
16*7dd7cddfSDavid du Colombier 			c1 -= 'A' - 'a';
17*7dd7cddfSDavid du Colombier 
18*7dd7cddfSDavid du Colombier 		if(c2 >= 'A' && c2 <= 'Z')
19*7dd7cddfSDavid du Colombier 			c2 -= 'A' - 'a';
20*7dd7cddfSDavid du Colombier 
21*7dd7cddfSDavid du Colombier 		if(c1 != c2)
22*7dd7cddfSDavid du Colombier 			return c1 - c2;
23*7dd7cddfSDavid du Colombier 	}
24*7dd7cddfSDavid du Colombier 	return -*s2;
25*7dd7cddfSDavid du Colombier }
26*7dd7cddfSDavid du Colombier 
27*7dd7cddfSDavid du Colombier int
28*7dd7cddfSDavid du Colombier cistrncmp(char *s1, char *s2, int n)
29*7dd7cddfSDavid du Colombier {
30*7dd7cddfSDavid du Colombier 	int c1, c2;
31*7dd7cddfSDavid du Colombier 
32*7dd7cddfSDavid du Colombier 	while(*s1 && n-- > 0){
33*7dd7cddfSDavid du Colombier 		c1 = *s1++;
34*7dd7cddfSDavid du Colombier 		c2 = *s2++;
35*7dd7cddfSDavid du Colombier 
36*7dd7cddfSDavid du Colombier 		if(c1 >= 'A' && c1 <= 'Z')
37*7dd7cddfSDavid du Colombier 			c1 -= 'A' - 'a';
38*7dd7cddfSDavid du Colombier 
39*7dd7cddfSDavid du Colombier 		if(c2 >= 'A' && c2 <= 'Z')
40*7dd7cddfSDavid du Colombier 			c2 -= 'A' - 'a';
41*7dd7cddfSDavid du Colombier 
42*7dd7cddfSDavid du Colombier 		if(c1 != c2)
43*7dd7cddfSDavid du Colombier 			return c1 - c2;
44*7dd7cddfSDavid du Colombier 	}
45*7dd7cddfSDavid du Colombier 	if(n == 0)
46*7dd7cddfSDavid du Colombier 		return 0;
47*7dd7cddfSDavid du Colombier 	return -*s2;
48*7dd7cddfSDavid du Colombier }
49*7dd7cddfSDavid du Colombier 
50*7dd7cddfSDavid du Colombier char*
51*7dd7cddfSDavid du Colombier cistrstr(char *s, char *sub)
52*7dd7cddfSDavid du Colombier {
53*7dd7cddfSDavid du Colombier 	int c, csub, n;
54*7dd7cddfSDavid du Colombier 
55*7dd7cddfSDavid du Colombier 	csub = *sub;
56*7dd7cddfSDavid du Colombier 	if(csub == '\0')
57*7dd7cddfSDavid du Colombier 		return s;
58*7dd7cddfSDavid du Colombier 	if(csub >= 'A' && csub <= 'Z')
59*7dd7cddfSDavid du Colombier 		csub -= 'A' - 'a';
60*7dd7cddfSDavid du Colombier 	sub++;
61*7dd7cddfSDavid du Colombier 	n = strlen(sub);
62*7dd7cddfSDavid du Colombier 	for(; c = *s; s++){
63*7dd7cddfSDavid du Colombier 		if(c >= 'A' && c <= 'Z')
64*7dd7cddfSDavid du Colombier 			c -= 'A' - 'a';
65*7dd7cddfSDavid du Colombier 		if(c == csub && cistrncmp(s+1, sub, n) == 0)
66*7dd7cddfSDavid du Colombier 			return s;
67*7dd7cddfSDavid du Colombier 	}
68*7dd7cddfSDavid du Colombier 	return nil;
69*7dd7cddfSDavid du Colombier }
70*7dd7cddfSDavid du Colombier 
71*7dd7cddfSDavid du Colombier /*
72*7dd7cddfSDavid du Colombier  * reverse string [s:e) in place
73*7dd7cddfSDavid du Colombier  */
74*7dd7cddfSDavid du Colombier void
75*7dd7cddfSDavid du Colombier strrev(char *s, char *e)
76*7dd7cddfSDavid du Colombier {
77*7dd7cddfSDavid du Colombier 	int c;
78*7dd7cddfSDavid du Colombier 
79*7dd7cddfSDavid du Colombier 	while(--e > s){
80*7dd7cddfSDavid du Colombier 		c = *s;
81*7dd7cddfSDavid du Colombier 		*s++ = *e;
82*7dd7cddfSDavid du Colombier 		*e = c;
83*7dd7cddfSDavid du Colombier 	}
84*7dd7cddfSDavid du Colombier }
85*7dd7cddfSDavid du Colombier 
86*7dd7cddfSDavid du Colombier int
87*7dd7cddfSDavid du Colombier isdotdot(char *s)
88*7dd7cddfSDavid du Colombier {
89*7dd7cddfSDavid du Colombier 	return s[0] == '.' && s[1] == '.' && (s[2] == '/' || s[2] == '\0');
90*7dd7cddfSDavid du Colombier }
91*7dd7cddfSDavid du Colombier 
92*7dd7cddfSDavid du Colombier int
93*7dd7cddfSDavid du Colombier issuffix(char *suf, char *s)
94*7dd7cddfSDavid du Colombier {
95*7dd7cddfSDavid du Colombier 	int n;
96*7dd7cddfSDavid du Colombier 
97*7dd7cddfSDavid du Colombier 	n = strlen(s) - strlen(suf);
98*7dd7cddfSDavid du Colombier 	if(n < 0)
99*7dd7cddfSDavid du Colombier 		return 0;
100*7dd7cddfSDavid du Colombier 	return strcmp(s + n, suf) == 0;
101*7dd7cddfSDavid du Colombier }
102*7dd7cddfSDavid du Colombier 
103*7dd7cddfSDavid du Colombier int
104*7dd7cddfSDavid du Colombier isprefix(char *pre, char *s)
105*7dd7cddfSDavid du Colombier {
106*7dd7cddfSDavid du Colombier 	return strncmp(pre, s, strlen(pre)) == 0;
107*7dd7cddfSDavid du Colombier }
108*7dd7cddfSDavid du Colombier 
109*7dd7cddfSDavid du Colombier int
110*7dd7cddfSDavid du Colombier ciisprefix(char *pre, char *s)
111*7dd7cddfSDavid du Colombier {
112*7dd7cddfSDavid du Colombier 	return cistrncmp(pre, s, strlen(pre)) == 0;
113*7dd7cddfSDavid du Colombier }
114*7dd7cddfSDavid du Colombier 
115*7dd7cddfSDavid du Colombier char*
116*7dd7cddfSDavid du Colombier readFile(int fd)
117*7dd7cddfSDavid du Colombier {
118*7dd7cddfSDavid du Colombier 	Dir d;
119*7dd7cddfSDavid du Colombier 	char *s;
120*7dd7cddfSDavid du Colombier 
121*7dd7cddfSDavid du Colombier 	if(dirfstat(fd, &d) < 0)
122*7dd7cddfSDavid du Colombier 		return nil;
123*7dd7cddfSDavid du Colombier 	s = canAlloc(&parseCan, d.length + 1, 0);
124*7dd7cddfSDavid du Colombier 	if(s == nil)
125*7dd7cddfSDavid du Colombier 		return nil;
126*7dd7cddfSDavid du Colombier 	if(read(fd, s, d.length) != d.length)
127*7dd7cddfSDavid du Colombier 		return 0;
128*7dd7cddfSDavid du Colombier 	s[d.length] = '\0';
129*7dd7cddfSDavid du Colombier 	return s;
130*7dd7cddfSDavid du Colombier }
131*7dd7cddfSDavid du Colombier 
132*7dd7cddfSDavid du Colombier /*
133*7dd7cddfSDavid du Colombier  * create the imap tmp file
134*7dd7cddfSDavid du Colombier  */
135*7dd7cddfSDavid du Colombier int
136*7dd7cddfSDavid du Colombier imapTmp(void)
137*7dd7cddfSDavid du Colombier {
138*7dd7cddfSDavid du Colombier 	char buf[ERRLEN], name[5*NAMELEN];
139*7dd7cddfSDavid du Colombier 	int tries, fd;
140*7dd7cddfSDavid du Colombier 
141*7dd7cddfSDavid du Colombier 	snprint(name, sizeof(name), "/mail/box/%s/mbox.tmp.imp", username);
142*7dd7cddfSDavid du Colombier 	for(tries = 0; tries < LockSecs*2; tries++){
143*7dd7cddfSDavid du Colombier 		fd = create(name, ORDWR|ORCLOSE|OCEXEC, CHEXCL|0600);
144*7dd7cddfSDavid du Colombier 		if(fd >= 0)
145*7dd7cddfSDavid du Colombier 			return fd;
146*7dd7cddfSDavid du Colombier 		errstr(buf);
147*7dd7cddfSDavid du Colombier 		if(cistrstr(buf, "locked") == nil)
148*7dd7cddfSDavid du Colombier 			break;
149*7dd7cddfSDavid du Colombier 		sleep(500);
150*7dd7cddfSDavid du Colombier 	}
151*7dd7cddfSDavid du Colombier 	return -1;
152*7dd7cddfSDavid du Colombier }
153*7dd7cddfSDavid du Colombier 
154*7dd7cddfSDavid du Colombier /*
155*7dd7cddfSDavid du Colombier  * open a file which might be locked.
156*7dd7cddfSDavid du Colombier  * if it is, spin until available
157*7dd7cddfSDavid du Colombier  */
158*7dd7cddfSDavid du Colombier int
159*7dd7cddfSDavid du Colombier openLocked(char *dir, char *file, int mode)
160*7dd7cddfSDavid du Colombier {
161*7dd7cddfSDavid du Colombier 	char buf[ERRLEN];
162*7dd7cddfSDavid du Colombier 	int tries, fd;
163*7dd7cddfSDavid du Colombier 
164*7dd7cddfSDavid du Colombier 	for(tries = 0; tries < LockSecs*2; tries++){
165*7dd7cddfSDavid du Colombier 		fd = cdOpen(dir, file, mode);
166*7dd7cddfSDavid du Colombier 		if(fd >= 0)
167*7dd7cddfSDavid du Colombier 			return fd;
168*7dd7cddfSDavid du Colombier 		errstr(buf);
169*7dd7cddfSDavid du Colombier 		if(cistrstr(buf, "locked") == nil)
170*7dd7cddfSDavid du Colombier 			break;
171*7dd7cddfSDavid du Colombier 		sleep(500);
172*7dd7cddfSDavid du Colombier 	}
173*7dd7cddfSDavid du Colombier 	return -1;
174*7dd7cddfSDavid du Colombier }
175*7dd7cddfSDavid du Colombier 
176*7dd7cddfSDavid du Colombier ulong
177*7dd7cddfSDavid du Colombier mapInt(NamedInt *map, char *name)
178*7dd7cddfSDavid du Colombier {
179*7dd7cddfSDavid du Colombier 	int i;
180*7dd7cddfSDavid du Colombier 
181*7dd7cddfSDavid du Colombier 	for(i = 0; map[i].name != nil; i++)
182*7dd7cddfSDavid du Colombier 		if(cistrcmp(map[i].name, name) == 0)
183*7dd7cddfSDavid du Colombier 			break;
184*7dd7cddfSDavid du Colombier 	return map[i].v;
185*7dd7cddfSDavid du Colombier }
186*7dd7cddfSDavid du Colombier 
187*7dd7cddfSDavid du Colombier char*
188*7dd7cddfSDavid du Colombier estrdup(char *s)
189*7dd7cddfSDavid du Colombier {
190*7dd7cddfSDavid du Colombier 	char *t;
191*7dd7cddfSDavid du Colombier 
192*7dd7cddfSDavid du Colombier 	t = emalloc(strlen(s) + 1);
193*7dd7cddfSDavid du Colombier 	strcpy(t, s);
194*7dd7cddfSDavid du Colombier 	return t;
195*7dd7cddfSDavid du Colombier }
196*7dd7cddfSDavid du Colombier 
197*7dd7cddfSDavid du Colombier void*
198*7dd7cddfSDavid du Colombier emalloc(ulong n)
199*7dd7cddfSDavid du Colombier {
200*7dd7cddfSDavid du Colombier 	void *p;
201*7dd7cddfSDavid du Colombier 
202*7dd7cddfSDavid du Colombier 	p = malloc(n);
203*7dd7cddfSDavid du Colombier 	if(p == nil)
204*7dd7cddfSDavid du Colombier 		bye("server out of memory");
205*7dd7cddfSDavid du Colombier 	return p;
206*7dd7cddfSDavid du Colombier }
207*7dd7cddfSDavid du Colombier 
208*7dd7cddfSDavid du Colombier void*
209*7dd7cddfSDavid du Colombier ezmalloc(ulong n)
210*7dd7cddfSDavid du Colombier {
211*7dd7cddfSDavid du Colombier 	void *p;
212*7dd7cddfSDavid du Colombier 
213*7dd7cddfSDavid du Colombier 	p = malloc(n);
214*7dd7cddfSDavid du Colombier 	if(p == nil)
215*7dd7cddfSDavid du Colombier 		bye("server out of memory");
216*7dd7cddfSDavid du Colombier 	memset(p, 0, n);
217*7dd7cddfSDavid du Colombier 	return p;
218*7dd7cddfSDavid du Colombier }
219*7dd7cddfSDavid du Colombier 
220*7dd7cddfSDavid du Colombier void*
221*7dd7cddfSDavid du Colombier erealloc(void *p, ulong n)
222*7dd7cddfSDavid du Colombier {
223*7dd7cddfSDavid du Colombier 	p = realloc(p, n);
224*7dd7cddfSDavid du Colombier 	if(p == nil)
225*7dd7cddfSDavid du Colombier 		bye("server out of memory");
226*7dd7cddfSDavid du Colombier 	return p;
227*7dd7cddfSDavid du Colombier }
228