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