/* bbscfile.c */ /* #define DEBUG 1 */ #include "bbscdef.h" #include #include /* For compatibility */ #include #define LASTDATE " 04/21/90 " #define PGMNAME "BBSCFILE " #define VERSION " 7.92 " extern int user_priv; static char bufmsg0[MSG1MAX+1], buftmp[MSGSECT+256], this1[11], next1[11]; hdrwrt() /* write the header from memory variables */ { /* header is a 1 record file */ int fd; int fd1; strcpy(who_am_i, m_pathname); strcat(who_am_i, HEADER); if ((fd = open(who_am_i,WRITE,0666)) < 0) /* open i/o */ { portsout("Can't open header-file, will create it!") ; portsout(CRLF) ; if ((fd = creat(who_am_i,0666)) < 0) { portsout("Can't create header-file, aborting!") ; portsout(CRLF) ; return(ERROR) ; } } lseek(fd, 0L, 0); locking(fd, LK_LOCK, 0L); strcpy(who_am_i, m_pathname); strcat(who_am_i, CROSSREF); if ((fd1 = open(who_am_i,WRITE,0666)) < 0) { portsout("Can't open xref file, will create it!"); portsout(CRLF) ; if ((fd1 = creat(who_am_i,0666)) < 0) { portsout(" XREF creation error! -- abort!"); portsout(CRLF); return(ERROR) ; } } lseek(fd1, 0L, 0); locking(fd1, LK_LOCK, 0L); itoa(h_next_msg,h_next) ; /* convert int to char */ itoa(h_act_msg,h_act) ; strfill(buf128,26,MSGSECT) ; /* init buf128 to all hex 1a */ sprintf(buf128,"%s~%s~%s~", /* build record */ h_next_msg, h_act_msg, h_date) ; write(fd,buf128,MSGSECT) ; /* write it */ lseek(fd, 0L, 0); locking(fd, LK_UNLCK, 0L); close(fd) ; /* no need to leave it open */ write(fd1,xtable,4000); lseek(fd1, 0L, 0); locking(fd1, LK_UNLCK, 0L); close(fd1) ; return(OK) ; } hdrread() /* read the header file into memory */ { int fd, i, cnt1, cnt; strcpy(who_am_i, m_pathname); strcat(who_am_i, HEADER); if ((fd = open(who_am_i,READ,0666)) < 0) /* open input */ { portsout("Can't open header-file, using inital values!") ; portsout(CRLF) ; h_next = 1 ; h_next_msg[0] = '1' ; h_next_msg[1] = 0 ; h_act = 1 ; h_act_msg[0] = '1' ; h_act_msg[1] = 0 ; h_date[0] = '0' ; h_date[1] = 0 ; hdrwrt() ; goto next; } lseek(fd, 0L, 0); locking(fd, LK_LOCK, 0L); if((cnt=read(fd,buf128,MSGSECT)) != MSGSECT) { portsout(CRLF) ; portsout("<<< header read error >>>") ; portsout(CRLF) ; return(ERROR) ; } cnt = sscanf(buf128,"%[^~]~%[^~]~%[^~]~", h_next_msg, h_act_msg, h_date) ; next: lseek(fd, 0L, 0); locking(fd, LK_UNLCK, 0L); close(fd) ; /* no need to leave it open */ strcpy(who_am_i, m_pathname); strcat(who_am_i, CROSSREF); if ((fd = open(who_am_i,READ,0666)) < 0) { portsout("Can't open xref file --- setting values!"); portsout(CRLF); xtable[0] = 1L; for (i = 1; i <= 999; i++) xtable[i] = 0L; return ; } lseek(fd, 0L, 0); locking(fd, LK_LOCK, 0L); if ((cnt1=read(fd, xtable, 4000)) != 4000) { portsout(CRLF) ; portsout("<<< xref read error >>>"); portsout(CRLF); return(ERROR); } lseek(fd, 0L, 0); locking(fd, LK_UNLCK, 0L); close (fd); /* if (cnt != 2) { return(ERROR) ; } */ h_next = atoi(h_next_msg) ; h_act = atoi(h_act_msg) ; return(OK) ; } msgopen(how) int how ; /* how to open 0=input, 1=output, 2=i/o */ { int fd ; strcpy(who_am_i, m_pathname); strcat(who_am_i, MESSAGES); if ((fd = open(who_am_i,how,0666)) < 0) /* open i/o */ { portsout("can't open message-file, will create it!") ; portsout(CRLF) ; if ((fd = creat(who_am_i,0666)) < 0) { portsout("can't create message-file, aborting!") ; portsout(CRLF) ; return(ERROR) ; } } lseek(fd, 0L, 0); locking(fd, LK_RLCK, 0L); return(fd) ; } msgclose(fd) int fd ; { lseek(fd, 0L, 0); locking(fd, LK_UNLCK, 0L); return(close(fd)) ; } msgwrt(fd) /* write the message file from memory variables */ int fd; /* writes a message starting with the h_next msg # */ { int rc, /* return code */ cnt1, cnt2, len; rc = cnt1 = len = cnt2 = 0 ; itoa(this1,h_next) ; /* convert int to char */ xtable[h_act - 1] = h_next; for( len=h_act; len < 1000; len++) xtable[len] = 0L; /* guarantee clean table */ h_act++; rc = seek(fd,h_next - 1,0) ; /* seek next available sector */ h_next++ ; itoa(next1,h_next) ; strfill(buf128,0,MSGSECT) ; /* init buf128 to all hex 00 */ /* * build first piece of msg record */ sprintf(buf128,"%-10s~%-10s~%-2s~%-9s~%-15s~%-21s~%-21s~%-11s~%-21s~", this1, /* this rcd # */ next1, /* points next rcd # */ msg_delete, /* delete byte */ msg_date, msg_time, msg_to, msg_from, msg_pass, msg_subject); rc = write(fd,buf128,MSGSECT); /* write the first 128 byte record */ /* for a message record */ /* * build the n+1 piece of msg record */ len = (strlen(msg_text) / MSG1MAX) + 1; /* calc how many more 128 */ /* byte records to write */ cnt2 = 1 ; /* init for substr */ while (len--) { itoa(this1,h_next); /* calc/convert record #'s */ h_next++; if (len == 0) { strcpy(next1,"0"); /* marks last 128 byte piece */ } /* of a msg */ else { itoa(next1,h_next); } strfill(bufmsg0,0,MSG1MAX); substr(msg_text,bufmsg0,cnt2,MSG1MAX); /* mv MSG1MAX to buff */ cnt2 += MSG1MAX; /* up cnt2 by MSG1MAX */ strfill(buf128,0,MSGSECT); /* init buf128 to all hex 00 */ sprintf(buf128,"%-10s~%-10s~%-2s~%-102s~", this1, /* this rcd # */ next1, /* point to next rcd # */ msg_delete, /* delete byte */ bufmsg0); /* piece of msg */ rc = write(fd,buf128,MSGSECT); /* write n+1 128 byte record */ } strfill(buf128,26,MSGSECT); /* fill with all hex 1a */ rc = write(fd,buf128,MSGSECT); /* write all hex 1a 128 byte record */ return(OK); } msgrewrt(fd,r_msg) /* re-write the message file from memory variables */ int fd, /* re-writes only the 1st part of a message */ r_msg; /* used to update the delete byte */ { int rc, /* return code */ cnt1, file_size; rc = cnt1 = 0; if (r_msg > h_next) /* don't try to seek past end of file */ { return(ERROR); } if ((rc = seek(fd,r_msg-1,0)) == ERROR) /* seek to requested sector */ { return(ERROR); } itoa(this1,r_msg); /* convert int to char */ r_msg++; itoa(next1,r_msg); strfill(buf128,0,MSGSECT); /* init buf128 to all hex 00 */ /* * build first piece of msg record */ sprintf(buf128,"%-10s~%-10s~%-2s~%-9s~%-15s~%-21s~%-21s~%-11s~%-21s~", this1, /* this rcd # */ next1, /* points next rcd # */ msg_delete, /* delete byte */ msg_date, msg_time, msg_to, msg_from, msg_pass, msg_subject); rc = write(fd,buf128,MSGSECT); /* write the first 128 byte record */ /* for a message record */ return(OK); } msgread(fd,msgno) /* read message number requested */ int fd, /* returns ERROR if msg past eof */ msgno; /* returns 0 if msg is not 1st piece */ /* of a message */ /* returns 0 if msg is deleted */ /* returns msg # if successful */ { int rc, /* return code */ msgac, cnt1, cnt2, len, next, ret_this, file_size; char act[11]; msgac = xtable[msgno - 1]; if (msgac > h_next) /* don't try to seek past end of file */ { return(ERROR); } if (msgac == 0) { return(ERROR); } if ((rc = seek(fd,msgac-1,0)) == ERROR) { portsout(CRLF) ; portsout("Can't seek on message-file!") ; portsout(CRLF) ; return(ERROR); /* when cant find it */ } if (read(fd,buf128,MSGSECT) != MSGSECT) /* read 128 byte sector */ { portsout(CRLF) ; portsout("Can't read in message-file!") ; portsout(CRLF) ; return(ERROR); } /* * get first piece of msg record */ /* do trial read, since if not first record, fields might overflow */ rc = sscanf(buf128,"%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~", buftmp,buftmp,buftmp,buftmp,buftmp,buftmp,buftmp,buftmp,buftmp) ; if (rc != 9) /* makes sure we read the 1st piece */ { /* of a message and not in the middle */ return(0); /* 0 when is not the msg header */ } /* now do the real read since looks like is a good record */ rc = sscanf(buf128,"%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~", this1, /* this rcd # */ next1, /* points to next rcd # */ msg_delete, /* delete byte */ msg_date, msg_time, msg_to, msg_from, msg_pass, msg_subject); if (rc != 9) /* makes sure we read the 1st piece */ { /* of a message and not in the middle */ return(0); /* 0 when is not the msg header */ } if (msg_delete[0] == '9') /* check for deleted messages */ { /* if so, return as if not found */ return(0); } ret_this = atoi(this1); /* return this msg no. */ next = atoi(next1); itoa(act,msgno); strcpy(msg_no,act); if(msg_delete[0] == '5') { strcat(msg_no,"*"); strcpy(msg_subject,"< Private Msg >"); } msg_text[0] = '\0'; while (next) /* read until no more pieces for */ { /* this message */ if (read(fd,buf128,MSGSECT) != MSGSECT) /* read next sector */ { portsout(CRLF) ; portsout("Can't read in message-file(2)!") ; portsout(CRLF) ; return(ERROR); } strfill(bufmsg0,0,MSG1MAX); /* init bufmsg0 to all hex 00 */ rc = sscanf(buf128,"%[^~]~%[^~]~%[^~]~%[^~]~", this1, /* this rcd # */ next1, /* point to next rcd # */ msg_delete, /* delete byte */ bufmsg0); /* piece of msg */ next = atoi(next1); strcat(msg_text,bufmsg0); /* tag piece of msg to */ /* whole msg array */ } return(ret_this); /* if all ok, return the msg no. found */ } msgreadx(fd,msgno) /* read message number requested */ int fd, /* returns ERROR if msg past eof */ msgno; /* returns 0 if msg is not 1st piece */ /* of a message */ /* returns 0 if msg is deleted */ /* returns msg # if successful */ { int rc, /* return code */ msgac, cnt1, cnt2, len, next, ret_this, t1, t2, t3, file_size; char who_am_i[99], who_am_I[99], sysop[99], Sysop[99], act[11]; msgac = xtable[msgno - 1]; if (msgac > h_next) /* don't try to seek past end of file */ { return(ERROR); } if (msgac == 0) { return(ERROR); } if ((rc = seek(fd,msgac-1,0)) == ERROR) { portsout(CRLF) ; portsout("Can't seek on message-file!") ; portsout(CRLF) ; return(ERROR); /* when cant find it */ } if (read(fd,buf128,MSGSECT) != MSGSECT) /* read 128 byte sector */ { portsout(CRLF) ; portsout("Can't read in message-file!") ; portsout(CRLF) ; return(ERROR); } /* * get first piece of msg record */ /* do trial read, since if not first record, fields might overflow */ rc = sscanf(buf128,"%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~", buftmp,buftmp,buftmp,buftmp,buftmp,buftmp,buftmp,buftmp,buftmp) ; if (rc != 9) /* makes sure we read the 1st piece */ { /* of a message and not in the middle */ return(0); /* 0 when is not the msg header */ } /* now do the real read since looks like is a good record */ rc = sscanf(buf128,"%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~", this1, next1, /* points to next rcd # */ msg_delete, /* delete byte */ msg_date, msg_time, msg_to, msg_from, msg_pass, msg_subject); if (rc != 9) /* makes sure we read the 1st piece */ { /* of a message and not in the middle */ return(0); /* 0 when is not the msg header */ } if (msg_delete[0] == '9') /* check for deleted messages */ { /* if so, return as if not found */ return(0); } if (msg_delete[0] == '5') /* protected msg */ { strcpy(who_am_i,w_fname); strcat(who_am_i," "); strcat(who_am_i,w_lname); strcpy(Sysop,SYSOP); sprintf(sysop,"%-21s",Sysop); sprintf(who_am_I,"%-21s",who_am_i); t1=strcmp(who_am_I,sysop); t2=strcmp(who_am_I,msg_to); t3=strcmp(who_am_I,msg_from); if (t1 == 0 || t2 == 0 || t3 == 0 || user_priv == 32767) { goto zzzz; } return(-10); } zzzz: ret_this = atoi(this1); /* return this msg no. */ next = atoi(next1); itoa(act,msgno); strcpy(msg_no,act); msg_text[0] = '\0'; while (next) /* read until no more pieces for */ { /* this message */ if (read(fd,buf128,MSGSECT) != MSGSECT) /* read next sector */ { portsout(CRLF) ; portsout("Can't read in message-file(2)!") ; portsout(CRLF) ; return(ERROR); } strfill(bufmsg0,0,MSG1MAX); /* init bufmsg0 to all hex 00 */ rc = sscanf(buf128,"%[^~]~%[^~]~%[^~]~%[^~]~", this1, /* this rcd # */ next1, /* point to next rcd # */ msg_delete, /* delete byte */ bufmsg0); /* piece of msg */ next = atoi(next1); strcat(msg_text,bufmsg0); /* tag piece of msg to */ /* whole msg array */ } return(ret_this); /* if all ok, return the msg no. found */ } msgreadk(fd,msgno) /* read message number requested */ int fd, /* returns ERROR if msg past eof */ msgno; /* returns 0 if msg is not 1st piece */ /* of a message */ /* returns 0 if msg is deleted */ /* returns msg # if successful */ { int rc, /* return code */ msgac, cnt1, cnt2, len, next, ret_this, t1, t2, t3, file_size; char who_am_i[99], who_am_I[99], sysop[99], Sysop[99], act[11]; msgac = xtable[msgno - 1]; if (msgac > h_next) /* don't try to seek past end of file */ { return(ERROR); } if (msgac == 0) { return(ERROR); } if ((rc = seek(fd,msgac-1,0)) == ERROR) { portsout(CRLF) ; portsout("Can't seek on message-file!") ; portsout(CRLF) ; return(ERROR); /* when cant find it */ } if (read(fd,buf128,MSGSECT) != MSGSECT) /* read 128 byte sector */ { portsout(CRLF) ; portsout("Can't read in message-file!") ; portsout(CRLF) ; return(ERROR); } /* * get first piece of msg record */ /* do trial read, since if not first record, fields might overflow */ rc = sscanf(buf128,"%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~", buftmp,buftmp,buftmp,buftmp,buftmp,buftmp,buftmp,buftmp,buftmp) ; if (rc != 9) /* makes sure we read the 1st piece */ { /* of a message and not in the middle */ return(0); /* 0 when is not the msg header */ } /* now do the real read since looks like is a good record */ rc = sscanf(buf128,"%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~", this1, next1, /* points to next rcd # */ msg_delete, /* delete byte */ msg_date, msg_time, msg_to, msg_from, msg_pass, msg_subject); if (rc != 9) /* makes sure we read the 1st piece */ { /* of a message and not in the middle */ return(0); /* 0 when is not the msg header */ } if (msg_delete[0] == '9') /* check for deleted messages */ { /* if so, return as if not found */ return(0); } strcpy(who_am_i,w_fname); strcat(who_am_i," "); strcat(who_am_i,w_lname); strcpy(Sysop,SYSOP); sprintf(sysop,"%-21s",Sysop); sprintf(who_am_I,"%-21s",who_am_i); t1=strcmp(who_am_I,sysop); t2=strcmp(who_am_I,msg_to); t3=strcmp(who_am_I,msg_from); if (t1 == 0 || t2 == 0 || t3 == 0 || user_priv == 32767) { goto yyyy; } return(-10); yyyy: ret_this = atoi(this1); /* return this msg no. */ next = atoi(next1); itoa(act,msgno); strcpy(msg_no,act); msg_text[0] = '\0'; while (next) /* read until no more pieces for */ { /* this message */ if (read(fd,buf128,MSGSECT) != MSGSECT) /* read next sector */ { portsout(CRLF) ; portsout("Can't read in message-file(2)!") ; portsout(CRLF) ; return(ERROR); } strfill(bufmsg0,0,MSG1MAX); /* init bufmsg0 to all hex 00 */ rc = sscanf(buf128,"%[^~]~%[^~]~%[^~]~%[^~]~", this1, /* this rcd # */ next1, /* point to next rcd # */ msg_delete, /* delete byte */ bufmsg0); /* piece of msg */ next = atoi(next1); strcat(msg_text,bufmsg0); /* tag piece of msg to */ /* whole msg array */ } return(ret_this); /* if all ok, return the msg no. found */ } /* end of program */