182 lines · 2.5 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <bio.h>#include <auth.h>#include "imap4d.h" /* * reverse string [s:e) in place */voidstrrev(char *s, char *e){	int c; 	while(--e > s){		c = *s;		*s++ = *e;		*e = c;	}} intisdotdot(char *s){	return s[0] == '.' && s[1] == '.' && (s[2] == '/' || s[2] == '\0');} intissuffix(char *suf, char *s){	int n; 	n = strlen(s) - strlen(suf);	if(n < 0)		return 0;	return strcmp(s + n, suf) == 0;} intisprefix(char *pre, char *s){	return strncmp(pre, s, strlen(pre)) == 0;} intciisprefix(char *pre, char *s){	return cistrncmp(pre, s, strlen(pre)) == 0;} char*readFile(int fd){	Dir *d;	long length;	char *s; 	d = dirfstat(fd);	if(d == nil)		return nil;	length = d->length;	free(d);	s = binalloc(&parseBin, length + 1, 0);	if(s == nil || read(fd, s, length) != length)		return nil;	s[length] = '\0';	return s;} /* * create the imap tmp file. * it just happens that we don't need multiple temporary files. */intimapTmp(void){	char buf[ERRMAX], name[MboxNameLen];	int tries, fd; 	snprint(name, sizeof(name), "/mail/box/%s/mbox.tmp.imp", username);	for(tries = 0; tries < LockSecs*2; tries++){		fd = create(name, ORDWR|ORCLOSE|OCEXEC, DMEXCL|0600);		if(fd >= 0)			return fd;		errstr(buf, sizeof buf);		if(cistrstr(buf, "locked") == nil)			break;		sleep(500);	}	return -1;} /* * open a file which might be locked. * if it is, spin until available */intopenLocked(char *dir, char *file, int mode){	char buf[ERRMAX];	int tries, fd; 	for(tries = 0; tries < LockSecs*2; tries++){		fd = cdOpen(dir, file, mode);		if(fd >= 0)			return fd;		errstr(buf, sizeof buf);		if(cistrstr(buf, "locked") == nil)			break;		sleep(500);	}	return -1;} intfqid(int fd, Qid *qid){	Dir *d; 	d = dirfstat(fd);	if(d == nil)		return -1;	*qid = d->qid;	free(d);	return 0;} ulongmapInt(NamedInt *map, char *name){	int i; 	for(i = 0; map[i].name != nil; i++)		if(cistrcmp(map[i].name, name) == 0)			break;	return map[i].v;} char*estrdup(char *s){	char *t; 	t = emalloc(strlen(s) + 1);	strcpy(t, s);	return t;} void*emalloc(ulong n){	void *p; 	p = malloc(n);	if(p == nil)		bye("server out of memory");	setmalloctag(p, getcallerpc(&n));	return p;} void*ezmalloc(ulong n){	void *p; 	p = malloc(n);	if(p == nil)		bye("server out of memory");	setmalloctag(p, getcallerpc(&n));	memset(p, 0, n);	return p;} void*erealloc(void *p, ulong n){	p = realloc(p, n);	if(p == nil)		bye("server out of memory");	setrealloctag(p, getcallerpc(&p));	return p;}