summaryrefslogtreecommitdiff
path: root/sys/src/cmd/ip/imap4d/utils.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /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-xsys/src/cmd/ip/imap4d/utils.c182
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;
+}