diff --git a/Makefile b/Makefile index 5a982ee..b131934 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ CFLAGS=-I/usr/local/include DEPS = bbs.h JAMLIB = jamlib/jamlib.a -OBJ = inih/ini.o bbs.o main.o users.o main_menu.o mail_menu.o doors.o bbs_list.o chat_system.o +OBJ = inih/ini.o bbs.o main.o users.o main_menu.o mail_menu.o doors.o bbs_list.o chat_system.o email.o %.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS) diff --git a/bbs.c b/bbs.c index 411d627..d5ca38a 100644 --- a/bbs.c +++ b/bbs.c @@ -307,8 +307,6 @@ static int handler(void* user, const char* section, const char* name, conf->ansi_path = strdup(value); } else if (strcasecmp(name, "bbs path") == 0) { conf->bbs_path = strdup(value); - } else if (strcasecmp(name, "email path") == 0) { - conf->email_path = strdup(value); } } else if (strcasecmp(section, "mail conferences") == 0) { if (conf->mail_conference_count == 0) { @@ -558,10 +556,7 @@ void display_last10_callers(int socket, struct user_record *user, int record) { void display_info(int socket) { char buffer[256]; struct utsname name; - int mailwaiting; - - mailwaiting = mail_getemailcount(gUser); - + uname(&name); sprintf(buffer, "\r\n\r\n\e[1;37mSystem Information\r\n"); diff --git a/bbs.h b/bbs.h index 6160a30..60451ce 100644 --- a/bbs.h +++ b/bbs.h @@ -82,7 +82,6 @@ struct bbs_config { char *ansi_path; char *bbs_path; - char *email_path; char *default_tagline; char *irc_server; @@ -147,12 +146,16 @@ extern void list_users(int socket, struct user_record *user); extern void main_menu(int socket, struct user_record *user); extern void mail_scan(int socket, struct user_record *user); -extern int mail_getemailcount(struct user_record *user); extern int mail_menu(int socket, struct user_record *user); +extern char *editor(int socket, struct user_record *user, char *quote, char *from); extern int door_menu(int socket, struct user_record *user); extern void bbs_list(int socket, struct user_record *user); extern void chat_system(int sock, struct user_record *user); + +extern int mail_getemailcount(struct user_record *user); +extern void send_email(int socket, struct user_record *user); +extern void list_emails(int socket, struct user_record *user); #endif diff --git a/config_default/bbs.ini b/config_default/bbs.ini index f6ffd14..f67f3e8 100644 --- a/config_default/bbs.ini +++ b/config_default/bbs.ini @@ -11,7 +11,6 @@ Default Tagline = Brought to you by Another Magicka BBS! [paths] ANSI Path = /home/andrew/MagickaBBS/ansis BBS Path = /home/andrew/MagickaBBS -Email Path = /home/andrew/MagickaBBS/msgs/email [mail conferences] Local Mail = config/localmail.ini diff --git a/email.c b/email.c new file mode 100644 index 0000000..b1668d9 --- /dev/null +++ b/email.c @@ -0,0 +1,381 @@ +#include +#include +#include +#include +#include +#include +#include "bbs.h" + +extern struct bbs_config conf; + +void send_email(int socket, struct user_record *user) { + char buffer[256]; + sqlite3 *db; + sqlite3_stmt *res; + int rc; + char *recipient; + char *subject; + char *msg; + char *csql = "CREATE TABLE IF NOT EXISTS email (" + "id INTEGER PRIMARY KEY," + "sender TEXT COLLATE NOCASE," + "recipient TEXT COLLATE NOCASE," + "subject TEXT," + "body TEXT," + "date INTEGER," + "seen INTEGER);"; + char *isql = "INSERT INTO email (sender, recipient, subject, body, date, seen) VALUES(?, ?, ?, ?, ?, 0)"; + char *err_msg = 0; + + s_putstring(socket, "\r\nTO: "); + s_readstring(socket, buffer, 16); + + if (strlen(buffer) == 0) { + s_putstring(socket, "\r\nAborted\r\n"); + return; + } + if (check_user(buffer)) { + s_putstring(socket, "\r\n\r\nInvalid Username\r\n"); + return; + } + + recipient = strdup(buffer); + s_putstring(socket, "\r\nSUBJECT: "); + s_readstring(socket, buffer, 25); + if (strlen(buffer) == 0) { + free(recipient); + s_putstring(socket, "\r\nAborted\r\n"); + return; + } + subject = strdup(buffer); + + // post a message + msg = editor(socket, user, NULL, NULL); + + if (msg != NULL) { + sprintf(buffer, "%s/email.sq3", conf.bbs_path); + + rc = sqlite3_open(buffer, &db); + if (rc != SQLITE_OK) { + fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db)); + sqlite3_close(db); + + exit(1); + } + + + rc = sqlite3_exec(db, csql, 0, 0, &err_msg); + if (rc != SQLITE_OK ) { + + fprintf(stderr, "SQL error: %s\n", err_msg); + + sqlite3_free(err_msg); + sqlite3_close(db); + + return; + } + + rc = sqlite3_prepare_v2(db, isql, -1, &res, 0); + + if (rc == SQLITE_OK) { + sqlite3_bind_text(res, 1, user->loginname, -1, 0); + sqlite3_bind_text(res, 2, recipient, -1, 0); + sqlite3_bind_text(res, 3, subject, -1, 0); + sqlite3_bind_text(res, 4, msg, -1, 0); + sqlite3_bind_int(res, 5, time(NULL)); + } else { + fprintf(stderr, "Failed to execute statement: %s\n", sqlite3_errmsg(db)); + sqlite3_finalize(res); + sqlite3_close(db); + s_putstring(socket, "\r\nNo such email\r\n"); + return; + } + sqlite3_step(res); + + sqlite3_finalize(res); + sqlite3_close(db); + free(msg); + } + free(subject); + free(recipient); +} + +void show_email(int socket, struct user_record *user, int msgno) { + char buffer[256]; + sqlite3 *db; + sqlite3_stmt *res; + int rc; + char *sql = "SELECT id,sender,subject,body,date FROM email WHERE recipient LIKE ? LIMIT ?, 1"; + char *dsql = "DELETE FROM email WHERE id=?"; + char *isql = "INSERT INTO email (sender, recipient, subject, body, date, seen) VALUES(?, ?, ?, ?, ?, 0)"; + int id; + char *sender; + char *subject; + char *body; + time_t date; + struct tm msg_date; + int z; + int lines; + char c; + char *replybody; + + sprintf(buffer, "%s/email.sq3", conf.bbs_path); + + rc = sqlite3_open(buffer, &db); + if (rc != SQLITE_OK) { + fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db)); + sqlite3_close(db); + + exit(1); + } + rc = sqlite3_prepare_v2(db, sql, -1, &res, 0); + + if (rc == SQLITE_OK) { + sqlite3_bind_text(res, 1, user->loginname, -1, 0); + sqlite3_bind_int(res, 2, msgno); + } else { + fprintf(stderr, "Failed to execute statement: %s\n", sqlite3_errmsg(db)); + sqlite3_finalize(res); + sqlite3_close(db); + s_putstring(socket, "\r\nNo such email\r\n"); + return; + } + if (sqlite3_step(res) == SQLITE_ROW) { + id = sqlite3_column_int(res, 0); + sender = strdup((char *)sqlite3_column_text(res, 1)); + subject = strdup((char *)sqlite3_column_text(res, 2)); + body = strdup((char *)sqlite3_column_text(res, 3)); + date = (time_t)sqlite3_column_int(res, 4); + + + sprintf(buffer, "\e[2J\e[1;32mFrom : \e[1;37m%s\r\n", sender); + s_putstring(socket, buffer); + sprintf(buffer, "\e[1;32mSubject : \e[1;37m%s\r\n", subject); + s_putstring(socket, buffer); + localtime_r(&date, &msg_date); + sprintf(buffer, "\e[1;32mDate : \e[1;37m%s", asctime(&msg_date)); + buffer[strlen(buffer) - 1] = '\0'; + strcat(buffer, "\r\n"); + s_putstring(socket, buffer); + s_putstring(socket, "\e[1;30m-------------------------------------------------------------------------------\e[0m\r\n"); + + lines = 0; + + for (z=0;zloginname, -1, 0); + sqlite3_bind_text(res, 2, sender, -1, 0); + sqlite3_bind_text(res, 3, subject, -1, 0); + sqlite3_bind_text(res, 4, replybody, -1, 0); + sqlite3_bind_int(res, 5, time(NULL)); + } else { + fprintf(stderr, "Failed to execute statement: %s\n", sqlite3_errmsg(db)); + sqlite3_finalize(res); + sqlite3_close(db); + s_putstring(socket, "\r\nNo such email\r\n"); + return; + } + sqlite3_step(res); + + sqlite3_finalize(res); + free(replybody); + } + free(sender); + free(subject); + free(body); + sqlite3_close(db); + } else if (tolower(c) == 'd') { + free(sender); + free(subject); + free(body); + + rc = sqlite3_prepare_v2(db, dsql, -1, &res, 0); + + if (rc == SQLITE_OK) { + sqlite3_bind_int(res, 1, id); + } else { + fprintf(stderr, "Failed to execute statement: %s\n", sqlite3_errmsg(db)); + sqlite3_finalize(res); + sqlite3_close(db); + s_putstring(socket, "\r\nNo such email\r\n"); + return; + } + sqlite3_step(res); + + sqlite3_finalize(res); + sqlite3_close(db); + } + + } else { + printf("Failed\n"); + sqlite3_finalize(res); + sqlite3_close(db); + } +} + +void list_emails(int socket, struct user_record *user) { + char buffer[256]; + sqlite3 *db; + sqlite3_stmt *res; + int rc; + char *sql = "SELECT sender,subject,seen,date FROM email WHERE recipient LIKE ?"; + char *subject; + char *from; + char *to; + char *body; + time_t date; + int seen; + int msgid; + int msgtoread; + struct tm msg_date; + + sprintf(buffer, "%s/email.sq3", conf.bbs_path); + + rc = sqlite3_open(buffer, &db); + if (rc != SQLITE_OK) { + fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db)); + sqlite3_close(db); + + exit(1); + } + rc = sqlite3_prepare_v2(db, sql, -1, &res, 0); + + if (rc == SQLITE_OK) { + sqlite3_bind_text(res, 1, user->loginname, -1, 0); + } else { + fprintf(stderr, "Failed to execute statement: %s\n", sqlite3_errmsg(db)); + sqlite3_finalize(res); + sqlite3_close(db); + s_putstring(socket, "\r\nYou have no email\r\n"); + return; + } + + msgid = 0; + + while (sqlite3_step(res) == SQLITE_ROW) { + from = strdup((char *)sqlite3_column_text(res, 0)); + subject = strdup((char *)sqlite3_column_text(res, 1)); + seen = sqlite3_column_int(res, 2); + date = (time_t)sqlite3_column_int(res, 3); + localtime_r(&date, &msg_date); + if (seen == 0) { + sprintf(buffer, "\e[1;30m[\e[1;34m%4d\e[1;30m]\e[1;32m*\e[1;37m%-39.39s \e[1;32m%-16.16s \e[1;35m%02d:%02d %02d-%02d-%02d\e[0m\r\n", msgid, subject, from, msg_date.tm_hour, msg_date.tm_min, msg_date.tm_mday, msg_date.tm_mon + 1, msg_date.tm_year - 100); + } else { + sprintf(buffer, "\e[1;30m[\e[1;34m%4d\e[1;30m] \e[1;37m%-39.39s \e[1;32m%-16.16s \e[1;35m%02d:%02d %02d-%02d-%02d\e[0m\r\n", msgid, subject, from, msg_date.tm_hour, msg_date.tm_min, msg_date.tm_mday, msg_date.tm_mon + 1, msg_date.tm_year - 100); + } + s_putstring(socket, buffer); + + free(from); + free(subject); + + if (msgid % 22 && msgid != 0) { + s_putstring(socket, "Enter # to read, Q to quit or Enter to continue\r\n"); + + s_readstring(socket, buffer, 5); + if (strlen(buffer) > 0) { + if (tolower(buffer[0]) == 'q') { + sqlite3_finalize(res); + sqlite3_close(db); + return; + } else { + msgtoread = atoi(buffer); + sqlite3_finalize(res); + sqlite3_close(db); + show_email(socket, user, msgtoread); + return; + } + } + + } + + msgid++; + } + if (msgid == 0) { + s_putstring(socket, "\r\nYou have no email\r\n"); + } else { + s_putstring(socket, "Enter # to read, or Enter to quit\r\n"); + s_readstring(socket, buffer, 5); + if (strlen(buffer) > 0) { + msgtoread = atoi(buffer); + sqlite3_finalize(res); + sqlite3_close(db); + show_email(socket, user, msgtoread); + return; + } + + } + sqlite3_finalize(res); + sqlite3_close(db); +} + + +int mail_getemailcount(struct user_record *user) { + char *sql = "SELECT COUNT(*) FROM email WHERE recipient LIKE ?"; + int count; + char buffer[256]; + sqlite3 *db; + sqlite3_stmt *res; + int rc; + + sprintf(buffer, "%s/email.sq3", conf.bbs_path); + + rc = sqlite3_open(buffer, &db); + if (rc != SQLITE_OK) { + fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db)); + sqlite3_close(db); + + exit(1); + } + rc = sqlite3_prepare_v2(db, sql, -1, &res, 0); + + if (rc == SQLITE_OK) { + sqlite3_bind_text(res, 1, user->loginname, -1, 0); + } else { + fprintf(stderr, "Failed to execute statement: %s\n", sqlite3_errmsg(db)); + sqlite3_finalize(res); + sqlite3_close(db); + return 0; + } + + count = 0; + + if (sqlite3_step(res) == SQLITE_ROW) { + count = sqlite3_column_int(res, 0); + } + + sqlite3_finalize(res); + sqlite3_close(db); + + return count; +} diff --git a/mail_menu.c b/mail_menu.c index 3386fc3..dbe106c 100644 --- a/mail_menu.c +++ b/mail_menu.c @@ -1293,380 +1293,14 @@ int mail_menu(int socket, struct user_record *user) { break; case 'e': { - s_putstring(socket, "\r\nTO: "); - s_readstring(socket, buffer, 16); - - if (strlen(buffer) == 0) { - s_putstring(socket, "\r\nAborted\r\n"); - break; - } - if (check_user(buffer)) { - s_putstring(socket, "\r\n\r\nInvalid Username\r\n"); - break; - } - - to = strdup(buffer); - s_putstring(socket, "\r\nSUBJECT: "); - s_readstring(socket, buffer, 25); - if (strlen(buffer) == 0) { - free(to); - s_putstring(socket, "\r\nAborted\r\n"); - break; - } - subject = strdup(buffer); - - // post a message - msg = editor(socket, user, NULL, NULL); - - if (msg != NULL) { - jb = open_jam_base(conf.email_path); - if (!jb) { - printf("Error opening JAM base.. %s\n", conf.email_path); - free(msg); - free(to); - free(subject); - break; - } - - JAM_ClearMsgHeader( &jmh ); - jmh.DateWritten = (uint32_t)time(NULL); - jmh.Attribute |= MSG_PRIVATE; - - strcpy(buffer, user->loginname); - - jsp = JAM_NewSubPacket(); - jsf.LoID = JAMSFLD_SENDERNAME; - jsf.HiID = 0; - jsf.DatLen = strlen(buffer); - jsf.Buffer = (char *)buffer; - JAM_PutSubfield(jsp, &jsf); - - jsf.LoID = JAMSFLD_RECVRNAME; - jsf.HiID = 0; - jsf.DatLen = strlen(to); - jsf.Buffer = (char *)to; - JAM_PutSubfield(jsp, &jsf); - - jsf.LoID = JAMSFLD_SUBJECT; - jsf.HiID = 0; - jsf.DatLen = strlen(subject); - jsf.Buffer = (char *)subject; - JAM_PutSubfield(jsp, &jsf); - - - - - - while (1) { - z = JAM_LockMB(jb, 100); - if (z == 0) { - break; - } else if (z == JAM_LOCK_FAILED) { - sleep(1); - } else { - free(msg); - free(to); - free(subject); - printf("Failed to lock msg base!\n"); - break; - } - } - if (z != 0) { - JAM_CloseMB(jb); - break; - } - - if (JAM_AddMessage(jb, &jmh, jsp, (char *)msg, strlen(msg))) { - printf("Failed to add message\n"); - } - - JAM_UnlockMB(jb); - - JAM_DelSubPacket(jsp); - free(msg); - JAM_CloseMB(jb); - } - free(to); - free(subject); - + send_email(socket, user); } break; case 'r': { // Read your email... s_putstring(socket, "\r\n"); - // list mail in message base - jb = open_jam_base(conf.email_path); - if (!jb) { - printf("Error opening JAM base.. %s\n", conf.mail_conferences[user->cur_mail_conf]->mail_areas[user->cur_mail_area]->path); - break; - } else { - jam_crc = JAM_Crc32((char *)user->loginname, strlen(user->loginname)); - lastmsg = 0; - while (JAM_FindUser(jb, jam_crc, lastmsg, &currmsg) == 0) { - if (JAM_ReadMsgHeader(jb, currmsg, &jmh, &jsp) != 0) { - lastmsg = currmsg + 1; - continue; - } - - if (jmh.Attribute & MSG_DELETED) { - JAM_DelSubPacket(jsp); - lastmsg = currmsg + 1; - continue; - } - - if (jmh.Attribute & MSG_NODISP) { - JAM_DelSubPacket(jsp); - lastmsg = currmsg + 1; - continue; - } - subject = NULL; - from = NULL; - - for (z=0;zNumFields;z++) { - if (jsp->Fields[z]->LoID == JAMSFLD_SUBJECT) { - subject = (char *)malloc(jsp->Fields[z]->DatLen + 1); - memset(subject, 0, jsp->Fields[z]->DatLen + 1); - memcpy(subject, jsp->Fields[z]->Buffer, jsp->Fields[z]->DatLen); - } - if (jsp->Fields[z]->LoID == JAMSFLD_SENDERNAME) { - from = (char *)malloc(jsp->Fields[z]->DatLen + 1); - memset(from, 0, jsp->Fields[z]->DatLen + 1); - memcpy(from, jsp->Fields[z]->Buffer, jsp->Fields[z]->DatLen); - } - } - sprintf(buffer, "[%3d]. %s From %s\r\n", currmsg, subject, from); - if (subject != NULL) { - free(subject); - } - if (from != NULL) { - free(from); - } - s_putstring(socket, buffer); - JAM_DelSubPacket(jsp); - lastmsg = currmsg + 1; - } - - if (lastmsg == 0) { - s_putstring(socket, "\r\nYou have no mail...\r\n"); - JAM_CloseMB(jb); - } else { - s_putstring(socket, "(#) View Message\r\n"); - s_readstring(socket, buffer, 5); - currmsg = atoi(buffer); - - if (JAM_ReadMsgHeader(jb, currmsg, &jmh, &jsp) != 0) { - JAM_CloseMB(jb); - break; - } - - if (jmh.Attribute & MSG_DELETED) { - JAM_DelSubPacket(jsp); - JAM_CloseMB(jb); - break; - } - - if (jmh.Attribute & MSG_NODISP) { - JAM_DelSubPacket(jsp); - JAM_CloseMB(jb); - break; - } - subject = NULL; - from = NULL; - to = NULL; - - for (z=0;zNumFields;z++) { - if (jsp->Fields[z]->LoID == JAMSFLD_SUBJECT) { - subject = (char *)malloc(jsp->Fields[z]->DatLen + 1); - memset(subject, 0, jsp->Fields[z]->DatLen + 1); - memcpy(subject, jsp->Fields[z]->Buffer, jsp->Fields[z]->DatLen); - } - if (jsp->Fields[z]->LoID == JAMSFLD_SENDERNAME) { - from = (char *)malloc(jsp->Fields[z]->DatLen + 1); - memset(from, 0, jsp->Fields[z]->DatLen + 1); - memcpy(from, jsp->Fields[z]->Buffer, jsp->Fields[z]->DatLen); - } - if (jsp->Fields[z]->LoID == JAMSFLD_RECVRNAME) { - to = (char *)malloc(jsp->Fields[z]->DatLen + 1); - memset(to, 0, jsp->Fields[z]->DatLen + 1); - memcpy(to, jsp->Fields[z]->Buffer, jsp->Fields[z]->DatLen); - } - } - - if (strcasecmp(from, user->loginname) == 0) { - sprintf(buffer, "\e[2J\e[1;32mFrom : \e[1;37m%s\r\n", from); - s_putstring(socket, buffer); - sprintf(buffer, "\e[1;32mTo : \e[1;37m%s\r\n", to); - s_putstring(socket, buffer); - sprintf(buffer, "\e[1;32mSubject : \e[1;37m%s\r\n", subject); - s_putstring(socket, buffer); - localtime_r((time_t *)&jmh.DateWritten, &msg_date); - sprintf(buffer, "\e[1;32mDate : \e[1;37m%s", asctime(&msg_date)); - buffer[strlen(buffer) - 1] = '\0'; - strcat(buffer, "\r\n"); - s_putstring(socket, buffer); - s_putstring(socket, "\e[1;30m-------------------------------------------------------------------------------\e[0m\r\n"); - body = (char *)malloc(jmh.TxtLen); - - JAM_ReadMsgText(jb, jmh.TxtOffset, jmh.TxtLen, (char *)body); - - JAM_CloseMB(jb); - - lines = 0; - - for (z=0;zloginname) + 1); - strcpy(from, user->loginname); - - if (to != NULL) { - free(to); - } - to = (char *)malloc(strlen(buffer) + 1); - strcpy(to, buffer); - - replybody = editor(socket, user, body, to); - - if (replybody != NULL) { - jb = open_jam_base(conf.email_path); - if (!jb) { - printf("Error opening JAM base.. %s\n", conf.email_path); - free(replybody); - free(body); - free(subject); - free(to); - free(from); - break; - } - - JAM_ClearMsgHeader( &jmh ); - jmh.DateWritten = (uint32_t)time(NULL); - jmh.Attribute |= MSG_PRIVATE; - - jsp = JAM_NewSubPacket(); - jsf.LoID = JAMSFLD_SENDERNAME; - jsf.HiID = 0; - jsf.DatLen = strlen(from); - jsf.Buffer = (char *)from; - JAM_PutSubfield(jsp, &jsf); - - jsf.LoID = JAMSFLD_RECVRNAME; - jsf.HiID = 0; - jsf.DatLen = strlen(to); - jsf.Buffer = (char *)to; - JAM_PutSubfield(jsp, &jsf); - - jsf.LoID = JAMSFLD_SUBJECT; - jsf.HiID = 0; - jsf.DatLen = strlen(subject); - jsf.Buffer = (char *)subject; - JAM_PutSubfield(jsp, &jsf); - - free(body); - free(subject); - free(to); - free(from); - - while (1) { - z = JAM_LockMB(jb, 100); - if (z == 0) { - break; - } else if (z == JAM_LOCK_FAILED) { - sleep(1); - } else { - free(replybody); - printf("Failed to lock msg base!\n"); - break; - } - } - - if (z != 0) { - break; - } - - if (JAM_AddMessage(jb, &jmh, jsp, (char *)replybody, strlen(replybody))) { - printf("Failed to add message\n"); - } - - JAM_UnlockMB(jb); - - JAM_DelSubPacket(jsp); - free(replybody); - JAM_CloseMB(jb); - } - } else if (tolower(c) == 'd') { - jb = open_jam_base(conf.email_path); - if (!jb) { - printf("Error opening JAM base.. %s\n", conf.email_path); - free(body); - free(subject); - free(to); - free(from); - break; - } - - while (1) { - z = JAM_LockMB(jb, 100); - if (z == 0) { - break; - } else if (z == JAM_LOCK_FAILED) { - sleep(1); - } else { - free(body); - free(subject); - free(to); - free(from); - printf("Failed to lock msg base!\n"); - break; - } - } - if (z != 0) { - break; - } - - JAM_DeleteMessage(jb, currmsg); - JAM_UnlockMB(jb); - JAM_CloseMB(jb); - free(body); - free(subject); - free(to); - free(from); - } - - } else { - s_putstring(socket, "\r\nInvalid E-Mail\r\n"); - JAM_CloseMB(jb); - } - } - } + list_emails(socket, user); } break; case '}': @@ -1787,42 +1421,4 @@ void mail_scan(int socket, struct user_record *user) { } } -int mail_getemailcount(struct user_record *user) { - s_JamBase *jb; - s_JamBaseHeader jbh; - s_JamMsgHeader jmh; - s_JamSubPacket* jsp; - s_JamSubfield jsf; - uint32_t jam_crc; - uint32_t lastmsg, currmsg; - - int msg_count = 0; - - jb = open_jam_base(conf.email_path); - if (!jb) { - printf("Error opening JAM base.. %s\n", conf.mail_conferences[user->cur_mail_conf]->mail_areas[user->cur_mail_area]->path); - } else { - jam_crc = JAM_Crc32((char *)user->loginname, strlen(user->loginname)); - lastmsg = 0; - while (JAM_FindUser(jb, jam_crc, lastmsg, &currmsg) == 0) { - if (JAM_ReadMsgHeader(jb, currmsg, &jmh, &jsp) != 0) { - continue; - } - - if (jmh.Attribute & MSG_DELETED) { - JAM_DelSubPacket(jsp); - continue; - } - if (jmh.Attribute & MSG_NODISP) { - JAM_DelSubPacket(jsp); - continue; - } - JAM_DelSubPacket(jsp); - msg_count++; - lastmsg = currmsg + 1; - } - JAM_CloseMB(jb); - } - return msg_count; -}