diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/ip/imap4d/utils.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/ip/imap4d/utils.c')
-rwxr-xr-x | sys/src/cmd/ip/imap4d/utils.c | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/sys/src/cmd/ip/imap4d/utils.c b/sys/src/cmd/ip/imap4d/utils.c new file mode 100755 index 000000000..6e081a62e --- /dev/null +++ b/sys/src/cmd/ip/imap4d/utils.c @@ -0,0 +1,182 @@ +#include <u.h> +#include <libc.h> +#include <bio.h> +#include <auth.h> +#include "imap4d.h" + +/* + * reverse string [s:e) in place + */ +void +strrev(char *s, char *e) +{ + int c; + + while(--e > s){ + c = *s; + *s++ = *e; + *e = c; + } +} + +int +isdotdot(char *s) +{ + return s[0] == '.' && s[1] == '.' && (s[2] == '/' || s[2] == '\0'); +} + +int +issuffix(char *suf, char *s) +{ + int n; + + n = strlen(s) - strlen(suf); + if(n < 0) + return 0; + return strcmp(s + n, suf) == 0; +} + +int +isprefix(char *pre, char *s) +{ + return strncmp(pre, s, strlen(pre)) == 0; +} + +int +ciisprefix(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. + */ +int +imapTmp(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 + */ +int +openLocked(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; +} + +int +fqid(int fd, Qid *qid) +{ + Dir *d; + + d = dirfstat(fd); + if(d == nil) + return -1; + *qid = d->qid; + free(d); + return 0; +} + +ulong +mapInt(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; +} |