int main(int argc, char **argv) { char *p; #ifdef HAVE_SETVBUF_IOLBF setvbuf(stderr, NULL, _IOLBF, BUFSIZ); #endif time(&start_time); if ((authaddr=getenv("AUTHADDR")) == NULL || *authaddr == 0) { authaddr=getenv("AUTHENTICATED"); if (authaddr == NULL || *authaddr == 0) authaddr="nobody"; } if ((remoteip=getenv("TCPREMOTEIP")) == NULL) remoteip="127.0.0.1"; if ((remoteport=getenv("TCPREMOTEPORT")) == NULL) remoteport="0"; { struct stat buf; if ( stat(".", &buf) < 0 || buf.st_mode & S_ISVTX) { fprintf(stderr, "INFO: LOCKED, user=%s, ip=[%s], port=[%s]\n", authaddr, remoteip, remoteport); printed(printf("-ERR Your account is temporarily unavailable (+t bit set on home directory).\r\n")); exit(0); } } if (argc > 1) p=argv[1]; else p=getenv("MAILDIR"); if (!p) p="./Maildir"; if (chdir(p)) { fprintf(stderr, "chdir %s: %s\n", p, strerror(errno)); printed(printf("-ERR chdir %s failed\n", p)); fflush(stdout); exit(1); } maildir_loginexec(); if (auth_getoptionenvint("disablepop3")) { printed(printf("-ERR POP3 access disabled for this account.\r\n")); fflush(stdout); exit(1); } if ( auth_getoptionenvint("disableinsecurepop3") && ((p=getenv("POP3_TLS")) == NULL || !atoi(p))) { printed(printf("-ERR POP3 access disabled via insecure connection.\r\n")); fflush(stdout); exit(1); } fprintf(stderr, "INFO: LOGIN, user=%s, ip=[%s], port=[%s]\n", authaddr, remoteip, remoteport); fflush(stderr); msglist_cnt=0; msglist_l=0; msglist_a=0; purgetmp(); maildir_getnew(".", INBOX, NULL, NULL); if (scancur()) { printed(printf("-ERR Maildir invalid (no 'cur' directory)\r\n")); return (0); } sortmsgs(); printed(printf("+OK logged in.\r\n")); fflush(stdout); loop(); return (0); }
static void do_maildir_shared_sync(const char *dir, const char *shared) { struct dbobj obj; char *dbname; char *cur; char *shared_update_name; struct stat stat1, stat2; int fd; maildir_purgetmp(dir); /* clean up after myself */ maildir_getnew(dir, 0, NULL, NULL); maildir_purgetmp(shared); maildir_getnew(shared, 0, NULL, NULL); /* Figure out if we REALLY need to sync something */ shared_update_name=malloc(strlen(dir)+sizeof("/shared-timestamp")); if (!shared_update_name) return; strcat(strcpy(shared_update_name, dir), "/shared-timestamp"); cur=malloc(strlen(shared)+sizeof("/new")); if (!cur) { free(shared_update_name); return; } if (stat(shared_update_name, &stat1) == 0) { if ( stat( strcat(strcpy(cur, shared), "/new"), &stat2) == 0 && stat2.st_mtime < stat1.st_mtime && stat( strcat(strcpy(cur, shared), "/cur"), &stat2) == 0 && stat2.st_mtime < stat1.st_mtime) { free(shared_update_name); free(cur); return; } } if ((fd=maildir_safeopen(shared_update_name, O_RDWR|O_CREAT, 0600))>= 0) { if (write(fd, "", 1) < 0) perror("write"); close(fd); } free(cur); free(shared_update_name); if (create_db(&obj, dir, &dbname)) return; if (build_db(shared, &obj)) { dbobj_close(&obj); unlink(dbname); free(dbname); return; } if ((cur=malloc(strlen(dir)+sizeof("/cur"))) == 0) { perror("malloc"); dbobj_close(&obj); unlink(dbname); free(dbname); return; } strcat(strcpy(cur, dir), "/cur"); if (update_cur(cur, shared, &obj) == 0) { strcat(strcpy(cur, dir), "/new"); if (update_cur(cur, shared, &obj) == 0) { *strrchr(cur, '/')=0; /* Chop off the /new */ newmsgs(cur, shared, &obj); } } free(cur); dbobj_close(&obj); unlink(dbname); free(dbname); }