xref: /plan9/sys/src/cmd/ip/imap4d/utils.c (revision 6852fd5a9e5710b0feee28fed654e00041912370)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <bio.h>
49a747e4fSDavid du Colombier #include <auth.h>
57dd7cddfSDavid du Colombier #include "imap4d.h"
67dd7cddfSDavid du Colombier 
77dd7cddfSDavid du Colombier /*
87dd7cddfSDavid du Colombier  * reverse string [s:e) in place
97dd7cddfSDavid du Colombier  */
107dd7cddfSDavid du Colombier void
strrev(char * s,char * e)117dd7cddfSDavid du Colombier strrev(char *s, char *e)
127dd7cddfSDavid du Colombier {
137dd7cddfSDavid du Colombier 	int c;
147dd7cddfSDavid du Colombier 
157dd7cddfSDavid du Colombier 	while(--e > s){
167dd7cddfSDavid du Colombier 		c = *s;
177dd7cddfSDavid du Colombier 		*s++ = *e;
187dd7cddfSDavid du Colombier 		*e = c;
197dd7cddfSDavid du Colombier 	}
207dd7cddfSDavid du Colombier }
217dd7cddfSDavid du Colombier 
227dd7cddfSDavid du Colombier int
isdotdot(char * s)237dd7cddfSDavid du Colombier isdotdot(char *s)
247dd7cddfSDavid du Colombier {
257dd7cddfSDavid du Colombier 	return s[0] == '.' && s[1] == '.' && (s[2] == '/' || s[2] == '\0');
267dd7cddfSDavid du Colombier }
277dd7cddfSDavid du Colombier 
287dd7cddfSDavid du Colombier int
issuffix(char * suf,char * s)297dd7cddfSDavid du Colombier issuffix(char *suf, char *s)
307dd7cddfSDavid du Colombier {
317dd7cddfSDavid du Colombier 	int n;
327dd7cddfSDavid du Colombier 
337dd7cddfSDavid du Colombier 	n = strlen(s) - strlen(suf);
347dd7cddfSDavid du Colombier 	if(n < 0)
357dd7cddfSDavid du Colombier 		return 0;
367dd7cddfSDavid du Colombier 	return strcmp(s + n, suf) == 0;
377dd7cddfSDavid du Colombier }
387dd7cddfSDavid du Colombier 
397dd7cddfSDavid du Colombier int
isprefix(char * pre,char * s)407dd7cddfSDavid du Colombier isprefix(char *pre, char *s)
417dd7cddfSDavid du Colombier {
427dd7cddfSDavid du Colombier 	return strncmp(pre, s, strlen(pre)) == 0;
437dd7cddfSDavid du Colombier }
447dd7cddfSDavid du Colombier 
457dd7cddfSDavid du Colombier int
ciisprefix(char * pre,char * s)467dd7cddfSDavid du Colombier ciisprefix(char *pre, char *s)
477dd7cddfSDavid du Colombier {
487dd7cddfSDavid du Colombier 	return cistrncmp(pre, s, strlen(pre)) == 0;
497dd7cddfSDavid du Colombier }
507dd7cddfSDavid du Colombier 
517dd7cddfSDavid du Colombier char*
readFile(int fd)527dd7cddfSDavid du Colombier readFile(int fd)
537dd7cddfSDavid du Colombier {
549a747e4fSDavid du Colombier 	Dir *d;
559a747e4fSDavid du Colombier 	long length;
567dd7cddfSDavid du Colombier 	char *s;
577dd7cddfSDavid du Colombier 
589a747e4fSDavid du Colombier 	d = dirfstat(fd);
599a747e4fSDavid du Colombier 	if(d == nil)
607dd7cddfSDavid du Colombier 		return nil;
619a747e4fSDavid du Colombier 	length = d->length;
629a747e4fSDavid du Colombier 	free(d);
639a747e4fSDavid du Colombier 	s = binalloc(&parseBin, length + 1, 0);
649a747e4fSDavid du Colombier 	if(s == nil || read(fd, s, length) != length)
657dd7cddfSDavid du Colombier 		return nil;
669a747e4fSDavid du Colombier 	s[length] = '\0';
677dd7cddfSDavid du Colombier 	return s;
687dd7cddfSDavid du Colombier }
697dd7cddfSDavid du Colombier 
707dd7cddfSDavid du Colombier /*
7180ee5cbfSDavid du Colombier  * create the imap tmp file.
7280ee5cbfSDavid du Colombier  * it just happens that we don't need multiple temporary files.
737dd7cddfSDavid du Colombier  */
747dd7cddfSDavid du Colombier int
imapTmp(void)757dd7cddfSDavid du Colombier imapTmp(void)
767dd7cddfSDavid du Colombier {
779a747e4fSDavid du Colombier 	char buf[ERRMAX], name[MboxNameLen];
787dd7cddfSDavid du Colombier 	int tries, fd;
797dd7cddfSDavid du Colombier 
807dd7cddfSDavid du Colombier 	snprint(name, sizeof(name), "/mail/box/%s/mbox.tmp.imp", username);
817dd7cddfSDavid du Colombier 	for(tries = 0; tries < LockSecs*2; tries++){
829a747e4fSDavid du Colombier 		fd = create(name, ORDWR|ORCLOSE|OCEXEC, DMEXCL|0600);
837dd7cddfSDavid du Colombier 		if(fd >= 0)
847dd7cddfSDavid du Colombier 			return fd;
859a747e4fSDavid du Colombier 		errstr(buf, sizeof buf);
867dd7cddfSDavid du Colombier 		if(cistrstr(buf, "locked") == nil)
877dd7cddfSDavid du Colombier 			break;
887dd7cddfSDavid du Colombier 		sleep(500);
897dd7cddfSDavid du Colombier 	}
907dd7cddfSDavid du Colombier 	return -1;
917dd7cddfSDavid du Colombier }
927dd7cddfSDavid du Colombier 
937dd7cddfSDavid du Colombier /*
947dd7cddfSDavid du Colombier  * open a file which might be locked.
957dd7cddfSDavid du Colombier  * if it is, spin until available
967dd7cddfSDavid du Colombier  */
977dd7cddfSDavid du Colombier int
openLocked(char * dir,char * file,int mode)987dd7cddfSDavid du Colombier openLocked(char *dir, char *file, int mode)
997dd7cddfSDavid du Colombier {
1009a747e4fSDavid du Colombier 	char buf[ERRMAX];
1017dd7cddfSDavid du Colombier 	int tries, fd;
1027dd7cddfSDavid du Colombier 
1037dd7cddfSDavid du Colombier 	for(tries = 0; tries < LockSecs*2; tries++){
1047dd7cddfSDavid du Colombier 		fd = cdOpen(dir, file, mode);
1057dd7cddfSDavid du Colombier 		if(fd >= 0)
1067dd7cddfSDavid du Colombier 			return fd;
1079a747e4fSDavid du Colombier 		errstr(buf, sizeof buf);
1087dd7cddfSDavid du Colombier 		if(cistrstr(buf, "locked") == nil)
1097dd7cddfSDavid du Colombier 			break;
1107dd7cddfSDavid du Colombier 		sleep(500);
1117dd7cddfSDavid du Colombier 	}
1127dd7cddfSDavid du Colombier 	return -1;
1137dd7cddfSDavid du Colombier }
1147dd7cddfSDavid du Colombier 
1159a747e4fSDavid du Colombier int
fqid(int fd,Qid * qid)1169a747e4fSDavid du Colombier fqid(int fd, Qid *qid)
1179a747e4fSDavid du Colombier {
1189a747e4fSDavid du Colombier 	Dir *d;
1199a747e4fSDavid du Colombier 
1209a747e4fSDavid du Colombier 	d = dirfstat(fd);
1219a747e4fSDavid du Colombier 	if(d == nil)
1229a747e4fSDavid du Colombier 		return -1;
1239a747e4fSDavid du Colombier 	*qid = d->qid;
1249a747e4fSDavid du Colombier 	free(d);
1259a747e4fSDavid du Colombier 	return 0;
1269a747e4fSDavid du Colombier }
1279a747e4fSDavid du Colombier 
1287dd7cddfSDavid du Colombier ulong
mapInt(NamedInt * map,char * name)1297dd7cddfSDavid du Colombier mapInt(NamedInt *map, char *name)
1307dd7cddfSDavid du Colombier {
1317dd7cddfSDavid du Colombier 	int i;
1327dd7cddfSDavid du Colombier 
1337dd7cddfSDavid du Colombier 	for(i = 0; map[i].name != nil; i++)
1347dd7cddfSDavid du Colombier 		if(cistrcmp(map[i].name, name) == 0)
1357dd7cddfSDavid du Colombier 			break;
1367dd7cddfSDavid du Colombier 	return map[i].v;
1377dd7cddfSDavid du Colombier }
1387dd7cddfSDavid du Colombier 
1397dd7cddfSDavid du Colombier char*
estrdup(char * s)1407dd7cddfSDavid du Colombier estrdup(char *s)
1417dd7cddfSDavid du Colombier {
1427dd7cddfSDavid du Colombier 	char *t;
1437dd7cddfSDavid du Colombier 
1447dd7cddfSDavid du Colombier 	t = emalloc(strlen(s) + 1);
1457dd7cddfSDavid du Colombier 	strcpy(t, s);
1467dd7cddfSDavid du Colombier 	return t;
1477dd7cddfSDavid du Colombier }
1487dd7cddfSDavid du Colombier 
1497dd7cddfSDavid du Colombier void*
emalloc(ulong n)1507dd7cddfSDavid du Colombier emalloc(ulong n)
1517dd7cddfSDavid du Colombier {
1527dd7cddfSDavid du Colombier 	void *p;
1537dd7cddfSDavid du Colombier 
1547dd7cddfSDavid du Colombier 	p = malloc(n);
1557dd7cddfSDavid du Colombier 	if(p == nil)
1567dd7cddfSDavid du Colombier 		bye("server out of memory");
157*6852fd5aSDavid du Colombier 	setmalloctag(p, getcallerpc(&n));
1587dd7cddfSDavid du Colombier 	return p;
1597dd7cddfSDavid du Colombier }
1607dd7cddfSDavid du Colombier 
1617dd7cddfSDavid du Colombier void*
ezmalloc(ulong n)1627dd7cddfSDavid du Colombier ezmalloc(ulong n)
1637dd7cddfSDavid du Colombier {
1647dd7cddfSDavid du Colombier 	void *p;
1657dd7cddfSDavid du Colombier 
1667dd7cddfSDavid du Colombier 	p = malloc(n);
1677dd7cddfSDavid du Colombier 	if(p == nil)
1687dd7cddfSDavid du Colombier 		bye("server out of memory");
169*6852fd5aSDavid du Colombier 	setmalloctag(p, getcallerpc(&n));
1707dd7cddfSDavid du Colombier 	memset(p, 0, n);
1717dd7cddfSDavid du Colombier 	return p;
1727dd7cddfSDavid du Colombier }
1737dd7cddfSDavid du Colombier 
1747dd7cddfSDavid du Colombier void*
erealloc(void * p,ulong n)1757dd7cddfSDavid du Colombier erealloc(void *p, ulong n)
1767dd7cddfSDavid du Colombier {
1777dd7cddfSDavid du Colombier 	p = realloc(p, n);
1787dd7cddfSDavid du Colombier 	if(p == nil)
1797dd7cddfSDavid du Colombier 		bye("server out of memory");
180*6852fd5aSDavid du Colombier 	setrealloctag(p, getcallerpc(&p));
1817dd7cddfSDavid du Colombier 	return p;
1827dd7cddfSDavid du Colombier }
183